[{"data":1,"prerenderedAt":2284},["ShallowReactive",2],{"/blog/teams-gitpod-integration-gitlab-speed-up-development":3,"navigation-en-us":1497,"banner-en-us":1924,"footer-en-us":1934,"blog-post-authors-en-us-Michael Friedrich":2179,"blog-related-posts-en-us-teams-gitpod-integration-gitlab-speed-up-development":2194,"blog-promotions-en-us":2220,"next-steps-en-us":2274},{"id":4,"title":5,"authors":6,"body":8,"category":1475,"date":1476,"description":1477,"extension":1478,"externalUrl":1479,"faq":1479,"featured":1480,"heroImage":1481,"meta":1482,"navigation":226,"path":1483,"seo":1484,"slug":1489,"stem":1490,"tags":1491,"template":1495,"updatedDate":1479,"__hash__":1496},"blogPosts/en-us/blog/teams-gitpod-integration-gitlab-speed-up-development.md","How teams can use the Gitpod integration in GitLab to speed up their development process",[7],"Michael Friedrich",{"type":9,"value":10,"toc":1452},"minimark",[11,15,18,23,26,29,51,54,57,62,65,68,80,83,86,90,93,109,112,115,119,132,141,150,154,165,293,301,305,308,315,318,324,327,347,359,366,371,374,431,454,460,467,473,488,491,495,506,512,520,526,530,533,536,540,555,722,731,793,806,812,815,819,845,872,891,975,990,994,1006,1025,1032,1041,1048,1098,1108,1144,1152,1156,1160,1163,1178,1184,1188,1205,1266,1270,1284,1295,1331,1334,1349,1370,1374,1383,1391,1397,1421,1427,1431,1434,1448],[12,13,14],"p",{},"Turn back time a bit and try to remember the first project you started or joined, and the onboarding experience. How long did it take to install the development environment on your local machine?",[12,16,17],{},"We talked about our own onboarding experiences into software development, and thought about sharing our favorite tips with GitLab users.",[19,20,22],"h2",{"id":21},"a-developers-tale","A developer's tale",[12,24,25],{},"Everyone starts fresh, and often best practices are just \"learning by doing,\" requiring documentation in the same moment. Programming languages and application architectures are also different - a C++ backend environment has different requirements than a Ruby on Rails web application.",[12,27,28],{},"Start with defining the requirements and stages. Oftentimes they are equivalent to CI/CD pipeline stages but executed in your own environment.",[30,31,32,36,39,42,45,48],"ul",{},[33,34,35],"li",{},"Compile/build the application and verify that the source code is valid (\"build\")",[33,37,38],{},"Run linting, unit tests, code quality checks (\"test\")",[33,40,41],{},"Run the application in a dev environment (\"runtime test\")",[33,43,44],{},"Package the application, run installation tests (\"staging installation\")",[33,46,47],{},"Run the installed application (\"staging deployment\")",[33,49,50],{},"Tag, release, and deploy the application (\"release production deployment\")",[12,52,53],{},"You want to run the application in a development environment quickly, everything else with staging and deployments continues to run in your CI/CD pipelines. Their implementation and availability should be on your to-do list.",[12,55,56],{},"Software applications can depend on existing libraries which are used by many other developers, and help speed up the development process. These dependencies need to be installed into the development environment - if that is your local macOS, Windows or Linux desktop, methods and requirements will differ.",[58,59,61],"h3",{"id":60},"provision-development-environments","Provision development environments",[12,63,64],{},"Creating a development environment for many different operating systems has its disadvantages: Error messages can differ and implementation specific details do not produce the same results and require back-and-forth communication on the team. This often leads to friction and slowed down development processes.",[12,66,67],{},"One key learning over the past decade has been to use CI/CD extensively to test different environments and operating systems, and rely on fast feedback in Merge Requests. Developers should be able to focus on their development environment without having to worry about the many production use cases and support.",[12,69,70,71,75,76,79],{},"Virtual machines in Vagrant, and Docker containers made the generic development environment creation easier and efficient. The documentation instructed everyone to either execute ",[72,73,74],"code",{},"vagrant up"," or ",[72,77,78],{},"docker-compose up -d"," and have the development stack ready. The road to creating Vagrant and Docker base images, including the provisioning scripts with Bash, Ansible, Puppet, etc., was and still is a huge learning process. Opinions on \"good\" best practices differ, and adding your preferred IDE on top of a CLI only VM or container often is an adventure on its own.",[12,81,82],{},"Bandwidth and traffic can also come into play - each provision and software installation run may consume gigabytes of data. If the workloads and provisioning would run in the cloud, your local connection is not affected.",[12,84,85],{},"One customer mentioned a while ago that their company policy forbids installing a local IDE without a license. The Web IDE in GitLab solves this problem for them throughout the onboarding month.",[58,87,89],{"id":88},"development-environment-in-the-browser","Development environment in the browser",[12,91,92],{},"The Web IDE helps with basic programming tasks, editing the documentation or setting up the CI/CD configuration. It does not provide a fully fledged server runtime, as cloud IDE with a programming environment capable of understanding the language you are programming in would. Our vision is to explore ways to add integrated development environments into the Web IDE.",[12,94,95,96,102,103,108],{},"There are a variety of tools and environments following remote collaboration ideas and the cloud IDE approach. You can learn more in ",[97,98,101],"a",{"href":99,"rel":100},"https://twitter.com/sytses/status/1400134840754733059",[],"this Twitter thread"," from GitLab co-founder and CEO, Sid Sijbrandij. One approach is ",[97,104,107],{"href":105,"rel":106},"https://gitpod.io/",[],"Gitpod",", allowing you to spin a fresh environment in the cloud in seconds.",[12,110,111],{},"Gitpod uses Visual Studio Code (VS Code) as cloud IDE, and integrates with their marketplace to install the same extensions as you would install locally in VS Code. One of the coolest things about Gitpod is that it not only spins up a fresh environment, but also allows you to install additional software or bring your own workspace container image. That way everyone uses the same pre-provisioned environment, and pair programming and debugging becomes a breeze.",[12,113,114],{},"Next time, the same state is booted up, secured by single sign-on.",[19,116,118],{"id":117},"first-steps-with-gitpod","First steps with Gitpod",[12,120,121,122,127,128,131],{},"Navigate to ",[97,123,126],{"href":124,"rel":125},"https://gitpod.io",[],"gitpod.io"," and choose to ",[72,129,130],{},"continue with GitLab"," as login.",[12,133,134,135,140],{},"If you are running a self-managed GitLab setup, ask your administrator to ",[97,136,139],{"href":137,"rel":138},"https://docs.gitlab.com/integration/gitpod/",[],"enable the Gitpod integration",".",[12,142,143,144,149],{},"Let's start with creating a VueJS application. Fork the ",[97,145,148],{"href":146,"rel":147},"https://gitlab.com/gitlab-da/playground/learn-vuejs-gitpod",[],"learn-vuejs-gitpod"," project on GitLab.com.",[58,151,153],{"id":152},"alternative-start-on-your-cli","Alternative: Start on your CLI",[12,155,156,157,160,161,164],{},"Alternatively to forking the project, install NodeJS, npm and the ",[72,158,159],{},"vue-cli"," package, and run ",[72,162,163],{},"vue create learn-vuejs-gitpod",". The vue command already initializes and commits based on your local Git configuration. Add the remote origin and push to a new repository on the remote GitLab server.",[166,167,172],"pre",{"className":168,"code":169,"language":170,"meta":171,"style":171},"language-shell shiki shiki-themes github-light","$ brew install node\n$ yarn add @vue/cli\n$ vue create learn-vuejs-gitpod\n\n$ cd learn-vuejs-gitpod\n$ git remote add origin https://gitlab.com/\u003Cyourusername>/learn-vuejs-gitpod.git\n$ git push -u origin main\n","shell","",[72,173,174,193,207,221,228,238,274],{"__ignoreMap":171},[175,176,179,183,187,190],"span",{"class":177,"line":178},"line",1,[175,180,182],{"class":181},"s7eDp","$",[175,184,186],{"class":185},"sYBdl"," brew",[175,188,189],{"class":185}," install",[175,191,192],{"class":185}," node\n",[175,194,196,198,201,204],{"class":177,"line":195},2,[175,197,182],{"class":181},[175,199,200],{"class":185}," yarn",[175,202,203],{"class":185}," add",[175,205,206],{"class":185}," @vue/cli\n",[175,208,210,212,215,218],{"class":177,"line":209},3,[175,211,182],{"class":181},[175,213,214],{"class":185}," vue",[175,216,217],{"class":185}," create",[175,219,220],{"class":185}," learn-vuejs-gitpod\n",[175,222,224],{"class":177,"line":223},4,[175,225,227],{"emptyLinePlaceholder":226},true,"\n",[175,229,231,233,236],{"class":177,"line":230},5,[175,232,182],{"class":181},[175,234,235],{"class":185}," cd",[175,237,220],{"class":185},[175,239,241,243,246,249,251,254,257,261,264,268,271],{"class":177,"line":240},6,[175,242,182],{"class":181},[175,244,245],{"class":185}," git",[175,247,248],{"class":185}," remote",[175,250,203],{"class":185},[175,252,253],{"class":185}," origin",[175,255,256],{"class":185}," https://gitlab.com/",[175,258,260],{"class":259},"sD7c4","\u003C",[175,262,263],{"class":185},"yourusernam",[175,265,267],{"class":266},"sgsFI","e",[175,269,270],{"class":259},">",[175,272,273],{"class":185},"/learn-vuejs-gitpod.git\n",[175,275,277,279,281,284,288,290],{"class":177,"line":276},7,[175,278,182],{"class":181},[175,280,245],{"class":185},[175,282,283],{"class":185}," push",[175,285,287],{"class":286},"sYu0t"," -u",[175,289,253],{"class":185},[175,291,292],{"class":185}," main\n",[12,294,295,296,140],{},"GitLab will ",[97,297,300],{"href":298,"rel":299},"https://docs.gitlab.com/user/project/working_with_projects/#create-a-new-project-with-git-push",[],"create a private project from the git push command",[58,302,304],{"id":303},"start-gitpod","Start Gitpod",[12,306,307],{},"Start Gitpod from the repository overview by selecting the dropdown switch from the Web IDE.",[12,309,310],{},[311,312],"img",{"alt":313,"src":314},"Gitpod VueJS Start","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398389/blog/Content%20Images/gitlab-gitpod-teams-development/gitpod_gitlab_start_vuejs.png",[12,316,317],{},"Sign into your GitLab account with SSO once asked. Accept the required permissions, and wait until the Gitpod environment is booted up.",[12,319,320],{},[311,321],{"alt":322,"src":323},"Gitpod VueJS Overview","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398390/blog/Content%20Images/gitlab-gitpod-teams-development/gitpod_vuejs_overview.png",[12,325,326],{},"Change to the terminal and run yarn to install the dependencies and start the development server. No worries, we'll show you how to automate this in a second!",[166,328,330],{"className":168,"code":329,"language":170,"meta":171,"style":171},"yarn install\nyarn serve\n",[72,331,332,340],{"__ignoreMap":171},[175,333,334,337],{"class":177,"line":178},[175,335,336],{"class":181},"yarn",[175,338,339],{"class":185}," install\n",[175,341,342,344],{"class":177,"line":195},[175,343,336],{"class":181},[175,345,346],{"class":185}," serve\n",[12,348,349,350,353,354,140],{},"Gitpod detects the server listening on port 8080 and offers to make it public. Open the browser instead - it works but says ",[72,351,352],{},"Invalid host header"," because the dev server checks the host name. For running inside Gitpod containers, you need to ",[97,355,358],{"href":356,"rel":357},"https://github.com/gitpod-io/gitpod/issues/26#issuecomment-554058232",[],"disable the host checks",[12,360,361,362,365],{},"Let's fix this inside Gitpod in the project. Navigate into the left file tree, and add a new file called ",[72,363,364],{},"vue.config.js"," in the top level.",[12,367,368],{},[311,369],{"alt":322,"src":370},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398390/blog/Content%20Images/gitlab-gitpod-teams-development/gitpod_vuejs_config_disable_host_checks_devserver.png",[12,372,373],{},"Copy the following code snippet into it",[166,375,379],{"className":376,"code":377,"language":378,"meta":171,"style":171},"language-js shiki shiki-themes github-light","// vue.config.js\nmodule.exports = {\n    // Rationale: https://github.com/gitpod-io/gitpod/issues/26#issuecomment-554058232\n    devServer: {\n        disableHostCheck: true\n    }\n}\n","js",[72,380,381,387,403,408,413,421,426],{"__ignoreMap":171},[175,382,383],{"class":177,"line":178},[175,384,386],{"class":385},"sAwPA","// vue.config.js\n",[175,388,389,392,394,397,400],{"class":177,"line":195},[175,390,391],{"class":286},"module",[175,393,140],{"class":266},[175,395,396],{"class":286},"exports",[175,398,399],{"class":259}," =",[175,401,402],{"class":266}," {\n",[175,404,405],{"class":177,"line":209},[175,406,407],{"class":385},"    // Rationale: https://github.com/gitpod-io/gitpod/issues/26#issuecomment-554058232\n",[175,409,410],{"class":177,"line":223},[175,411,412],{"class":266},"    devServer: {\n",[175,414,415,418],{"class":177,"line":230},[175,416,417],{"class":266},"        disableHostCheck: ",[175,419,420],{"class":286},"true\n",[175,422,423],{"class":177,"line":240},[175,424,425],{"class":266},"    }\n",[175,427,428],{"class":177,"line":276},[175,429,430],{"class":266},"}\n",[12,432,433,434,437,438,441,442,445,446,449,450,453],{},"And stop the running ",[72,435,436],{},"yarn serve"," command in the terminal by pressing ",[72,439,440],{},"crtl+c",". Press ",[72,443,444],{},"cursor up"," to select the previous command, or type ",[72,447,448],{},"!!"," to repeat the last command followed by ",[72,451,452],{},"enter"," to start the devserver again. Voilà!",[12,455,456],{},[311,457],{"alt":458,"src":459},"VueJs running app in Gitpod","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398390/blog/Content%20Images/gitlab-gitpod-teams-development/gitpod_vuejs_web_app.png",[12,461,462,463,466],{},"Don't forget to add and commit the new configuration file to persist the changes. Navigate into the ",[72,464,465],{},"Source Control"," section highlighting one pending change. Enter a commit message, click the check mark and approve all pending changes into the commit.",[12,468,469],{},[311,470],{"alt":471,"src":472},"Gitpod Source Control","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398389/blog/Content%20Images/gitlab-gitpod-teams-development/gitpod_source_control_add_vuejs_config.png",[12,474,475,476,479,480,483,484,487],{},"Select the ",[72,477,478],{},"..."," menu to ",[72,481,482],{},"push"," the Git history. Gitpod will ask you for ",[72,485,486],{},"repository read/write"," permissions, walk through the forms and edit them on Gitpod itself. Navigate back to the Gitpod project interface and re-do the push.",[12,489,490],{},"From the first success, it is not far to your first customized VueJS application. But wait, there is more to learn about Gitpod and efficient workflows!",[58,492,494],{"id":493},"vs-code-extensions","VS Code Extensions",[12,496,497,498,501,502,505],{},"Navigate into the ",[72,499,500],{},"Extensions"," menu and search for ",[72,503,504],{},"gitlab workflow",". Install the extension. We recommend installing it globally for your account and all future workspaces.",[12,507,508],{},[311,509],{"alt":510,"src":511},"Gitpod extension: GitLab workflow for VS Code","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398389/blog/Content%20Images/gitlab-gitpod-teams-development/gitpod_extension_gitlab_workflow.png",[12,513,514,515,140],{},"Next, navigate into the new GitLab menu item on the left, and configure the extension. It needs a personal access token, similar to the process with a local VS Code extension configuration. Follow the steps in the ",[97,516,519],{"href":517,"rel":518},"https://docs.gitlab.com/user/profile/personal_access_tokens/#create-a-personal-access-token",[],"Gitlab documentation to create a personal access token",[12,521,522],{},[311,523],{"alt":524,"src":525},"Gitpod: GitLab workflow extension config","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398389/blog/Content%20Images/gitlab-gitpod-teams-development/gitpod_gitlab_workflow_extension_config.png",[19,527,529],{"id":528},"speed-up-your-own-projects","Speed up your own projects",[12,531,532],{},"Using Gitpod and GitLab to develop GitLab makes it easy to contribute, but what about your own DevOps lifecycle and projects? Below are a few more examples to speed up your development with Gitpod and GitLab.",[12,534,535],{},"Remember: You can start Gitpod without any configuration, directly from a GitLab repository. If there are additional settings needed, you can develop them while learning from the examples and documentation best practices.",[58,537,539],{"id":538},"hugo-pages-website-live-review","Hugo Pages website live review",[12,541,542,543,548,549,554],{},"You can use Hugo with GitLab pages to host your own private blog, for example. Hugo is a static site generator written in Go, with public Docker images already available. The deployment of ",[97,544,547],{"href":545,"rel":546},"https://everyonecancontribute.com/",[],"everyonecancontribute.com"," uses the following configuration in the ",[97,550,553],{"href":551,"rel":552},"https://gitlab.com/everyonecancontribute/web/everyonecancontribute.gitlab.io/-/blob/main/.gitlab-ci.yml",[],".gitlab-ci.yml"," configuration:",[166,556,560],{"className":557,"code":558,"language":559,"meta":171,"style":171},"language-yaml shiki shiki-themes github-light",".publish: &publish\n  image: registry.gitlab.com/pages/hugo:latest\n  script:\n    - hugo\n  artifacts:\n    paths:\n    - public\n\npages:\n  stage: publish\n  \u003C\u003C: *publish\n  rules:\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n      when: always\n  environment:\n    name: $CI_PROJECT_NAME\n    url: https://$CI_PROJECT_NAME/\n","yaml",[72,561,562,577,587,595,603,610,617,624,629,637,647,660,668,681,692,700,711],{"__ignoreMap":171},[175,563,564,568,571,574],{"class":177,"line":178},[175,565,567],{"class":566},"shJU0",".publish",[175,569,570],{"class":266},": ",[175,572,573],{"class":259},"&",[175,575,576],{"class":181},"publish\n",[175,578,579,582,584],{"class":177,"line":195},[175,580,581],{"class":566},"  image",[175,583,570],{"class":266},[175,585,586],{"class":185},"registry.gitlab.com/pages/hugo:latest\n",[175,588,589,592],{"class":177,"line":209},[175,590,591],{"class":566},"  script",[175,593,594],{"class":266},":\n",[175,596,597,600],{"class":177,"line":223},[175,598,599],{"class":266},"    - ",[175,601,602],{"class":185},"hugo\n",[175,604,605,608],{"class":177,"line":230},[175,606,607],{"class":566},"  artifacts",[175,609,594],{"class":266},[175,611,612,615],{"class":177,"line":240},[175,613,614],{"class":566},"    paths",[175,616,594],{"class":266},[175,618,619,621],{"class":177,"line":276},[175,620,599],{"class":266},[175,622,623],{"class":185},"public\n",[175,625,627],{"class":177,"line":626},8,[175,628,227],{"emptyLinePlaceholder":226},[175,630,632,635],{"class":177,"line":631},9,[175,633,634],{"class":566},"pages",[175,636,594],{"class":266},[175,638,640,643,645],{"class":177,"line":639},10,[175,641,642],{"class":566},"  stage",[175,644,570],{"class":266},[175,646,576],{"class":185},[175,648,650,653,655,658],{"class":177,"line":649},11,[175,651,652],{"class":286},"  \u003C\u003C",[175,654,570],{"class":266},[175,656,657],{"class":259},"*",[175,659,576],{"class":266},[175,661,663,666],{"class":177,"line":662},12,[175,664,665],{"class":566},"  rules",[175,667,594],{"class":266},[175,669,671,673,676,678],{"class":177,"line":670},13,[175,672,599],{"class":266},[175,674,675],{"class":566},"if",[175,677,570],{"class":266},[175,679,680],{"class":185},"$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n",[175,682,684,687,689],{"class":177,"line":683},14,[175,685,686],{"class":566},"      when",[175,688,570],{"class":266},[175,690,691],{"class":185},"always\n",[175,693,695,698],{"class":177,"line":694},15,[175,696,697],{"class":566},"  environment",[175,699,594],{"class":266},[175,701,703,706,708],{"class":177,"line":702},16,[175,704,705],{"class":566},"    name",[175,707,570],{"class":266},[175,709,710],{"class":185},"$CI_PROJECT_NAME\n",[175,712,714,717,719],{"class":177,"line":713},17,[175,715,716],{"class":566},"    url",[175,718,570],{"class":266},[175,720,721],{"class":185},"https://$CI_PROJECT_NAME/\n",[12,723,724,725,730],{},"A local development environment to preview the website needs the Hugo binary installed. Doing the same in the browser, running the Hugo CLI command and previewing the blog post? We've found a way to provision Gitpod in the same way, using ",[97,726,729],{"href":727,"rel":728},"https://gitlab.com/everyonecancontribute/web/everyonecancontribute.gitlab.io/-/blob/main/.gitpod.yml",[],"this .gitpod.yml configuration",":",[166,732,734],{"className":557,"code":733,"language":559,"meta":171,"style":171},"image: klakegg/hugo:debian\n\nports:\n  - port: 1313\n\ntasks:\n  - command: hugo server -D -b $(gp url 1313) --appendPort=false\n",[72,735,736,746,750,757,770,774,781],{"__ignoreMap":171},[175,737,738,741,743],{"class":177,"line":178},[175,739,740],{"class":566},"image",[175,742,570],{"class":266},[175,744,745],{"class":185},"klakegg/hugo:debian\n",[175,747,748],{"class":177,"line":195},[175,749,227],{"emptyLinePlaceholder":226},[175,751,752,755],{"class":177,"line":209},[175,753,754],{"class":566},"ports",[175,756,594],{"class":266},[175,758,759,762,765,767],{"class":177,"line":223},[175,760,761],{"class":266},"  - ",[175,763,764],{"class":566},"port",[175,766,570],{"class":266},[175,768,769],{"class":286},"1313\n",[175,771,772],{"class":177,"line":230},[175,773,227],{"emptyLinePlaceholder":226},[175,775,776,779],{"class":177,"line":240},[175,777,778],{"class":566},"tasks",[175,780,594],{"class":266},[175,782,783,785,788,790],{"class":177,"line":276},[175,784,761],{"class":266},[175,786,787],{"class":566},"command",[175,789,570],{"class":266},[175,791,792],{"class":185},"hugo server -D -b $(gp url 1313) --appendPort=false\n",[12,794,795,796,801,802,805],{},"The Hugo container image gets pulled and the Gitpod workspace builder prepares the environment. Note that ",[97,797,800],{"href":798,"rel":799},"https://github.com/gitpod-io/gitpod/issues/3356#issuecomment-877604994",[],"Alpine based images do not work",", use Debian variants instead. After starting the workspace, the tasks run the command, and expose a port. The port binding needs to be the external URL of the pod, not localhost. ",[72,803,804],{},"gp url 1313"," builds the exact URL, and binds the socket to the Hugo server, making the pod URL publicly accessible for reviews.",[12,807,808],{},[311,809],{"alt":810,"src":811},"Gitpod: Hugo website","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398389/blog/Content%20Images/gitlab-gitpod-teams-development/gitpod_hugo_everyonecancontribute_com.png",[12,813,814],{},"From there, you can switch branches in Gitpod, and immediately verify the changes.",[58,816,818],{"id":817},"vuejs-with-custom-container-image","VueJS with custom container image",[12,820,821,822,824,825,830,831,834,835,838,839,844],{},"Getting started with VueJS in a new project with the ",[72,823,159],{}," package is very convenient and the Gitpod docs have a ",[97,826,829],{"href":827,"rel":828},"https://www.gitpod.io/docs/languages/vue/#vue-cli",[],"guide"," ready. The default ",[72,832,833],{},"gitpod/workspace-full"," image does not provide the ",[72,836,837],{},"vue cli"," package. You can extend the container image by using your ",[97,840,843],{"href":841,"rel":842},"https://www.gitpod.io/docs/config-docker#configure-a-custom-dockerfile",[],"custom .gitpod.Dockerfile"," - Gitpod takes care of building the image first, and later starts the workspace based on it.",[166,846,850],{"className":847,"code":848,"language":849,"meta":171,"style":171},"language-docker shiki shiki-themes github-light","FROM gitpod/workspace-full\n\nRUN yarn add @vue/cli\n","docker",[72,851,852,860,864],{"__ignoreMap":171},[175,853,854,857],{"class":177,"line":178},[175,855,856],{"class":259},"FROM",[175,858,859],{"class":266}," gitpod/workspace-full\n",[175,861,862],{"class":177,"line":195},[175,863,227],{"emptyLinePlaceholder":226},[175,865,866,869],{"class":177,"line":209},[175,867,868],{"class":259},"RUN",[175,870,871],{"class":266}," yarn add @vue/cli\n",[12,873,874,875,878,879,881,882,884,885,890],{},"The ",[72,876,877],{},".gitpod.yml"," configuration file needs to be instructed to build and use a custom image. On startup, the ",[72,880,778],{}," section runs the initial dependency installation, and starts the development environment with ",[72,883,436],{},". The server listens on port 5000 by default, this is what gets ",[97,886,889],{"href":887,"rel":888},"https://www.gitpod.io/docs/config-ports",[],"exposed",", and instructed to open as call-to-action in the browser.",[166,892,894],{"className":557,"code":893,"language":559,"meta":171,"style":171},"image:\n  file: .gitpod.Dockerfile\n\ntasks:\n  - init: yarn install\n    command: yarn serve\n\nports:\n  - port: 5000\n    onOpen: open-browser\n",[72,895,896,902,912,916,922,934,944,948,954,965],{"__ignoreMap":171},[175,897,898,900],{"class":177,"line":178},[175,899,740],{"class":566},[175,901,594],{"class":266},[175,903,904,907,909],{"class":177,"line":195},[175,905,906],{"class":566},"  file",[175,908,570],{"class":266},[175,910,911],{"class":185},".gitpod.Dockerfile\n",[175,913,914],{"class":177,"line":209},[175,915,227],{"emptyLinePlaceholder":226},[175,917,918,920],{"class":177,"line":223},[175,919,778],{"class":566},[175,921,594],{"class":266},[175,923,924,926,929,931],{"class":177,"line":230},[175,925,761],{"class":266},[175,927,928],{"class":566},"init",[175,930,570],{"class":266},[175,932,933],{"class":185},"yarn install\n",[175,935,936,939,941],{"class":177,"line":240},[175,937,938],{"class":566},"    command",[175,940,570],{"class":266},[175,942,943],{"class":185},"yarn serve\n",[175,945,946],{"class":177,"line":276},[175,947,227],{"emptyLinePlaceholder":226},[175,949,950,952],{"class":177,"line":626},[175,951,754],{"class":566},[175,953,594],{"class":266},[175,955,956,958,960,962],{"class":177,"line":631},[175,957,761],{"class":266},[175,959,764],{"class":566},[175,961,570],{"class":266},[175,963,964],{"class":286},"5000\n",[175,966,967,970,972],{"class":177,"line":639},[175,968,969],{"class":566},"    onOpen",[175,971,570],{"class":266},[175,973,974],{"class":185},"open-browser\n",[12,976,977,978,983,984,989],{},"You can combine Gitpod for previewing the website with the production deployment using the ",[97,979,982],{"href":980,"rel":981},"https://gitlab.com/gitlab-org/5-minute-production-app/deploy-template",[],"five minute production app deployment template"," shown in ",[97,985,988],{"href":986,"rel":987},"https://gitlab.com/gitlab-da/playground/5-min-prod-app-vuejs",[],"this project",". GitLab takes care of provisioning a free AWS EC2 instance, TLS certificates and domain handling.",[58,991,993],{"id":992},"more-gitpod-workspace-images","More Gitpod workspace images",[12,995,996,997,1002,1003,1005],{},"Gitpod provides many ",[97,998,1001],{"href":999,"rel":1000},"https://github.com/gitpod-io/workspace-images",[],"ready-to-use workspace images",". In order to use them, create the ",[72,1004,877],{}," file with this content:",[166,1007,1009],{"className":557,"code":1008,"language":559,"meta":171,"style":171},"image:\n  file: .gitpod.Dockerfile\n",[72,1010,1011,1017],{"__ignoreMap":171},[175,1012,1013,1015],{"class":177,"line":178},[175,1014,740],{"class":566},[175,1016,594],{"class":266},[175,1018,1019,1021,1023],{"class":177,"line":195},[175,1020,906],{"class":566},[175,1022,570],{"class":266},[175,1024,911],{"class":185},[12,1026,1027,1028,1031],{},"Create a new ",[72,1029,1030],{},".gitpod.Dockerfile"," file and add the import from the desired workspace image.",[166,1033,1035],{"className":557,"code":1034,"language":559,"meta":171,"style":171},"FROM gitpod/workspace-mysql\n",[72,1036,1037],{"__ignoreMap":171},[175,1038,1039],{"class":177,"line":178},[175,1040,1034],{"class":185},[12,1042,1043,1044,1047],{},"If you need to install additional software, note that the full workspace image is based on Debian and therefore you'll need to use the ",[72,1045,1046],{},"apt"," package manager. The following command updates the package index, and clears the cache after installation to keep the image clean.",[166,1049,1051],{"className":168,"code":1050,"language":170,"meta":171,"style":171},"RUN sudo apt update && sudo apt install -y PACKAGENAME && sudo rm -rf /var/lib/apt/lists/*\n",[72,1052,1053],{"__ignoreMap":171},[175,1054,1055,1057,1060,1063,1066,1069,1072,1074,1076,1079,1082,1084,1086,1089,1092,1095],{"class":177,"line":178},[175,1056,868],{"class":181},[175,1058,1059],{"class":185}," sudo",[175,1061,1062],{"class":185}," apt",[175,1064,1065],{"class":185}," update",[175,1067,1068],{"class":266}," && ",[175,1070,1071],{"class":181},"sudo",[175,1073,1062],{"class":185},[175,1075,189],{"class":185},[175,1077,1078],{"class":286}," -y",[175,1080,1081],{"class":185}," PACKAGENAME",[175,1083,1068],{"class":266},[175,1085,1071],{"class":181},[175,1087,1088],{"class":185}," rm",[175,1090,1091],{"class":286}," -rf",[175,1093,1094],{"class":185}," /var/lib/apt/lists/",[175,1096,1097],{"class":286},"*\n",[12,1099,1100,1101,1103,1104,1107],{},"If you are not sure about the package name, run Docker locally and search for the package name. Fair warning: The ",[72,1102,833],{}," image is huge, use the base image ",[72,1105,1106],{},"debian:latest"," instead.",[166,1109,1111],{"className":168,"code":1110,"language":170,"meta":171,"style":171},"$ docker run -ti debian:latest bash\n$ apt search POSSIBLENAME\n",[72,1112,1113,1132],{"__ignoreMap":171},[175,1114,1115,1117,1120,1123,1126,1129],{"class":177,"line":178},[175,1116,182],{"class":181},[175,1118,1119],{"class":185}," docker",[175,1121,1122],{"class":185}," run",[175,1124,1125],{"class":286}," -ti",[175,1127,1128],{"class":185}," debian:latest",[175,1130,1131],{"class":185}," bash\n",[175,1133,1134,1136,1138,1141],{"class":177,"line":195},[175,1135,182],{"class":181},[175,1137,1062],{"class":185},[175,1139,1140],{"class":185}," search",[175,1142,1143],{"class":185}," POSSIBLENAME\n",[12,1145,1146,1147,1151],{},"You can learn more  the ",[97,1148,1150],{"href":999,"rel":1149},[],"workspace image repository"," to learn more about the Dockerfile configuration used by the builder.",[19,1153,1155],{"id":1154},"do-more-with-gitpod","Do more with Gitpod",[58,1157,1159],{"id":1158},"merge-request-code-reviews","Merge request code reviews",[12,1161,1162],{},"The GitLab workflow extension comes with more super powers:",[30,1164,1165,1168,1171],{},[33,1166,1167],{},"Access the project and Merge Requests",[33,1169,1170],{},"Check the CI/CD pipeline status directly in Gitpod",[33,1172,1173,1174],{},"Perform MR code reviews in Gitpod and take advantage of ",[97,1175,1177],{"href":1176},"/blog/mr-reviews-with-vs-code/","VS Code workflows",[12,1179,1180],{},[311,1181],{"alt":1182,"src":1183},"Gitpod: MR Code Reviews with the GitLab Workflow extension website","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398390/blog/Content%20Images/gitlab-gitpod-teams-development/gitpod_vs_code_gitlab_workflow_extension_mr_code_reviews.png",[58,1185,1187],{"id":1186},"pre-install-vs-code-extensions","Pre-install VS Code Extensions",[12,1189,1190,1191,1196,1197,1199,1200,730],{},"In order to ensure specific ",[97,1192,1195],{"href":1193,"rel":1194},"https://www.gitpod.io/docs/vscode-extensions/",[],"VS Code extensions"," are installed, you can define them in the ",[72,1198,877],{}," configuration file in the repository. Example from the ",[97,1201,1204],{"href":1202,"rel":1203},"https://gitlab.com/gitlab-org/gitlab/-/blob/master/.gitpod.yml#L79",[],"GitLab project",[166,1206,1208],{"className":557,"code":1207,"language":559,"meta":171,"style":171},"vscode:\n  extensions:\n    - rebornix.ruby@0.28.0\n    - wingrunr21.vscode-ruby@0.27.0\n    - karunamurti.haml@1.3.1\n    - octref.vetur@0.34.1\n    - dbaeumer.vscode-eslint@2.1.8\n    - gitlab.gitlab-workflow@3.24.0\n",[72,1209,1210,1217,1224,1231,1238,1245,1252,1259],{"__ignoreMap":171},[175,1211,1212,1215],{"class":177,"line":178},[175,1213,1214],{"class":566},"vscode",[175,1216,594],{"class":266},[175,1218,1219,1222],{"class":177,"line":195},[175,1220,1221],{"class":566},"  extensions",[175,1223,594],{"class":266},[175,1225,1226,1228],{"class":177,"line":209},[175,1227,599],{"class":266},[175,1229,1230],{"class":185},"rebornix.ruby@0.28.0\n",[175,1232,1233,1235],{"class":177,"line":223},[175,1234,599],{"class":266},[175,1236,1237],{"class":185},"wingrunr21.vscode-ruby@0.27.0\n",[175,1239,1240,1242],{"class":177,"line":230},[175,1241,599],{"class":266},[175,1243,1244],{"class":185},"karunamurti.haml@1.3.1\n",[175,1246,1247,1249],{"class":177,"line":240},[175,1248,599],{"class":266},[175,1250,1251],{"class":185},"octref.vetur@0.34.1\n",[175,1253,1254,1256],{"class":177,"line":276},[175,1255,599],{"class":266},[175,1257,1258],{"class":185},"dbaeumer.vscode-eslint@2.1.8\n",[175,1260,1261,1263],{"class":177,"line":626},[175,1262,599],{"class":266},[175,1264,1265],{"class":185},"gitlab.gitlab-workflow@3.24.0\n",[58,1267,1269],{"id":1268},"learn-new-programming-languages-rust","Learn new programming languages: Rust",[12,1271,1272,1273,1278,1279,140],{},"Gitpod allows you to start a fresh pod environment, pause on idle, and continue at a later point. The default workspace environment image already includes the ",[97,1274,1277],{"href":1275,"rel":1276},"https://www.gitpod.io/docs/languages/rust",[],"Rust compiler",", which means that you can immediately ",[97,1280,1283],{"href":1281,"rel":1282},"https://doc.rust-lang.org/rust-by-example/",[],"start learning Rust",[12,1285,1286,1287,1290,1291,1294],{},"Create a new project called ",[72,1288,1289],{},"learn-rust"," and open Gitpod from the repository view. Add a new file on the left tree view called ",[72,1292,1293],{},"hello.rs"," and add the following content:",[166,1296,1300],{"className":1297,"code":1298,"language":1299,"meta":171,"style":171},"language-rust shiki shiki-themes github-light","fn main() {\n    println!(\"Hello from GitLab! 🦊\");\n}\n","rust",[72,1301,1302,1313,1327],{"__ignoreMap":171},[175,1303,1304,1307,1310],{"class":177,"line":178},[175,1305,1306],{"class":259},"fn",[175,1308,1309],{"class":181}," main",[175,1311,1312],{"class":266},"() {\n",[175,1314,1315,1318,1321,1324],{"class":177,"line":195},[175,1316,1317],{"class":181},"    println!",[175,1319,1320],{"class":266},"(",[175,1322,1323],{"class":185},"\"Hello from GitLab! 🦊\"",[175,1325,1326],{"class":266},");\n",[175,1328,1329],{"class":177,"line":209},[175,1330,430],{"class":266},[12,1332,1333],{},"Change into the terminal and run the following command:",[166,1335,1337],{"className":168,"code":1336,"language":170,"meta":171,"style":171},"$ rustc hello.rs\n",[72,1338,1339],{"__ignoreMap":171},[175,1340,1341,1343,1346],{"class":177,"line":178},[175,1342,182],{"class":181},[175,1344,1345],{"class":185}," rustc",[175,1347,1348],{"class":185}," hello.rs\n",[12,1350,1351,1352,1357,1358,1363,1364,1369],{},"We started learning Rust together in an ",[97,1353,1356],{"href":1354,"rel":1355},"https://everyonecancontribute.com/post/2020-10-07-cafe-3-gitpod-gitlab-rust/",[],"#EveryoneCanContribute cafe"," in October 2020 including ",[97,1359,1362],{"href":1360,"rel":1361},"https://docs.google.com/presentation/d/1t1FdHh04TAOg9WITqRFJHz1YFxMbsQeekN8th1UfFcI/edit",[],"workshop slides with exercises",". We continued with ",[97,1365,1368],{"href":1366,"rel":1367},"https://everyonecancontribute.com/post/2021-06-30-cafe-36-rust-rocket-prometheus/",[],"Rocket.rs"," as web app and additional Prometheus monitoring metrics in June 2021. You can watch the recordings to follow the learning process, the mistakes we made on the way, and the first success.",[58,1371,1373],{"id":1372},"how-to-contribute-to-gitlab-with-gitpod","How to contribute to GitLab with Gitpod",[12,1375,1376,1377,1382],{},"A more complex development environment is GitLab itself. The ",[97,1378,1381],{"href":1379,"rel":1380},"https://docs.gitlab.com/development/architecture/",[],"architecture"," involves many different components, and the development environment requires you to install several dependencies in Ruby, NodeJS, Go, and backend applications. The GitLab Development Kit (GDK) describes the steps in detail - in order to get everything up and running, you need to plan for a 30 minutes to three hour process, depending on the compute power and bandwidth.",[12,1384,1385,1386,140],{},"Early in the process of adopting Gitpod for GitLab team members, the groundwork with the base image and bootstrap script took the majority of the preparation time. You can learn more about the integration process in ",[97,1387,1390],{"href":1388,"rel":1389},"https://gitlab.com/gitlab-org/gitlab-development-kit/-/issues/1076",[],"this issue request",[1392,1393,1394],"blockquote",{},[12,1395,1396],{},"It's already possible to try out how the setup works by opening Gitpod, which after waiting for the setup to finish (six to eight minutes) will bring you the Gitpod UI with the GDK fully running and ready for you to make changes and commit. As soon as that setup is finished, you can switch to whatever branch you want, either from the Gitpod UI or via the terminal.",[12,1398,874,1399,1404,1405,1409,1410,1415,1416,140],{},[97,1400,1403],{"href":1401,"rel":1402},"https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/howto/gitpod.md",[],"GDK documentation for Gitpod"," guides you through the required steps. ",[1406,1407,1408],"strong",{},"Important",": You need to start Gitpod from the ",[97,1411,1414],{"href":1412,"rel":1413},"https://gitlab.com/gitlab-org/gitlab/",[],"gitlab-org/gitlab"," project (as team member, as contributor, please fork the repository). Additional features, such as a local GitLab runner, feature flags, Advanced search, etc., must be ",[97,1417,1420],{"href":1418,"rel":1419},"https://gitlab.com/gitlab-org/gitlab-development-kit/-/blob/main/doc/howto/gitpod.md#configure-additional-features",[],"enabled manually",[12,1422,1423],{},[311,1424],{"alt":1425,"src":1426},"GitLab Development Kit running in Gitpod","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398389/blog/Content%20Images/gitlab-gitpod-teams-development/gitpod_gitlab_gdk_running.png",[58,1428,1430],{"id":1429},"everyone-can-contribute","Everyone can contribute",[12,1432,1433],{},"Ready? Start contributing to your favorite OSS project, and connect with your teams for an all-remote pair programming session using Gitpod! :-)",[12,1435,1436,1437,1442,1443],{},"Cover image by ",[97,1438,1441],{"href":1439,"rel":1440},"https://unsplash.com/photos/oIuDXlOJSiE",[],"Thomas Lipke"," on ",[97,1444,1447],{"href":1445,"rel":1446},"https://unsplash.com",[],"Unsplash",[1449,1450,1451],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}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 pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}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);}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}",{"title":171,"searchDepth":195,"depth":195,"links":1453},[1454,1458,1463,1468],{"id":21,"depth":195,"text":22,"children":1455},[1456,1457],{"id":60,"depth":209,"text":61},{"id":88,"depth":209,"text":89},{"id":117,"depth":195,"text":118,"children":1459},[1460,1461,1462],{"id":152,"depth":209,"text":153},{"id":303,"depth":209,"text":304},{"id":493,"depth":209,"text":494},{"id":528,"depth":195,"text":529,"children":1464},[1465,1466,1467],{"id":538,"depth":209,"text":539},{"id":817,"depth":209,"text":818},{"id":992,"depth":209,"text":993},{"id":1154,"depth":195,"text":1155,"children":1469},[1470,1471,1472,1473,1474],{"id":1158,"depth":209,"text":1159},{"id":1186,"depth":209,"text":1187},{"id":1268,"depth":209,"text":1269},{"id":1372,"depth":209,"text":1373},{"id":1429,"depth":209,"text":1430},"engineering","2021-07-19","Learn about Gitpod as cloud development environment, and how its integration into Gitpod helps teams to get more efficient in their DevOps lifecycle.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749667482/Blog/Hero%20Images/cover-image-unsplash.jpg",{},"/en-us/blog/teams-gitpod-integration-gitlab-speed-up-development",{"title":1485,"description":1477,"ogTitle":1485,"ogDescription":1477,"noIndex":1480,"ogImage":1481,"ogUrl":1486,"ogSiteName":1487,"ogType":1488,"canonicalUrls":1486},"Teams speed up development with GitLab's Gitpod integration","https://about.gitlab.com/blog/teams-gitpod-integration-gitlab-speed-up-development","https://about.gitlab.com","article","teams-gitpod-integration-gitlab-speed-up-development","en-us/blog/teams-gitpod-integration-gitlab-speed-up-development",[1492,1493,1494],"integrations","collaboration","workflow","BlogPost","OtbB57OWM8J0lbNN55Iop6QXZL6VGbPUS7hCXjqYYOg",{"logo":1498,"freeTrial":1503,"sales":1508,"login":1513,"items":1518,"search":1844,"minimal":1875,"duo":1894,"switchNav":1903,"pricingDeployment":1914},{"config":1499},{"href":1500,"dataGaName":1501,"dataGaLocation":1502},"/","gitlab logo","header",{"text":1504,"config":1505},"Get free trial",{"href":1506,"dataGaName":1507,"dataGaLocation":1502},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":1509,"config":1510},"Request a demo",{"href":1511,"dataGaName":1512,"dataGaLocation":1502},"/sales/?contact-topic=request-demo","sales",{"text":1514,"config":1515},"Sign in",{"href":1516,"dataGaName":1517,"dataGaLocation":1502},"https://gitlab.com/users/sign_in/","sign in",[1519,1548,1648,1653,1766,1822],{"text":1520,"config":1521,"menu":1523},"Platform",{"dataNavLevelOne":1522},"platform",{"type":1524,"columns":1525},"cards",[1526,1532,1540],{"title":1520,"description":1527,"link":1528},"The intelligent orchestration platform for DevSecOps",{"text":1529,"config":1530},"Explore our Platform",{"href":1531,"dataGaName":1522,"dataGaLocation":1502},"/platform/",{"title":1533,"description":1534,"link":1535},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":1536,"config":1537},"Meet GitLab Duo",{"href":1538,"dataGaName":1539,"dataGaLocation":1502},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1541,"description":1542,"link":1543},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":1544,"config":1545},"Learn more",{"href":1546,"dataGaName":1547,"dataGaLocation":1502},"/why-gitlab/","why gitlab",{"text":1549,"left":226,"config":1550,"menu":1552},"Product",{"dataNavLevelOne":1551},"solutions",{"type":1553,"link":1554,"columns":1558,"feature":1627},"lists",{"text":1555,"config":1556},"View all Solutions",{"href":1557,"dataGaName":1551,"dataGaLocation":1502},"/solutions/",[1559,1583,1606],{"title":1560,"description":1561,"link":1562,"items":1567},"Automation","CI/CD and automation to accelerate deployment",{"config":1563},{"icon":1564,"href":1565,"dataGaName":1566,"dataGaLocation":1502},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[1568,1572,1575,1579],{"text":1569,"config":1570},"CI/CD",{"href":1571,"dataGaLocation":1502,"dataGaName":1569},"/solutions/continuous-integration/",{"text":1533,"config":1573},{"href":1538,"dataGaLocation":1502,"dataGaName":1574},"gitlab duo agent platform - product menu",{"text":1576,"config":1577},"Source Code Management",{"href":1578,"dataGaLocation":1502,"dataGaName":1576},"/solutions/source-code-management/",{"text":1580,"config":1581},"Automated Software Delivery",{"href":1565,"dataGaLocation":1502,"dataGaName":1582},"Automated software delivery",{"title":1584,"description":1585,"link":1586,"items":1591},"Security","Deliver code faster without compromising security",{"config":1587},{"href":1588,"dataGaName":1589,"dataGaLocation":1502,"icon":1590},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1592,1596,1601],{"text":1593,"config":1594},"Application Security Testing",{"href":1588,"dataGaName":1595,"dataGaLocation":1502},"Application security testing",{"text":1597,"config":1598},"Software Supply Chain Security",{"href":1599,"dataGaLocation":1502,"dataGaName":1600},"/solutions/supply-chain/","Software supply chain security",{"text":1602,"config":1603},"Software Compliance",{"href":1604,"dataGaName":1605,"dataGaLocation":1502},"/solutions/software-compliance/","software compliance",{"title":1607,"link":1608,"items":1613},"Measurement",{"config":1609},{"icon":1610,"href":1611,"dataGaName":1612,"dataGaLocation":1502},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[1614,1618,1622],{"text":1615,"config":1616},"Visibility & Measurement",{"href":1611,"dataGaLocation":1502,"dataGaName":1617},"Visibility and Measurement",{"text":1619,"config":1620},"Value Stream Management",{"href":1621,"dataGaLocation":1502,"dataGaName":1619},"/solutions/value-stream-management/",{"text":1623,"config":1624},"Analytics & Insights",{"href":1625,"dataGaLocation":1502,"dataGaName":1626},"/solutions/analytics-and-insights/","Analytics and insights",{"title":1628,"type":1553,"items":1629},"GitLab for",[1630,1636,1642],{"text":1631,"config":1632},"Enterprise",{"icon":1633,"href":1634,"dataGaLocation":1502,"dataGaName":1635},"Building","/enterprise/","enterprise",{"text":1637,"config":1638},"Small Business",{"icon":1639,"href":1640,"dataGaLocation":1502,"dataGaName":1641},"Work","/small-business/","small business",{"text":1643,"config":1644},"Public Sector",{"icon":1645,"href":1646,"dataGaLocation":1502,"dataGaName":1647},"Organization","/solutions/public-sector/","public sector",{"text":1649,"config":1650},"Pricing",{"href":1651,"dataGaName":1652,"dataGaLocation":1502,"dataNavLevelOne":1652},"/pricing/","pricing",{"text":1654,"config":1655,"menu":1657},"Resources",{"dataNavLevelOne":1656},"resources",{"type":1553,"link":1658,"columns":1662,"feature":1755},{"text":1659,"config":1660},"View all resources",{"href":1661,"dataGaName":1656,"dataGaLocation":1502},"/resources/",[1663,1695,1722],{"title":1664,"items":1665},"Getting started",[1666,1671,1676,1681,1686,1691],{"text":1667,"config":1668},"Install",{"href":1669,"dataGaName":1670,"dataGaLocation":1502},"/install/","install",{"text":1672,"config":1673},"Quick start guides",{"href":1674,"dataGaName":1675,"dataGaLocation":1502},"/get-started/","quick setup checklists",{"text":1677,"config":1678},"Learn",{"href":1679,"dataGaLocation":1502,"dataGaName":1680},"https://university.gitlab.com/","learn",{"text":1682,"config":1683},"Product documentation",{"href":1684,"dataGaName":1685,"dataGaLocation":1502},"https://docs.gitlab.com/","product documentation",{"text":1687,"config":1688},"Best practice videos",{"href":1689,"dataGaName":1690,"dataGaLocation":1502},"/getting-started-videos/","best practice videos",{"text":1692,"config":1693},"Integrations",{"href":1694,"dataGaName":1492,"dataGaLocation":1502},"/integrations/",{"title":1696,"items":1697},"Discover",[1698,1703,1708,1713,1717],{"text":1699,"config":1700},"Customer success stories",{"href":1701,"dataGaName":1702,"dataGaLocation":1502},"/customers/","customer success stories",{"text":1704,"config":1705},"Blog",{"href":1706,"dataGaName":1707,"dataGaLocation":1502},"/blog/","blog",{"text":1709,"config":1710},"Demo Hub",{"href":1711,"dataGaName":1712,"dataGaLocation":1502},"/demo-hub/","demo hub",{"text":1714,"config":1715},"The Source",{"href":1716,"dataGaName":1707,"dataGaLocation":1502},"/the-source/",{"text":1718,"config":1719},"Remote",{"href":1720,"dataGaName":1721,"dataGaLocation":1502},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1723,"items":1724},"Connect",[1725,1730,1735,1740,1745,1750],{"text":1726,"config":1727},"GitLab Services",{"href":1728,"dataGaName":1729,"dataGaLocation":1502},"/services/","services",{"text":1731,"config":1732},"Contribute",{"href":1733,"dataGaName":1734,"dataGaLocation":1502},"https://contributors.gitlab.com","contribute",{"text":1736,"config":1737},"Community",{"href":1738,"dataGaName":1739,"dataGaLocation":1502},"/community/","community",{"text":1741,"config":1742},"Forum",{"href":1743,"dataGaName":1744,"dataGaLocation":1502},"https://forum.gitlab.com/","forum",{"text":1746,"config":1747},"Events",{"href":1748,"dataGaName":1749,"dataGaLocation":1502},"/events/","events",{"text":1751,"config":1752},"Partners",{"href":1753,"dataGaName":1754,"dataGaLocation":1502},"/partners/","partners",{"config":1756,"title":1759,"text":1760,"link":1761},{"background":1757,"textColor":1758},"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":1762,"config":1763},"Read the latest",{"href":1764,"dataGaName":1765,"dataGaLocation":1502},"/whats-new/","whats new",{"text":1767,"config":1768,"menu":1770},"Company",{"dataNavLevelOne":1769},"company",{"type":1553,"columns":1771},[1772],{"items":1773},[1774,1779,1785,1787,1792,1797,1802,1807,1812,1817],{"text":1775,"config":1776},"About",{"href":1777,"dataGaName":1778,"dataGaLocation":1502},"/company/","about",{"text":1780,"config":1781,"footerGa":1784},"Jobs",{"href":1782,"dataGaName":1783,"dataGaLocation":1502},"/jobs/","jobs",{"dataGaName":1783},{"text":1746,"config":1786},{"href":1748,"dataGaName":1749,"dataGaLocation":1502},{"text":1788,"config":1789},"Leadership",{"href":1790,"dataGaName":1791,"dataGaLocation":1502},"/company/team/e-group/","leadership",{"text":1793,"config":1794},"Handbook",{"href":1795,"dataGaName":1796,"dataGaLocation":1502},"https://handbook.gitlab.com/","handbook",{"text":1798,"config":1799},"Investor relations",{"href":1800,"dataGaName":1801,"dataGaLocation":1502},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1803,"config":1804},"Trust Center",{"href":1805,"dataGaName":1806,"dataGaLocation":1502},"/security/","trust center",{"text":1808,"config":1809},"AI Transparency Center",{"href":1810,"dataGaName":1811,"dataGaLocation":1502},"/ai-transparency-center/","ai transparency center",{"text":1813,"config":1814},"Newsletter",{"href":1815,"dataGaName":1816,"dataGaLocation":1502},"/company/contact/#contact-forms","newsletter",{"text":1818,"config":1819},"Press",{"href":1820,"dataGaName":1821,"dataGaLocation":1502},"/press/","press",{"text":1823,"config":1824,"menu":1825},"Contact us",{"dataNavLevelOne":1769},{"type":1553,"columns":1826},[1827],{"items":1828},[1829,1834,1839],{"text":1830,"config":1831},"Talk to sales",{"href":1832,"dataGaName":1833,"dataGaLocation":1502},"/sales/","talk to sales",{"text":1835,"config":1836},"Support portal",{"href":1837,"dataGaName":1838,"dataGaLocation":1502},"https://support.gitlab.com/hc/en-us","support portal",{"text":1840,"config":1841},"Customer portal",{"href":1842,"dataGaName":1843,"dataGaLocation":1502},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1845,"login":1846,"suggestions":1853},"Close",{"text":1847,"link":1848},"To search repositories and projects, login to",{"text":1849,"config":1850},"gitlab.com",{"href":1516,"dataGaName":1851,"dataGaLocation":1852},"search login","search",{"text":1854,"default":1855},"Suggestions",[1856,1858,1862,1864,1868,1872],{"text":1533,"config":1857},{"href":1538,"dataGaName":1533,"dataGaLocation":1852},{"text":1859,"config":1860},"Code Suggestions (AI)",{"href":1861,"dataGaName":1859,"dataGaLocation":1852},"/solutions/code-suggestions/",{"text":1569,"config":1863},{"href":1571,"dataGaName":1569,"dataGaLocation":1852},{"text":1865,"config":1866},"GitLab on AWS",{"href":1867,"dataGaName":1865,"dataGaLocation":1852},"/partners/technology-partners/aws/",{"text":1869,"config":1870},"GitLab on Google Cloud",{"href":1871,"dataGaName":1869,"dataGaLocation":1852},"/partners/technology-partners/google-cloud-platform/",{"text":1873,"config":1874},"Why GitLab?",{"href":1546,"dataGaName":1873,"dataGaLocation":1852},{"freeTrial":1876,"mobileIcon":1881,"desktopIcon":1886,"secondaryButton":1889},{"text":1877,"config":1878},"Start free trial",{"href":1879,"dataGaName":1507,"dataGaLocation":1880},"https://gitlab.com/-/trials/new/","nav",{"altText":1882,"config":1883},"Gitlab Icon",{"src":1884,"dataGaName":1885,"dataGaLocation":1880},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1882,"config":1887},{"src":1888,"dataGaName":1885,"dataGaLocation":1880},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1890,"config":1891},"Get Started",{"href":1892,"dataGaName":1893,"dataGaLocation":1880},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1895,"mobileIcon":1899,"desktopIcon":1901},{"text":1896,"config":1897},"Learn more about GitLab Duo",{"href":1538,"dataGaName":1898,"dataGaLocation":1880},"gitlab duo",{"altText":1882,"config":1900},{"src":1884,"dataGaName":1885,"dataGaLocation":1880},{"altText":1882,"config":1902},{"src":1888,"dataGaName":1885,"dataGaLocation":1880},{"button":1904,"mobileIcon":1909,"desktopIcon":1911},{"text":1905,"config":1906},"/switch",{"href":1907,"dataGaName":1908,"dataGaLocation":1880},"#contact","switch",{"altText":1882,"config":1910},{"src":1884,"dataGaName":1885,"dataGaLocation":1880},{"altText":1882,"config":1912},{"src":1913,"dataGaName":1885,"dataGaLocation":1880},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1915,"mobileIcon":1920,"desktopIcon":1922},{"text":1916,"config":1917},"Back to pricing",{"href":1651,"dataGaName":1918,"dataGaLocation":1880,"icon":1919},"back to pricing","GoBack",{"altText":1882,"config":1921},{"src":1884,"dataGaName":1885,"dataGaLocation":1880},{"altText":1882,"config":1923},{"src":1888,"dataGaName":1885,"dataGaLocation":1880},{"title":1925,"titleMobile":1926,"button":1927,"config":1932},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":1544,"config":1928},{"href":1929,"dataGaName":1930,"dataGaLocation":1931},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1933,"disabled":1480},"release",{"data":1935},{"text":1936,"source":1937,"edit":1943,"contribute":1948,"config":1953,"items":1958,"minimal":2168},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1938,"config":1939},"View page source",{"href":1940,"dataGaName":1941,"dataGaLocation":1942},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1944,"config":1945},"Edit this page",{"href":1946,"dataGaName":1947,"dataGaLocation":1942},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1949,"config":1950},"Please contribute",{"href":1951,"dataGaName":1952,"dataGaLocation":1942},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1954,"facebook":1955,"youtube":1956,"linkedin":1957},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1959,2006,2060,2104,2136],{"title":1649,"links":1960,"subMenu":1975},[1961,1965,1970],{"text":1962,"config":1963},"View plans",{"href":1651,"dataGaName":1964,"dataGaLocation":1942},"view plans",{"text":1966,"config":1967},"Why Premium?",{"href":1968,"dataGaName":1969,"dataGaLocation":1942},"/pricing/premium/","why premium",{"text":1971,"config":1972},"Why Ultimate?",{"href":1973,"dataGaName":1974,"dataGaLocation":1942},"/pricing/ultimate/","why ultimate",[1976],{"title":1977,"links":1978},"Contact Us",[1979,1982,1984,1986,1991,1996,2001],{"text":1980,"config":1981},"Contact sales",{"href":1832,"dataGaName":1512,"dataGaLocation":1942},{"text":1835,"config":1983},{"href":1837,"dataGaName":1838,"dataGaLocation":1942},{"text":1840,"config":1985},{"href":1842,"dataGaName":1843,"dataGaLocation":1942},{"text":1987,"config":1988},"Status",{"href":1989,"dataGaName":1990,"dataGaLocation":1942},"https://status.gitlab.com/","status",{"text":1992,"config":1993},"Terms of use",{"href":1994,"dataGaName":1995,"dataGaLocation":1942},"/terms/","terms of use",{"text":1997,"config":1998},"Privacy statement",{"href":1999,"dataGaName":2000,"dataGaLocation":1942},"/privacy/","privacy statement",{"text":2002,"config":2003},"Cookie preferences",{"dataGaName":2004,"dataGaLocation":1942,"id":2005,"isOneTrustButton":226},"cookie preferences","ot-sdk-btn",{"title":1549,"links":2007,"subMenu":2016},[2008,2012],{"text":2009,"config":2010},"DevSecOps platform",{"href":1531,"dataGaName":2011,"dataGaLocation":1942},"devsecops platform",{"text":2013,"config":2014},"AI-Assisted Development",{"href":1538,"dataGaName":2015,"dataGaLocation":1942},"ai-assisted development",[2017],{"title":2018,"links":2019},"Topics",[2020,2025,2030,2035,2040,2045,2050,2055],{"text":2021,"config":2022},"CICD",{"href":2023,"dataGaName":2024,"dataGaLocation":1942},"/topics/ci-cd/","cicd",{"text":2026,"config":2027},"GitOps",{"href":2028,"dataGaName":2029,"dataGaLocation":1942},"/topics/gitops/","gitops",{"text":2031,"config":2032},"DevOps",{"href":2033,"dataGaName":2034,"dataGaLocation":1942},"/topics/devops/","devops",{"text":2036,"config":2037},"Version Control",{"href":2038,"dataGaName":2039,"dataGaLocation":1942},"/topics/version-control/","version control",{"text":2041,"config":2042},"DevSecOps",{"href":2043,"dataGaName":2044,"dataGaLocation":1942},"/topics/devsecops/","devsecops",{"text":2046,"config":2047},"Cloud Native",{"href":2048,"dataGaName":2049,"dataGaLocation":1942},"/topics/cloud-native/","cloud native",{"text":2051,"config":2052},"AI for Coding",{"href":2053,"dataGaName":2054,"dataGaLocation":1942},"/topics/devops/ai-for-coding/","ai for coding",{"text":2056,"config":2057},"Agentic AI",{"href":2058,"dataGaName":2059,"dataGaLocation":1942},"/topics/agentic-ai/","agentic ai",{"title":2061,"links":2062},"Solutions",[2063,2065,2067,2072,2076,2079,2083,2086,2088,2091,2094,2099],{"text":1593,"config":2064},{"href":1588,"dataGaName":1593,"dataGaLocation":1942},{"text":1582,"config":2066},{"href":1565,"dataGaName":1566,"dataGaLocation":1942},{"text":2068,"config":2069},"Agile development",{"href":2070,"dataGaName":2071,"dataGaLocation":1942},"/solutions/agile-delivery/","agile delivery",{"text":2073,"config":2074},"SCM",{"href":1578,"dataGaName":2075,"dataGaLocation":1942},"source code management",{"text":2021,"config":2077},{"href":1571,"dataGaName":2078,"dataGaLocation":1942},"continuous integration & delivery",{"text":2080,"config":2081},"Value stream management",{"href":1621,"dataGaName":2082,"dataGaLocation":1942},"value stream management",{"text":2026,"config":2084},{"href":2085,"dataGaName":2029,"dataGaLocation":1942},"/solutions/gitops/",{"text":1631,"config":2087},{"href":1634,"dataGaName":1635,"dataGaLocation":1942},{"text":2089,"config":2090},"Small business",{"href":1640,"dataGaName":1641,"dataGaLocation":1942},{"text":2092,"config":2093},"Public sector",{"href":1646,"dataGaName":1647,"dataGaLocation":1942},{"text":2095,"config":2096},"Education",{"href":2097,"dataGaName":2098,"dataGaLocation":1942},"/solutions/education/","education",{"text":2100,"config":2101},"Financial services",{"href":2102,"dataGaName":2103,"dataGaLocation":1942},"/solutions/finance/","financial services",{"title":1654,"links":2105},[2106,2108,2110,2112,2115,2117,2120,2122,2124,2126,2128,2130,2132,2134],{"text":1667,"config":2107},{"href":1669,"dataGaName":1670,"dataGaLocation":1942},{"text":1672,"config":2109},{"href":1674,"dataGaName":1675,"dataGaLocation":1942},{"text":1677,"config":2111},{"href":1679,"dataGaName":1680,"dataGaLocation":1942},{"text":1682,"config":2113},{"href":1684,"dataGaName":2114,"dataGaLocation":1942},"docs",{"text":1704,"config":2116},{"href":1706,"dataGaName":1707,"dataGaLocation":1942},{"text":2118,"config":2119},"What's new",{"href":1764,"dataGaName":1765,"dataGaLocation":1942},{"text":1699,"config":2121},{"href":1701,"dataGaName":1702,"dataGaLocation":1942},{"text":1718,"config":2123},{"href":1720,"dataGaName":1721,"dataGaLocation":1942},{"text":1726,"config":2125},{"href":1728,"dataGaName":1729,"dataGaLocation":1942},{"text":1731,"config":2127},{"href":1733,"dataGaName":1734,"dataGaLocation":1942},{"text":1736,"config":2129},{"href":1738,"dataGaName":1739,"dataGaLocation":1942},{"text":1741,"config":2131},{"href":1743,"dataGaName":1744,"dataGaLocation":1942},{"text":1746,"config":2133},{"href":1748,"dataGaName":1749,"dataGaLocation":1942},{"text":1751,"config":2135},{"href":1753,"dataGaName":1754,"dataGaLocation":1942},{"title":1767,"links":2137},[2138,2140,2142,2144,2146,2148,2152,2157,2159,2161,2163],{"text":1775,"config":2139},{"href":1777,"dataGaName":1769,"dataGaLocation":1942},{"text":1780,"config":2141},{"href":1782,"dataGaName":1783,"dataGaLocation":1942},{"text":1788,"config":2143},{"href":1790,"dataGaName":1791,"dataGaLocation":1942},{"text":1793,"config":2145},{"href":1795,"dataGaName":1796,"dataGaLocation":1942},{"text":1798,"config":2147},{"href":1800,"dataGaName":1801,"dataGaLocation":1942},{"text":2149,"config":2150},"Sustainability",{"href":2151,"dataGaName":2149,"dataGaLocation":1942},"/sustainability/",{"text":2153,"config":2154},"Diversity, inclusion and belonging (DIB)",{"href":2155,"dataGaName":2156,"dataGaLocation":1942},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1803,"config":2158},{"href":1805,"dataGaName":1806,"dataGaLocation":1942},{"text":1813,"config":2160},{"href":1815,"dataGaName":1816,"dataGaLocation":1942},{"text":1818,"config":2162},{"href":1820,"dataGaName":1821,"dataGaLocation":1942},{"text":2164,"config":2165},"Modern Slavery Transparency Statement",{"href":2166,"dataGaName":2167,"dataGaLocation":1942},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2169},[2170,2173,2176],{"text":2171,"config":2172},"Terms",{"href":1994,"dataGaName":1995,"dataGaLocation":1942},{"text":2174,"config":2175},"Cookies",{"dataGaName":2004,"dataGaLocation":1942,"id":2005,"isOneTrustButton":226},{"text":2177,"config":2178},"Privacy",{"href":1999,"dataGaName":2000,"dataGaLocation":1942},[2180],{"id":2181,"title":7,"body":1479,"config":2182,"content":2184,"description":1479,"extension":2188,"meta":2189,"navigation":226,"path":2190,"seo":2191,"stem":2192,"__hash__":2193},"blogAuthors/en-us/blog/authors/michael-friedrich.yml",{"template":2183},"BlogAuthor",{"name":7,"config":2185},{"headshot":2186,"ctfId":2187},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659879/Blog/Author%20Headshots/dnsmichi-headshot.jpg","dnsmichi","yml",{},"/en-us/blog/authors/michael-friedrich",{},"en-us/blog/authors/michael-friedrich","lJ-nfRIhdG49Arfrxdn1Vv4UppwD51BB13S3HwIswt4",[2195,2204,2212],{"title":2196,"description":2197,"heroImage":2198,"category":1475,"date":2199,"authors":2200,"slug":2203,"externalUrl":1479},"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",[2201,2202],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":2205,"description":2206,"heroImage":2207,"category":1475,"date":2208,"authors":2209,"slug":2211,"externalUrl":1479},"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",[2210],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":2213,"description":2214,"heroImage":2215,"category":1475,"date":2216,"authors":2217,"slug":2219,"externalUrl":1479},"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",[2218],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":2221},[2222,2236,2248,2260],{"id":2223,"categories":2224,"header":2226,"text":2227,"button":2228,"image":2233},"ai-modernization",[2225],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":2229,"config":2230},"Get your AI maturity score",{"href":2231,"dataGaName":2232,"dataGaLocation":1707},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":2234},{"src":2235},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2237,"categories":2238,"header":2240,"text":2227,"button":2241,"image":2245},"devops-modernization",[2239,2044],"product","Are you just managing tools or shipping innovation?",{"text":2242,"config":2243},"Get your DevOps maturity score",{"href":2244,"dataGaName":2232,"dataGaLocation":1707},"/assessments/devops-modernization-assessment/",{"config":2246},{"src":2247},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2249,"categories":2250,"header":2252,"text":2227,"button":2253,"image":2257},"security-modernization",[2251],"security","Are you trading speed for security?",{"text":2254,"config":2255},"Get your security maturity score",{"href":2256,"dataGaName":2232,"dataGaLocation":1707},"/assessments/security-modernization-assessment/",{"config":2258},{"src":2259},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2261,"paths":2262,"header":2265,"text":2266,"button":2267,"image":2272},"github-azure-migration",[2263,2264],"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":2268,"config":2269},"See how GitLab compares to GitHub",{"href":2270,"dataGaName":2271,"dataGaLocation":1707},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2273},{"src":2247},{"header":2275,"blurb":2276,"button":2277,"secondaryButton":2282},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":2278,"config":2279},"Get your free trial",{"href":2280,"dataGaName":1507,"dataGaLocation":2281},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1980,"config":2283},{"href":1832,"dataGaName":1512,"dataGaLocation":2281},1786803755443]