[{"data":1,"prerenderedAt":1897},["ShallowReactive",2],{"/blog/tutorial-install-vs-code-on-a-cloud-provider-vm-and-set-up-remote-access":3,"navigation-en-us":1111,"banner-en-us":1538,"footer-en-us":1548,"blog-post-authors-en-us-Cesar Saavedra":1792,"blog-related-posts-en-us-tutorial-install-vs-code-on-a-cloud-provider-vm-and-set-up-remote-access":1807,"blog-promotions-en-us":1833,"next-steps-en-us":1887},{"id":4,"title":5,"authors":6,"body":8,"category":1090,"date":1091,"description":1092,"extension":1093,"externalUrl":1094,"faq":1094,"featured":1095,"heroImage":1096,"meta":1097,"navigation":1095,"path":1098,"seo":1099,"slug":1104,"stem":1105,"tags":1106,"template":1109,"updatedDate":1094,"__hash__":1110},"blogPosts/en-us/blog/tutorial-install-vs-code-on-a-cloud-provider-vm-and-set-up-remote-access.md","Tutorial: Install VS Code on a cloud provider VM and set up remote access",[7],"Cesar Saavedra",{"type":9,"value":10,"toc":1069},"minimark",[11,15,18,23,26,31,53,60,66,70,73,84,112,170,180,184,187,284,301,305,308,336,339,349,353,359,362,380,384,387,390,395,399,404,408,421,424,511,515,518,560,564,567,576,592,601,607,633,670,673,703,716,745,749,752,790,794,802,829,831,851,855,863,871,874,882,885,889,892,897,900,925,929,932,935,943,948,951,958,963,970,974,978,981,986,991,996,1001,1006,1011,1014,1019,1024,1029,1033,1036,1050,1053,1065],[12,13,14],"p",{},"DevSecOps teams can sometimes find they need to run an instance of Visual Studio Code (VS Code) remotely for team members to share when they don't have enough local resources. However, installing, running, and using VS Code on a remote virtual machine (VM) via a cloud provider can be a complex process full of pitfalls and false starts. This tutorial covers how to automate the installation of VS Code on a VM running on a cloud provider.",[12,16,17],{},"This approach involves two separate GitLab projects, each with its own pipeline. The first one uses Terraform to instantiate a virtual machine in GCP running Linux Debian. The second one installs VS Code on the newly instantiated VM. Lastly, we provide a procedure on how to set up your local Mac laptop to connect and use the VS Code instance installed on the remote VM.",[19,20,22],"h2",{"id":21},"create-a-debian-linux-distribution-vm-on-gcp","Create a Debian Linux distribution VM on GCP",[12,24,25],{},"Here are the steps to create a Debian Linux distribution VM on GCP.",[27,28,30],"h3",{"id":29},"prerequisites","Prerequisites",[32,33,34,45],"ol",{},[35,36,37,38,44],"li",{},"A GCP account. If you don't have one, please ",[39,40,43],"a",{"href":41,"rel":42},"https://cloud.google.com/free?hl=en",[],"create one",".",[35,46,47,48],{},"A GitLab account on ",[39,49,52],{"href":50,"rel":51},"https://gitlab.com/users/sign_in",[],"gitlab.com",[12,54,55,59],{},[56,57,58],"strong",{},"Note:"," This installation uses:",[61,62,63],"ul",{},[35,64,65],{},"Debian 5.10.205-2 (2023-12-31) x86_64 GNU/Linux, a.k.a Debian 11",[27,67,69],{"id":68},"create-a-service-account-and-download-its-key","Create a service account and download its key",[12,71,72],{},"Before you create the first GitLab project, you need to create a service account in GCP and then generate and download a key. You will need this key so that your GitLab pipelines can communicate to GCP and the GitLab API.",[32,74,75],{},[35,76,77,78,83],{},"To authenticate GCP with GitLab, sign in to your GCP account and create a ",[39,79,82],{"href":80,"rel":81},"https://cloud.google.com/docs/authentication#service-accounts",[],"GCP service account"," with the following roles:",[61,85,86,92,97,102,107],{},[35,87,88],{},[89,90,91],"code",{},"Compute Network Admin",[35,93,94],{},[89,95,96],{},"Compute Admin",[35,98,99],{},[89,100,101],{},"Service Account User",[35,103,104],{},[89,105,106],{},"Service Account Admin",[35,108,109],{},[89,110,111],{},"Security Admin",[32,113,115,118],{"start":114},3,[35,116,117],{},"Download the JSON file with the service account key you created in the previous step.",[35,119,120,121,124,125,128,129],{},"On your computer, encode the JSON file to ",[89,122,123],{},"base64"," (replace ",[89,126,127],{},"/path/to/sa-key.json"," to the path where your key is located):",[130,131,136],"pre",{"className":132,"code":133,"language":134,"meta":135,"style":135},"language-shell shiki shiki-themes github-light","base64 -i /path/to/sa-key.json | tr -d \\\\n\n","shell","",[89,137,138],{"__ignoreMap":135},[139,140,143,146,150,154,158,161,164,167],"span",{"class":141,"line":142},"line",1,[139,144,123],{"class":145},"s7eDp",[139,147,149],{"class":148},"sYu0t"," -i",[139,151,153],{"class":152},"sYBdl"," /path/to/sa-key.json",[139,155,157],{"class":156},"sD7c4"," |",[139,159,160],{"class":145}," tr",[139,162,163],{"class":148}," -d",[139,165,166],{"class":148}," \\\\",[139,168,169],{"class":152},"n\n",[12,171,172,175,176,179],{},[56,173,174],{},"NOTE:"," Save the output of this command. You will use it later as the value for the ",[89,177,178],{},"BASE64_GOOGLE_CREDENTIALS"," environment variable.",[27,181,183],{"id":182},"configure-your-gitlab-project","Configure your GitLab project",[12,185,186],{},"Next, you need to create and configure the first GitLab project.",[32,188,189,195,207],{},[35,190,191,192,44],{},"Create a group in your GitLab workspace and name it ",[89,193,194],{},"gcpvmlinuxvscode",[35,196,197,198],{},"Inside your newly created group, clone the following project:",[130,199,201],{"className":132,"code":200,"language":134,"meta":135,"style":135},"git@gitlab.com:tech-marketing/sandbox/gcpvmlinuxvscode/gcpvmlnxsetup.git\n",[89,202,203],{"__ignoreMap":135},[139,204,205],{"class":141,"line":142},[139,206,200],{"class":145},[35,208,209,210,213,214],{},"Drill into your newly cloned project, ",[89,211,212],{},"gcpvmlnxsetup",", and set up the following CI/CD variables to configure it:",[32,215,216,222,228,237,247,256,265,275],{},[35,217,218,219,44],{},"On the left sidebar, select ",[56,220,221],{},"Settings > CI/CD",[35,223,224,225,44],{},"Expand ",[56,226,227],{},"Variables",[35,229,230,231,233,234,236],{},"Set the variable ",[89,232,178],{}," to the ",[89,235,123],{}," encoded JSON file you created in the previous section.",[35,238,230,239,242,243,246],{},[89,240,241],{},"TF_VAR_gcp_project"," to your GCP ",[89,244,245],{},"project"," ID.",[35,248,230,249,242,252,255],{},[89,250,251],{},"TF_VAR_gcp_region",[89,253,254],{},"region"," ID, e.g. us-east1, which is also its default value.",[35,257,230,258,242,261,264],{},[89,259,260],{},"TF_VAR_gcp_zone",[89,262,263],{},"zone"," ID, e.g. us-east1-d, which is also its default value.",[35,266,230,267,270,271,274],{},[89,268,269],{},"TF_VAR_machine_type"," to the GCP ",[89,272,273],{},"machine type"," ID, e.g. e2-standard-2, which is also its default value.",[35,276,230,277,270,280,283],{},[89,278,279],{},"TF_VAR_gcp_vmname",[89,281,282],{},"vm name"," you want to give the VM, e.g. my-test-vm, which is also its default value.",[12,285,286,288,289,294,295,300],{},[56,287,58],{}," We have followed a minimalist approach to set up this VM. If you would like to customize the VM further, please refer to the ",[39,290,293],{"href":291,"rel":292},"https://registry.terraform.io/providers/hashicorp/google/latest/docs/guides/provider_reference",[],"Google Terraform provider"," and the ",[39,296,299],{"href":297,"rel":298},"https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/compute_instance",[],"Google Compute Instance Terraform provider"," documentation for additional resource options.",[27,302,304],{"id":303},"provision-your-vm","Provision your VM",[12,306,307],{},"After configuring your project, manually trigger the provisioning of your VM as follows:",[32,309,310,316,329],{},[35,311,312,313,44],{},"On the left sidebar, go to ",[56,314,315],{},"Build > Pipelines",[35,317,318,319,322,323,325,326,328],{},"Next to ",[56,320,321],{},"Play"," (",[56,324],{"play":135},"), select the dropdown list icon (",[56,327],{"chevron-lg-down":135},").",[35,330,331,332,335],{},"Select ",[56,333,334],{},"Deploy"," to manually trigger the deployment job.",[12,337,338],{},"When the pipeline finishes successfully, you can see your new VM on GCP:",[61,340,341],{},[35,342,343,344,44],{},"Check it on your ",[39,345,348],{"href":346,"rel":347},"https://console.cloud.google.com/compute/instances",[],"GCP console's VM instances list",[27,350,352],{"id":351},"remove-the-vm","Remove the VM",[12,354,355,358],{},[56,356,357],{},"Important note:"," Only run the cleanup job when you no longer need the GCP VM and/or the VS Code that you installed in it.",[12,360,361],{},"A manual cleanup job is included in your pipeline by default. To remove all created resources:",[32,363,364,369],{},[35,365,218,366,368],{},[56,367,315],{}," and select the most recent pipeline.",[35,370,371,372,375,376,322,378,328],{},"For the ",[89,373,374],{},"destroy"," job, select ",[56,377,321],{},[56,379],{"play":135},[19,381,383],{"id":382},"install-and-set-up-vs-code-on-a-gcp-vm","Install and set up VS Code on a GCP VM",[12,385,386],{},"Perform the steps in this section only after you have successfully finished the previous sections above. In this section, you will create the second GitLab project that will install VS Code and its dependencies on the running VM on GCP.",[27,388,30],{"id":389},"prerequisites-1",[32,391,392],{},[35,393,394],{},"A provisioned GCP VM. We covered this in the previous sections.",[12,396,397,59],{},[56,398,58],{},[61,400,401],{},[35,402,403],{},"VS Code Version 1.85.2",[27,405,407],{"id":406},"configure-your-project","Configure your project",[12,409,410,412,413,416,417,420],{},[56,411,58],{}," Since you will be using the ",[89,414,415],{},"ssh"," command multiple times on your laptop, we strongly suggest that you make a backup copy of your laptop local directory ",[89,418,419],{},"$HOME/.ssh"," before continuing.",[12,422,423],{},"Next, you need to create and configure the second GitLab project.",[32,425,426,432,447],{},[35,427,428,429,431],{},"Head over to your GitLab group ",[89,430,194],{},", which you created at the beginning of this post.",[35,433,434,435,437,438],{},"Inside group, ",[89,436,194],{},", clone the following project:",[130,439,441],{"className":132,"code":440,"language":134,"meta":135,"style":135},"git@gitlab.com:tech-marketing/sandbox/gcpvmlinuxvscode/vscvmsetup.git\n",[89,442,443],{"__ignoreMap":135},[139,444,445],{"class":141,"line":142},[139,446,440],{"class":145},[35,448,209,449,452,453],{},[89,450,451],{},"vscvmsetup"," and set up the following CI/CD variables to configure it:",[32,454,455,459,463,476,483,491,499,505],{},[35,456,218,457,44],{},[56,458,221],{},[35,460,224,461,44],{},[56,462,227],{},[35,464,230,465,233,467,469,470,473,474,44],{},[89,466,178],{},[89,468,123],{}," encoded JSON file you created in project ",[89,471,472],{},"gcpvmlnxvsc",". You can copy this value from the variable with the same name in project ",[89,475,472],{},[35,477,230,478,242,481,246],{},[89,479,480],{},"gcp_project",[89,482,245],{},[35,484,230,485,242,488,490],{},[89,486,487],{},"gcp_vmname",[89,489,254],{}," ID, e.g. us-east1.",[35,492,230,493,242,496,498],{},[89,494,495],{},"gcp_zone",[89,497,263],{}," ID, e.g. us-east1-d.",[35,500,230,501,504],{},[89,502,503],{},"vm_pwd"," to the password that you will use to ssh to the VM.",[35,506,230,507,510],{},[89,508,509],{},"gcp_vm_username"," to the first portion (before the \"@\" sign) of the email associated to your GCP account, which should be your GitLab email.",[27,512,514],{"id":513},"run-the-project-pipeline","Run the project pipeline",[12,516,517],{},"After configuring the second GitLab project, manually trigger the provisioning of VS Code and its dependencies to the GCP VM as follows:",[32,519,520,557],{},[35,521,218,522,524,525,528,529,44,532,535,536],{},[56,523,315],{}," and click on the button ",[56,526,527],{},"Run Pipeline",". On the next screen, click on the button ",[56,530,531],{},"Run pipeline",[533,534],"br",{},"The pipeline will:",[61,537,538,545,551],{},[35,539,540,541,544],{},"install ",[89,542,543],{},"xauth"," on the virtual machine. This is needed for effective X11 communication between your local desktop and the VM",[35,546,540,547,550],{},[89,548,549],{},"git"," on the VM",[35,552,540,553,556],{},[89,554,555],{},"Visual Studio Code"," on the VM.",[35,558,559],{},"At this point, you can wait until the pipeline successfully completes. If you don't want to wait, you can continue to do the first step of the next section. However, you must ensure the pipeline has successfully completed before you can perform Step 2 of the next section.",[27,561,563],{"id":562},"connect-to-your-vm-from-your-local-mac-laptop","Connect to your VM from your local Mac laptop",[12,565,566],{},"Now that you have an instance of VS Code running on a Linux VM on GCP, you need to configure your Mac laptop to be able to act as a client to the remote VM. Follow these steps:",[32,568,569],{},[35,570,571,572,575],{},"To connect to the remote VS Code from your Mac, you must first install ",[89,573,574],{},"XQuartz"," on your Mac. You can execute the following command on your Mac to install it:",[130,577,579],{"className":132,"code":578,"language":134,"meta":135,"style":135},"brew install xquartz\n",[89,580,581],{"__ignoreMap":135},[139,582,583,586,589],{"class":141,"line":142},[139,584,585],{"class":145},"brew",[139,587,588],{"class":152}," install",[139,590,591],{"class":152}," xquartz\n",[12,593,594,595,600],{},"Or, you can follow the instructions from the following ",[39,596,599],{"href":597,"rel":598},"https://und.edu/research/computational-research-center/tutorials/mac-x11.html",[],"tutorial"," from the University of North Dakota.",[12,602,603,604,606],{},"After the pipeline for project ",[89,605,451],{}," successfully executes to completion (pipeline you manually executed in the previous section), you can connect to the remote VS Code as follows:",[32,608,610,627],{"start":609},2,[35,611,612,613,615,616,619,620,623,624,626],{},"Launch ",[89,614,574],{}," on your Mac (it should be located in your Applications folder). Its launching should open up an ",[89,617,618],{},"xterm"," on your Mac. If it does not, then you can select ",[56,621,622],{},"Applications > Terminal"," from the ",[89,625,574],{}," top menu.",[35,628,629,630,632],{},"On the ",[89,631,618],{},", enter the following command:",[130,634,636],{"className":132,"code":635,"language":134,"meta":135,"style":135},"gcloud compute ssh --zone \"[GCP zone]\" \"[name of your VM]\" --project \"[GCP project]\" --ssh-flag=\"-Y\"\n",[89,637,638],{"__ignoreMap":135},[139,639,640,643,646,649,652,655,658,661,664,667],{"class":141,"line":142},[139,641,642],{"class":145},"gcloud",[139,644,645],{"class":152}," compute",[139,647,648],{"class":152}," ssh",[139,650,651],{"class":148}," --zone",[139,653,654],{"class":152}," \"[GCP zone]\"",[139,656,657],{"class":152}," \"[name of your VM]\"",[139,659,660],{"class":148}," --project",[139,662,663],{"class":152}," \"[GCP project]\"",[139,665,666],{"class":148}," --ssh-flag=",[139,668,669],{"class":152},"\"-Y\"\n",[12,671,672],{},"Where:",[61,674,675,687,695],{},[35,676,677,680,681,683,684,686],{},[89,678,679],{},"[VM name]"," is the name of the VM you created in project ",[89,682,472],{},". Its value should be the same as the ",[89,685,480],{}," variable.",[35,688,689,692,693,686],{},[89,690,691],{},"[GCP zone]"," is the zone where the VM is running. Its value should be the same as the ",[89,694,487],{},[35,696,697,700,701,686],{},[89,698,699],{},"[GCP project]"," is the name of your GCP project assigned name. Its value should be the same as the ",[89,702,480],{},[12,704,705],{},[706,707,708],"em",{},[56,709,710,711,44],{},"Note: If you have not installed the Google Cloud CLI, please do so by following the ",[39,712,715],{"href":713,"rel":714},"https://cloud.google.com/sdk/docs/install",[],"Google documentation",[32,717,719,733,739,742],{"start":718},4,[35,720,721,722,725,726,729,730,44],{},"If you have not used SSH on your Mac before, you may not have a ",[89,723,724],{},".ssh"," in your ",[89,727,728],{},"HOME"," directory. If this is the case, you will be asked if you would like to continue with the creation of this directory. Answer ",[56,731,732],{},"Y",[35,734,735,736,738],{},"Next, you will be asked to enter the same password twice to generate a public/private key. Enter the same password you used when defining the variable ",[89,737,503],{}," in the required configuration above.",[35,740,741],{},"Once the SSH key is done propagating, you will need to enter the password again two times to log in to the VM.",[35,743,744],{},"You should now be logged in to the VM.",[27,746,748],{"id":747},"create-a-personal-access-token","Create a personal access token",[12,750,751],{},"The assumption here is that you already have a GitLab project that you would want to open from and work on the remote VS Code. To do this, you will need to clone your GitLab project from the VM. First, you will be using a personal access token (PAT) to clone your project.",[32,753,754,757,787],{},[35,755,756],{},"Head over to your GitLab project (the one that you'd like to open from the remote VS Code).",[35,758,759,760,765,766,769,770,773,774,773,777,773,780,783,784],{},"From your GitLab project, create a ",[39,761,764],{"href":762,"rel":763},"https://docs.gitlab.com/user/profile/personal_access_tokens/#create-a-personal-access-token",[],"PAT",", name it ",[89,767,768],{},"pat-gcpvm"," and ensure that it has the following scopes: ",[89,771,772],{},"read_repository",", ",[89,775,776],{},"write_repository",[89,778,779],{},"read_registry",[89,781,782],{},"write_registry",", and ",[89,785,786],{},"ai_features",[35,788,789],{},"Save the generated PAT somewhere safe; you will need it later.",[27,791,793],{"id":792},"clone-the-read_repository","Clone the read_repository",[32,795,796],{},[35,797,798,799,801],{},"On your local Mac, from the ",[89,800,618],{}," where you are logged on to the remote VM, enter the following command:",[130,803,805],{"className":132,"code":804,"language":134,"meta":135,"style":135},"git clone https://[your GitLab username]:[personal_access_token]@gitlab.com/[GitLab project name].git \n",[89,806,807],{"__ignoreMap":135},[139,808,809,811,814,817,820,823,826],{"class":141,"line":142},[139,810,549],{"class":145},[139,812,813],{"class":152}," clone",[139,815,816],{"class":152}," https://[your",[139,818,819],{"class":152}," GitLab",[139,821,822],{"class":152}," username]:[personal_access_token]@gitlab.com/[GitLab",[139,824,825],{"class":152}," project",[139,827,828],{"class":152}," name].git\n",[12,830,672],{},[61,832,833,839,845],{},[35,834,835,838],{},[89,836,837],{},"[your GitLab username]"," is your GitLab handle.",[35,840,841,844],{},[89,842,843],{},"[personal_access_token]"," is the PAT you created in the previous section.",[35,846,847,850],{},[89,848,849],{},"[GitLab project name]"," is the name of the project that contains the GitLab Code Suggestions test cases.",[19,852,854],{"id":853},"launch-visual-studio-code","Launch Visual Studio Code",[32,856,857],{},[35,858,859,860,862],{},"From the ",[89,861,618],{}," where you are logged in to the VM, enter the following command:",[130,864,869],{"className":865,"code":867,"language":868,"meta":135},[866],"language-text","code\n","text",[89,870,867],{"__ignoreMap":135},[12,872,873],{},"Wait for a few seconds and Visual Studio Code will appear on your Mac screen.",[32,875,876,879],{"start":609},[35,877,878],{},"From the VS Code menu, select **File > Open Folder...\"",[35,880,881],{},"In the File chooser, select the top-level directory of the GitLab project you cloned in the previous section",[12,883,884],{},"That's it! You're ready to start working on your cloned GitLab project using the VS Code that you installed on a remote Linux-based VM.",[27,886,888],{"id":887},"troubleshooting","Troubleshooting",[12,890,891],{},"While using the remotely installed VS Code from your local Mac, you may encounter a few issues. In this section, we provide guidance on how to mitigate them.",[893,894,896],"h4",{"id":895},"keyboard-keys-not-mapped-correctly","Keyboard keys not mapped correctly",[12,898,899],{},"If, while running VS Code, you are having issues with your keyboard keys not being mapped correctly, e.g. letter e is backspace, letter r is tab, letter s is clear line, etc., do the following:",[32,901,902,908,911,914,917],{},[35,903,904,905,44],{},"In VS Code, select ",[56,906,907],{},"File > Preferences > Settings",[35,909,910],{},"Search for \"keyboard\". If having issues with the letter e, then search for \"board\". Click on the \"Keyboard\" entry under \"Application.\"",[35,912,913],{},"Ensure that the Keyboard Dispatch is set to \"keyCode.\"",[35,915,916],{},"Restart VS Code.",[35,918,919,920,44],{},"If you need further help, this is a good resource for ",[39,921,924],{"href":922,"rel":923},"https://github.com/microsoft/vscode/wiki/Keybinding-Issues#troubleshoot-linux-keybindings",[],"keyboard problems",[893,926,928],{"id":927},"error-loading-webview-error","Error loading webview: Error",[12,930,931],{},"If while running VS Code, you get a message saying:",[12,933,934],{},"\"Error loading webview: Error: Could not register service worker: InvalidStateError: Failed to register a ServiceWorker: The document is in an invalid state.\"",[32,936,937],{},[35,938,939,940,942],{},"Exit VS Code and then enter this cmd from the ",[89,941,618],{}," window:",[12,944,945],{},[89,946,947],{},"killall code",[12,949,950],{},"You may need to execute this command two or three times in a row to kill all VS Code processes.",[32,952,953],{"start":609},[35,954,955,956,942],{},"Ensure that all VS Code-related processes are gone by entering the following command from the ",[89,957,618],{},[12,959,960],{},[89,961,962],{},"ps -ef | grep code",[32,964,965],{"start":114},[35,966,967,968,942],{},"Once all the VS Code-related processes are gone, restart VS Code by entering the following command from the ",[89,969,618],{},[12,971,972],{},[89,973,89],{},[893,975,977],{"id":976},"some-useful-commands-to-debug-ssh","Some useful commands to debug SSH",[12,979,980],{},"Here are some useful commands to run on the VM that can help you debug SSH issues:",[32,982,983],{},[35,984,985],{},"To get the status, location and latest event of sshd:",[12,987,988],{},[89,989,990],{},"sudo systemctl status ssh",[32,992,993],{"start":609},[35,994,995],{},"To see the log of sshd:",[12,997,998],{},[89,999,1000],{},"journalctl -b -a -u ssh",[32,1002,1003],{"start":114},[35,1004,1005],{},"To restart to SSH daemon:",[12,1007,1008],{},[89,1009,1010],{},"sudo systemctl restart ssh.service",[12,1012,1013],{},"Or",[12,1015,1016],{},[89,1017,1018],{},"sudo systemctl restart ssh",[32,1020,1021],{"start":718},[35,1022,1023],{},"To start a root shell:",[12,1025,1026],{},[89,1027,1028],{},"sudo -s",[19,1030,1032],{"id":1031},"get-started","Get started",[12,1034,1035],{},"This article described how to:",[61,1037,1038,1041,1044,1047],{},[35,1039,1040],{},"instantiate a Linux-based VM on GCP",[35,1042,1043],{},"install VS Code and dependencies on the remote VM",[35,1045,1046],{},"clone an existing GitLab project of yours in the remote VM",[35,1048,1049],{},"open your remotely cloned project from the remotely installed VS Code",[12,1051,1052],{},"As a result, you can basically use your laptop as a thin client that accesses a remote server, where all the work takes place.",[1054,1055,1056],"blockquote",{},[12,1057,1058,1059,1064],{},"The automation to get all these parts in place was done by GitLab. Sign up for a ",[39,1060,1063],{"href":1061,"rel":1062},"https://about.gitlab.com/free-trial/",[],"free GitLab Ultimate trial"," to get started today!",[1066,1067,1068],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":135,"searchDepth":609,"depth":609,"links":1070},[1071,1078,1086,1089],{"id":21,"depth":609,"text":22,"children":1072},[1073,1074,1075,1076,1077],{"id":29,"depth":114,"text":30},{"id":68,"depth":114,"text":69},{"id":182,"depth":114,"text":183},{"id":303,"depth":114,"text":304},{"id":351,"depth":114,"text":352},{"id":382,"depth":609,"text":383,"children":1079},[1080,1081,1082,1083,1084,1085],{"id":389,"depth":114,"text":30},{"id":406,"depth":114,"text":407},{"id":513,"depth":114,"text":514},{"id":562,"depth":114,"text":563},{"id":747,"depth":114,"text":748},{"id":792,"depth":114,"text":793},{"id":853,"depth":609,"text":854,"children":1087},[1088],{"id":887,"depth":114,"text":888},{"id":1031,"depth":609,"text":1032},"engineering","2024-05-06","Learn how to automate the installation of VS Code on a VM running on a cloud provider and how to access it from your local laptop.","md",null,true,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749670563/Blog/Hero%20Images/cloudcomputing.jpg",{},"/en-us/blog/tutorial-install-vs-code-on-a-cloud-provider-vm-and-set-up-remote-access",{"title":5,"description":1092,"ogTitle":5,"ogDescription":1092,"noIndex":1100,"ogImage":1096,"ogUrl":1101,"ogSiteName":1102,"ogType":1103,"canonicalUrls":1101},false,"https://about.gitlab.com/blog/tutorial-install-vs-code-on-a-cloud-provider-vm-and-set-up-remote-access","https://about.gitlab.com","article","tutorial-install-vs-code-on-a-cloud-provider-vm-and-set-up-remote-access","en-us/blog/tutorial-install-vs-code-on-a-cloud-provider-vm-and-set-up-remote-access",[1107,599,1108],"cloud native","open source","BlogPost","r4LC8ZHGJ8v9aJfK2LgV5qY53S2ZuDzQd2qxQ5BAg6M",{"logo":1112,"freeTrial":1117,"sales":1122,"login":1127,"items":1132,"search":1459,"minimal":1489,"duo":1508,"switchNav":1517,"pricingDeployment":1528},{"config":1113},{"href":1114,"dataGaName":1115,"dataGaLocation":1116},"/","gitlab logo","header",{"text":1118,"config":1119},"Get free trial",{"href":1120,"dataGaName":1121,"dataGaLocation":1116},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":1123,"config":1124},"Request a demo",{"href":1125,"dataGaName":1126,"dataGaLocation":1116},"/sales/?contact-topic=request-demo","sales",{"text":1128,"config":1129},"Sign in",{"href":1130,"dataGaName":1131,"dataGaLocation":1116},"https://gitlab.com/users/sign_in/","sign in",[1133,1162,1262,1267,1381,1437],{"text":1134,"config":1135,"menu":1137},"Platform",{"dataNavLevelOne":1136},"platform",{"type":1138,"columns":1139},"cards",[1140,1146,1154],{"title":1134,"description":1141,"link":1142},"The intelligent orchestration platform for DevSecOps",{"text":1143,"config":1144},"Explore our Platform",{"href":1145,"dataGaName":1136,"dataGaLocation":1116},"/platform/",{"title":1147,"description":1148,"link":1149},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":1150,"config":1151},"Meet GitLab Duo",{"href":1152,"dataGaName":1153,"dataGaLocation":1116},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1155,"description":1156,"link":1157},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":1158,"config":1159},"Learn more",{"href":1160,"dataGaName":1161,"dataGaLocation":1116},"/why-gitlab/","why gitlab",{"text":1163,"left":1095,"config":1164,"menu":1166},"Product",{"dataNavLevelOne":1165},"solutions",{"type":1167,"link":1168,"columns":1172,"feature":1241},"lists",{"text":1169,"config":1170},"View all Solutions",{"href":1171,"dataGaName":1165,"dataGaLocation":1116},"/solutions/",[1173,1197,1220],{"title":1174,"description":1175,"link":1176,"items":1181},"Automation","CI/CD and automation to accelerate deployment",{"config":1177},{"icon":1178,"href":1179,"dataGaName":1180,"dataGaLocation":1116},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[1182,1186,1189,1193],{"text":1183,"config":1184},"CI/CD",{"href":1185,"dataGaLocation":1116,"dataGaName":1183},"/solutions/continuous-integration/",{"text":1147,"config":1187},{"href":1152,"dataGaLocation":1116,"dataGaName":1188},"gitlab duo agent platform - product menu",{"text":1190,"config":1191},"Source Code Management",{"href":1192,"dataGaLocation":1116,"dataGaName":1190},"/solutions/source-code-management/",{"text":1194,"config":1195},"Automated Software Delivery",{"href":1179,"dataGaLocation":1116,"dataGaName":1196},"Automated software delivery",{"title":1198,"description":1199,"link":1200,"items":1205},"Security","Deliver code faster without compromising security",{"config":1201},{"href":1202,"dataGaName":1203,"dataGaLocation":1116,"icon":1204},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1206,1210,1215],{"text":1207,"config":1208},"Application Security Testing",{"href":1202,"dataGaName":1209,"dataGaLocation":1116},"Application security testing",{"text":1211,"config":1212},"Software Supply Chain Security",{"href":1213,"dataGaLocation":1116,"dataGaName":1214},"/solutions/supply-chain/","Software supply chain security",{"text":1216,"config":1217},"Software Compliance",{"href":1218,"dataGaName":1219,"dataGaLocation":1116},"/solutions/software-compliance/","software compliance",{"title":1221,"link":1222,"items":1227},"Measurement",{"config":1223},{"icon":1224,"href":1225,"dataGaName":1226,"dataGaLocation":1116},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[1228,1232,1236],{"text":1229,"config":1230},"Visibility & Measurement",{"href":1225,"dataGaLocation":1116,"dataGaName":1231},"Visibility and Measurement",{"text":1233,"config":1234},"Value Stream Management",{"href":1235,"dataGaLocation":1116,"dataGaName":1233},"/solutions/value-stream-management/",{"text":1237,"config":1238},"Analytics & Insights",{"href":1239,"dataGaLocation":1116,"dataGaName":1240},"/solutions/analytics-and-insights/","Analytics and insights",{"title":1242,"type":1167,"items":1243},"GitLab for",[1244,1250,1256],{"text":1245,"config":1246},"Enterprise",{"icon":1247,"href":1248,"dataGaLocation":1116,"dataGaName":1249},"Building","/enterprise/","enterprise",{"text":1251,"config":1252},"Small Business",{"icon":1253,"href":1254,"dataGaLocation":1116,"dataGaName":1255},"Work","/small-business/","small business",{"text":1257,"config":1258},"Public Sector",{"icon":1259,"href":1260,"dataGaLocation":1116,"dataGaName":1261},"Organization","/solutions/public-sector/","public sector",{"text":1263,"config":1264},"Pricing",{"href":1265,"dataGaName":1266,"dataGaLocation":1116,"dataNavLevelOne":1266},"/pricing/","pricing",{"text":1268,"config":1269,"menu":1271},"Resources",{"dataNavLevelOne":1270},"resources",{"type":1167,"link":1272,"columns":1276,"feature":1370},{"text":1273,"config":1274},"View all resources",{"href":1275,"dataGaName":1270,"dataGaLocation":1116},"/resources/",[1277,1310,1337],{"title":1278,"items":1279},"Getting started",[1280,1285,1290,1295,1300,1305],{"text":1281,"config":1282},"Install",{"href":1283,"dataGaName":1284,"dataGaLocation":1116},"/install/","install",{"text":1286,"config":1287},"Quick start guides",{"href":1288,"dataGaName":1289,"dataGaLocation":1116},"/get-started/","quick setup checklists",{"text":1291,"config":1292},"Learn",{"href":1293,"dataGaLocation":1116,"dataGaName":1294},"https://university.gitlab.com/","learn",{"text":1296,"config":1297},"Product documentation",{"href":1298,"dataGaName":1299,"dataGaLocation":1116},"https://docs.gitlab.com/","product documentation",{"text":1301,"config":1302},"Best practice videos",{"href":1303,"dataGaName":1304,"dataGaLocation":1116},"/getting-started-videos/","best practice videos",{"text":1306,"config":1307},"Integrations",{"href":1308,"dataGaName":1309,"dataGaLocation":1116},"/integrations/","integrations",{"title":1311,"items":1312},"Discover",[1313,1318,1323,1328,1332],{"text":1314,"config":1315},"Customer success stories",{"href":1316,"dataGaName":1317,"dataGaLocation":1116},"/customers/","customer success stories",{"text":1319,"config":1320},"Blog",{"href":1321,"dataGaName":1322,"dataGaLocation":1116},"/blog/","blog",{"text":1324,"config":1325},"Demo Hub",{"href":1326,"dataGaName":1327,"dataGaLocation":1116},"/demo-hub/","demo hub",{"text":1329,"config":1330},"The Source",{"href":1331,"dataGaName":1322,"dataGaLocation":1116},"/the-source/",{"text":1333,"config":1334},"Remote",{"href":1335,"dataGaName":1336,"dataGaLocation":1116},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1338,"items":1339},"Connect",[1340,1345,1350,1355,1360,1365],{"text":1341,"config":1342},"GitLab Services",{"href":1343,"dataGaName":1344,"dataGaLocation":1116},"/services/","services",{"text":1346,"config":1347},"Contribute",{"href":1348,"dataGaName":1349,"dataGaLocation":1116},"https://contributors.gitlab.com","contribute",{"text":1351,"config":1352},"Community",{"href":1353,"dataGaName":1354,"dataGaLocation":1116},"/community/","community",{"text":1356,"config":1357},"Forum",{"href":1358,"dataGaName":1359,"dataGaLocation":1116},"https://forum.gitlab.com/","forum",{"text":1361,"config":1362},"Events",{"href":1363,"dataGaName":1364,"dataGaLocation":1116},"/events/","events",{"text":1366,"config":1367},"Partners",{"href":1368,"dataGaName":1369,"dataGaLocation":1116},"/partners/","partners",{"config":1371,"title":1374,"text":1375,"link":1376},{"background":1372,"textColor":1373},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","What’s new in GitLab","Stay updated with our latest features and improvements.",{"text":1377,"config":1378},"Read the latest",{"href":1379,"dataGaName":1380,"dataGaLocation":1116},"/whats-new/","whats new",{"text":1382,"config":1383,"menu":1385},"Company",{"dataNavLevelOne":1384},"company",{"type":1167,"columns":1386},[1387],{"items":1388},[1389,1394,1400,1402,1407,1412,1417,1422,1427,1432],{"text":1390,"config":1391},"About",{"href":1392,"dataGaName":1393,"dataGaLocation":1116},"/company/","about",{"text":1395,"config":1396,"footerGa":1399},"Jobs",{"href":1397,"dataGaName":1398,"dataGaLocation":1116},"/jobs/","jobs",{"dataGaName":1398},{"text":1361,"config":1401},{"href":1363,"dataGaName":1364,"dataGaLocation":1116},{"text":1403,"config":1404},"Leadership",{"href":1405,"dataGaName":1406,"dataGaLocation":1116},"/company/team/e-group/","leadership",{"text":1408,"config":1409},"Handbook",{"href":1410,"dataGaName":1411,"dataGaLocation":1116},"https://handbook.gitlab.com/","handbook",{"text":1413,"config":1414},"Investor relations",{"href":1415,"dataGaName":1416,"dataGaLocation":1116},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1418,"config":1419},"Trust Center",{"href":1420,"dataGaName":1421,"dataGaLocation":1116},"/security/","trust center",{"text":1423,"config":1424},"AI Transparency Center",{"href":1425,"dataGaName":1426,"dataGaLocation":1116},"/ai-transparency-center/","ai transparency center",{"text":1428,"config":1429},"Newsletter",{"href":1430,"dataGaName":1431,"dataGaLocation":1116},"/company/contact/#contact-forms","newsletter",{"text":1433,"config":1434},"Press",{"href":1435,"dataGaName":1436,"dataGaLocation":1116},"/press/","press",{"text":1438,"config":1439,"menu":1440},"Contact us",{"dataNavLevelOne":1384},{"type":1167,"columns":1441},[1442],{"items":1443},[1444,1449,1454],{"text":1445,"config":1446},"Talk to sales",{"href":1447,"dataGaName":1448,"dataGaLocation":1116},"/sales/","talk to sales",{"text":1450,"config":1451},"Support portal",{"href":1452,"dataGaName":1453,"dataGaLocation":1116},"https://support.gitlab.com/hc/en-us","support portal",{"text":1455,"config":1456},"Customer portal",{"href":1457,"dataGaName":1458,"dataGaLocation":1116},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1460,"login":1461,"suggestions":1467},"Close",{"text":1462,"link":1463},"To search repositories and projects, login to",{"text":52,"config":1464},{"href":1130,"dataGaName":1465,"dataGaLocation":1466},"search login","search",{"text":1468,"default":1469},"Suggestions",[1470,1472,1476,1478,1482,1486],{"text":1147,"config":1471},{"href":1152,"dataGaName":1147,"dataGaLocation":1466},{"text":1473,"config":1474},"Code Suggestions (AI)",{"href":1475,"dataGaName":1473,"dataGaLocation":1466},"/solutions/code-suggestions/",{"text":1183,"config":1477},{"href":1185,"dataGaName":1183,"dataGaLocation":1466},{"text":1479,"config":1480},"GitLab on AWS",{"href":1481,"dataGaName":1479,"dataGaLocation":1466},"/partners/technology-partners/aws/",{"text":1483,"config":1484},"GitLab on Google Cloud",{"href":1485,"dataGaName":1483,"dataGaLocation":1466},"/partners/technology-partners/google-cloud-platform/",{"text":1487,"config":1488},"Why GitLab?",{"href":1160,"dataGaName":1487,"dataGaLocation":1466},{"freeTrial":1490,"mobileIcon":1495,"desktopIcon":1500,"secondaryButton":1503},{"text":1491,"config":1492},"Start free trial",{"href":1493,"dataGaName":1121,"dataGaLocation":1494},"https://gitlab.com/-/trials/new/","nav",{"altText":1496,"config":1497},"Gitlab Icon",{"src":1498,"dataGaName":1499,"dataGaLocation":1494},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1496,"config":1501},{"src":1502,"dataGaName":1499,"dataGaLocation":1494},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1504,"config":1505},"Get Started",{"href":1506,"dataGaName":1507,"dataGaLocation":1494},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1509,"mobileIcon":1513,"desktopIcon":1515},{"text":1510,"config":1511},"Learn more about GitLab Duo",{"href":1152,"dataGaName":1512,"dataGaLocation":1494},"gitlab duo",{"altText":1496,"config":1514},{"src":1498,"dataGaName":1499,"dataGaLocation":1494},{"altText":1496,"config":1516},{"src":1502,"dataGaName":1499,"dataGaLocation":1494},{"button":1518,"mobileIcon":1523,"desktopIcon":1525},{"text":1519,"config":1520},"/switch",{"href":1521,"dataGaName":1522,"dataGaLocation":1494},"#contact","switch",{"altText":1496,"config":1524},{"src":1498,"dataGaName":1499,"dataGaLocation":1494},{"altText":1496,"config":1526},{"src":1527,"dataGaName":1499,"dataGaLocation":1494},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1529,"mobileIcon":1534,"desktopIcon":1536},{"text":1530,"config":1531},"Back to pricing",{"href":1265,"dataGaName":1532,"dataGaLocation":1494,"icon":1533},"back to pricing","GoBack",{"altText":1496,"config":1535},{"src":1498,"dataGaName":1499,"dataGaLocation":1494},{"altText":1496,"config":1537},{"src":1502,"dataGaName":1499,"dataGaLocation":1494},{"title":1539,"titleMobile":1540,"button":1541,"config":1546},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":1158,"config":1542},{"href":1543,"dataGaName":1544,"dataGaLocation":1545},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1547,"disabled":1100},"release",{"data":1549},{"text":1550,"source":1551,"edit":1557,"contribute":1562,"config":1567,"items":1572,"minimal":1781},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1552,"config":1553},"View page source",{"href":1554,"dataGaName":1555,"dataGaLocation":1556},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1558,"config":1559},"Edit this page",{"href":1560,"dataGaName":1561,"dataGaLocation":1556},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1563,"config":1564},"Please contribute",{"href":1565,"dataGaName":1566,"dataGaLocation":1556},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1568,"facebook":1569,"youtube":1570,"linkedin":1571},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1573,1620,1673,1717,1749],{"title":1263,"links":1574,"subMenu":1589},[1575,1579,1584],{"text":1576,"config":1577},"View plans",{"href":1265,"dataGaName":1578,"dataGaLocation":1556},"view plans",{"text":1580,"config":1581},"Why Premium?",{"href":1582,"dataGaName":1583,"dataGaLocation":1556},"/pricing/premium/","why premium",{"text":1585,"config":1586},"Why Ultimate?",{"href":1587,"dataGaName":1588,"dataGaLocation":1556},"/pricing/ultimate/","why ultimate",[1590],{"title":1591,"links":1592},"Contact Us",[1593,1596,1598,1600,1605,1610,1615],{"text":1594,"config":1595},"Contact sales",{"href":1447,"dataGaName":1126,"dataGaLocation":1556},{"text":1450,"config":1597},{"href":1452,"dataGaName":1453,"dataGaLocation":1556},{"text":1455,"config":1599},{"href":1457,"dataGaName":1458,"dataGaLocation":1556},{"text":1601,"config":1602},"Status",{"href":1603,"dataGaName":1604,"dataGaLocation":1556},"https://status.gitlab.com/","status",{"text":1606,"config":1607},"Terms of use",{"href":1608,"dataGaName":1609,"dataGaLocation":1556},"/terms/","terms of use",{"text":1611,"config":1612},"Privacy statement",{"href":1613,"dataGaName":1614,"dataGaLocation":1556},"/privacy/","privacy statement",{"text":1616,"config":1617},"Cookie preferences",{"dataGaName":1618,"dataGaLocation":1556,"id":1619,"isOneTrustButton":1095},"cookie preferences","ot-sdk-btn",{"title":1163,"links":1621,"subMenu":1630},[1622,1626],{"text":1623,"config":1624},"DevSecOps platform",{"href":1145,"dataGaName":1625,"dataGaLocation":1556},"devsecops platform",{"text":1627,"config":1628},"AI-Assisted Development",{"href":1152,"dataGaName":1629,"dataGaLocation":1556},"ai-assisted development",[1631],{"title":1632,"links":1633},"Topics",[1634,1639,1644,1649,1654,1659,1663,1668],{"text":1635,"config":1636},"CICD",{"href":1637,"dataGaName":1638,"dataGaLocation":1556},"/topics/ci-cd/","cicd",{"text":1640,"config":1641},"GitOps",{"href":1642,"dataGaName":1643,"dataGaLocation":1556},"/topics/gitops/","gitops",{"text":1645,"config":1646},"DevOps",{"href":1647,"dataGaName":1648,"dataGaLocation":1556},"/topics/devops/","devops",{"text":1650,"config":1651},"Version Control",{"href":1652,"dataGaName":1653,"dataGaLocation":1556},"/topics/version-control/","version control",{"text":1655,"config":1656},"DevSecOps",{"href":1657,"dataGaName":1658,"dataGaLocation":1556},"/topics/devsecops/","devsecops",{"text":1660,"config":1661},"Cloud Native",{"href":1662,"dataGaName":1107,"dataGaLocation":1556},"/topics/cloud-native/",{"text":1664,"config":1665},"AI for Coding",{"href":1666,"dataGaName":1667,"dataGaLocation":1556},"/topics/devops/ai-for-coding/","ai for coding",{"text":1669,"config":1670},"Agentic AI",{"href":1671,"dataGaName":1672,"dataGaLocation":1556},"/topics/agentic-ai/","agentic ai",{"title":1674,"links":1675},"Solutions",[1676,1678,1680,1685,1689,1692,1696,1699,1701,1704,1707,1712],{"text":1207,"config":1677},{"href":1202,"dataGaName":1207,"dataGaLocation":1556},{"text":1196,"config":1679},{"href":1179,"dataGaName":1180,"dataGaLocation":1556},{"text":1681,"config":1682},"Agile development",{"href":1683,"dataGaName":1684,"dataGaLocation":1556},"/solutions/agile-delivery/","agile delivery",{"text":1686,"config":1687},"SCM",{"href":1192,"dataGaName":1688,"dataGaLocation":1556},"source code management",{"text":1635,"config":1690},{"href":1185,"dataGaName":1691,"dataGaLocation":1556},"continuous integration & delivery",{"text":1693,"config":1694},"Value stream management",{"href":1235,"dataGaName":1695,"dataGaLocation":1556},"value stream management",{"text":1640,"config":1697},{"href":1698,"dataGaName":1643,"dataGaLocation":1556},"/solutions/gitops/",{"text":1245,"config":1700},{"href":1248,"dataGaName":1249,"dataGaLocation":1556},{"text":1702,"config":1703},"Small business",{"href":1254,"dataGaName":1255,"dataGaLocation":1556},{"text":1705,"config":1706},"Public sector",{"href":1260,"dataGaName":1261,"dataGaLocation":1556},{"text":1708,"config":1709},"Education",{"href":1710,"dataGaName":1711,"dataGaLocation":1556},"/solutions/education/","education",{"text":1713,"config":1714},"Financial services",{"href":1715,"dataGaName":1716,"dataGaLocation":1556},"/solutions/finance/","financial services",{"title":1268,"links":1718},[1719,1721,1723,1725,1728,1730,1733,1735,1737,1739,1741,1743,1745,1747],{"text":1281,"config":1720},{"href":1283,"dataGaName":1284,"dataGaLocation":1556},{"text":1286,"config":1722},{"href":1288,"dataGaName":1289,"dataGaLocation":1556},{"text":1291,"config":1724},{"href":1293,"dataGaName":1294,"dataGaLocation":1556},{"text":1296,"config":1726},{"href":1298,"dataGaName":1727,"dataGaLocation":1556},"docs",{"text":1319,"config":1729},{"href":1321,"dataGaName":1322,"dataGaLocation":1556},{"text":1731,"config":1732},"What's new",{"href":1379,"dataGaName":1380,"dataGaLocation":1556},{"text":1314,"config":1734},{"href":1316,"dataGaName":1317,"dataGaLocation":1556},{"text":1333,"config":1736},{"href":1335,"dataGaName":1336,"dataGaLocation":1556},{"text":1341,"config":1738},{"href":1343,"dataGaName":1344,"dataGaLocation":1556},{"text":1346,"config":1740},{"href":1348,"dataGaName":1349,"dataGaLocation":1556},{"text":1351,"config":1742},{"href":1353,"dataGaName":1354,"dataGaLocation":1556},{"text":1356,"config":1744},{"href":1358,"dataGaName":1359,"dataGaLocation":1556},{"text":1361,"config":1746},{"href":1363,"dataGaName":1364,"dataGaLocation":1556},{"text":1366,"config":1748},{"href":1368,"dataGaName":1369,"dataGaLocation":1556},{"title":1382,"links":1750},[1751,1753,1755,1757,1759,1761,1765,1770,1772,1774,1776],{"text":1390,"config":1752},{"href":1392,"dataGaName":1384,"dataGaLocation":1556},{"text":1395,"config":1754},{"href":1397,"dataGaName":1398,"dataGaLocation":1556},{"text":1403,"config":1756},{"href":1405,"dataGaName":1406,"dataGaLocation":1556},{"text":1408,"config":1758},{"href":1410,"dataGaName":1411,"dataGaLocation":1556},{"text":1413,"config":1760},{"href":1415,"dataGaName":1416,"dataGaLocation":1556},{"text":1762,"config":1763},"Sustainability",{"href":1764,"dataGaName":1762,"dataGaLocation":1556},"/sustainability/",{"text":1766,"config":1767},"Diversity, inclusion and belonging (DIB)",{"href":1768,"dataGaName":1769,"dataGaLocation":1556},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1418,"config":1771},{"href":1420,"dataGaName":1421,"dataGaLocation":1556},{"text":1428,"config":1773},{"href":1430,"dataGaName":1431,"dataGaLocation":1556},{"text":1433,"config":1775},{"href":1435,"dataGaName":1436,"dataGaLocation":1556},{"text":1777,"config":1778},"Modern Slavery Transparency Statement",{"href":1779,"dataGaName":1780,"dataGaLocation":1556},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1782},[1783,1786,1789],{"text":1784,"config":1785},"Terms",{"href":1608,"dataGaName":1609,"dataGaLocation":1556},{"text":1787,"config":1788},"Cookies",{"dataGaName":1618,"dataGaLocation":1556,"id":1619,"isOneTrustButton":1095},{"text":1790,"config":1791},"Privacy",{"href":1613,"dataGaName":1614,"dataGaLocation":1556},[1793],{"id":1794,"title":7,"body":1094,"config":1795,"content":1797,"description":1094,"extension":1801,"meta":1802,"navigation":1095,"path":1803,"seo":1804,"stem":1805,"__hash__":1806},"blogAuthors/en-us/blog/authors/cesar-saavedra.yml",{"template":1796},"BlogAuthor",{"name":7,"config":1798},{"headshot":1799,"ctfId":1800},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659600/Blog/Author%20Headshots/csaavedra1-headshot.jpg","csaavedra1","yml",{},"/en-us/blog/authors/cesar-saavedra",{},"en-us/blog/authors/cesar-saavedra","SMqRf-z0W5m5GROz_dXGjmuIb3YaOwm_n_RfeK16GcA",[1808,1817,1825],{"title":1809,"description":1810,"heroImage":1811,"category":1090,"date":1812,"authors":1813,"slug":1816,"externalUrl":1094},"Confidential AI for GitLab Self-Hosted","Give developers AI coding agents in GitLab Duo without source code leaving a hardware-encrypted boundary — no GPUs needed.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png","2026-08-06",[1814,1815],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1818,"description":1819,"heroImage":1820,"category":1090,"date":1821,"authors":1822,"slug":1824,"externalUrl":1094},"Green DevOps: Why carbon measurement belongs in your CI/CD pipeline","CI/CD pipelines have a hidden carbon cost. Here's why measuring it matters, and how you can get started with Eco CI and Carmen in GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-07-09",[1823],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1826,"description":1827,"heroImage":1828,"category":1090,"date":1829,"authors":1830,"slug":1832,"externalUrl":1094},"How to build CI/CD observability at scale","This practical guide to GitLab pipeline analytics helps self-managed users gain operational insights using Prometheus and Grafana.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-04-28",[1831],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1834},[1835,1849,1861,1873],{"id":1836,"categories":1837,"header":1839,"text":1840,"button":1841,"image":1846},"ai-modernization",[1838],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1842,"config":1843},"Get your AI maturity score",{"href":1844,"dataGaName":1845,"dataGaLocation":1322},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1847},{"src":1848},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1850,"categories":1851,"header":1853,"text":1840,"button":1854,"image":1858},"devops-modernization",[1852,1658],"product","Are you just managing tools or shipping innovation?",{"text":1855,"config":1856},"Get your DevOps maturity score",{"href":1857,"dataGaName":1845,"dataGaLocation":1322},"/assessments/devops-modernization-assessment/",{"config":1859},{"src":1860},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1862,"categories":1863,"header":1865,"text":1840,"button":1866,"image":1870},"security-modernization",[1864],"security","Are you trading speed for security?",{"text":1867,"config":1868},"Get your security maturity score",{"href":1869,"dataGaName":1845,"dataGaLocation":1322},"/assessments/security-modernization-assessment/",{"config":1871},{"src":1872},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1874,"paths":1875,"header":1878,"text":1879,"button":1880,"image":1885},"github-azure-migration",[1876,1877],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Is your team ready for GitHub's Azure move?","GitHub is already rebuilding around Azure. Find out what it means for you.",{"text":1881,"config":1882},"See how GitLab compares to GitHub",{"href":1883,"dataGaName":1884,"dataGaLocation":1322},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1886},{"src":1860},{"header":1888,"blurb":1889,"button":1890,"secondaryButton":1895},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1891,"config":1892},"Get your free trial",{"href":1893,"dataGaName":1121,"dataGaLocation":1894},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1594,"config":1896},{"href":1447,"dataGaName":1126,"dataGaLocation":1894},1786803774396]