[{"data":1,"prerenderedAt":1540},["ShallowReactive",2],{"/blog/gitops-with-gitlab-auto-devops":3,"navigation-en-us":753,"banner-en-us":1181,"footer-en-us":1191,"blog-post-authors-en-us-Viktor Nagy":1435,"blog-related-posts-en-us-gitops-with-gitlab-auto-devops":1450,"blog-promotions-en-us":1476,"next-steps-en-us":1530},{"id":4,"title":5,"authors":6,"body":8,"category":731,"date":732,"description":733,"extension":734,"externalUrl":735,"faq":735,"featured":736,"heroImage":737,"meta":738,"navigation":151,"path":739,"seo":740,"slug":745,"stem":746,"tags":747,"template":751,"updatedDate":735,"__hash__":752},"blogPosts/en-us/blog/gitops-with-gitlab-auto-devops.md","GitOps with GitLab: Connecting GitLab with a Kubernetes cluster - Auto DevOps",[7],"Viktor Nagy",{"type":9,"value":10,"toc":722},"minimark",[11,24,27,32,35,38,42,45,53,57,60,63,66,73,77,80,288,292,644,647,671,674,696,700,703,707,710,718],[12,13,14],"p",{},[15,16,17,18,23],"em",{},"It is possible to use GitLab as a best-in-class GitOps tool, and this blog post series is going to show you how. These easy-to-follow tutorials will focus on different user problems, including provisioning, managing a base infrastructure, and deploying various third-party or custom applications on top of them. You can find the entire \"Ultimate guide to GitOps with GitLab\" tutorial series ",[19,20,22],"a",{"href":21},"/blog/the-ultimate-guide-to-gitops-with-gitlab/","here",".",[12,25,26],{},"In this article we will look at how one can use Auto DevOps with all its bells and whistles to easily manage deployments.",[28,29,31],"h2",{"id":30},"prerequisites","Prerequisites",[12,33,34],{},"This article builds upon the previous tutorials in this series. We will assume that you have a Kubernetes cluster connected to GitLab using the GitLab Agent for Kubernetes, and you understand how the CI/CD tunnel works.",[12,36,37],{},"If this is not the case, I recommend to follow the previous articles to have a similar setup from where we will start today.",[28,39,41],{"id":40},"what-is-auto-devops","What is Auto DevOps",[12,43,44],{},"Auto DevOps is GitLab's answer to the complexity of software application delivery. It is a set of opinionated templates that can be used \"as-is\" or can be used to fast-track your own pipeline building. For some setups it works from testing through various security and compliance checks to canary deployments. Even if you have a less supported setup, you should be able to reuse some of its components, from security linting to deployment.",[12,46,47,48,23],{},"You can read more about the various ",[19,49,52],{"href":50,"rel":51},"https://docs.gitlab.com/topics/autodevops/",[],"features built into Auto DevOps in our documentation",[28,54,56],{"id":55},"the-plan-for-building-and-deploying-a-minimul-application","The plan for building and deploying a minimul application",[12,58,59],{},"The plan for this article is to build and deploy a minimal application. The focus will be on showing how you can get started quickly, without any modifications on the Auto Deploy pipelines.",[12,61,62],{},"This setup will use the already known CI/CD tunnel. There will be a separate article that shows how to replace the \"Auto Deploy\" part of Auto DevOps with GitOps style deployments.",[12,64,65],{},"In this article, we will deploy a simple hello world application. This is not a tutorial about Auto DevOps, so we will only focus on the setup needed when used together with the GitLab Agent for Kubernetes.",[12,67,68,69,23],{},"You can see the final repository under ",[19,70,71],{"href":71,"rel":72},"https://gitlab.com/gitlab-examples/ops/gitops-demo/hello-world-service/",[],[28,74,76],{"id":75},"how-to-build-the-application","How to build the application",[12,78,79],{},"In this section we will create our super simple hello world application and put a Dockerfile beside it.",[81,82,83,87,270,285],"ol",{},[84,85,86],"li",{},"Start a new project.",[84,88,89,90,94,95],{},"Add ",[91,92,93],"code",{},"src/main.py"," with the following content:\n",[96,97,102],"pre",{"className":98,"code":99,"language":100,"meta":101,"style":101},"language-python shiki shiki-themes github-light","# From https://gist.github.com/davidbgk/b10113c3779b8388e96e6d0c44e03a74\nimport http.server\nimport socketserver\nfrom http import HTTPStatus\n\nclass Handler(http.server.SimpleHTTPRequestHandler):\n    def do_GET(self):\n        self.send_response(HTTPStatus.OK)\n        self.end_headers()\n        self.wfile.write(b'Hello world')\n\nhttpd = socketserver.TCPServer(('', 5000), Handler)\nhttpd.serve_forever()\n","python","",[91,103,104,113,124,132,146,153,182,194,210,218,235,240,264],{"__ignoreMap":101},[105,106,109],"span",{"class":107,"line":108},"line",1,[105,110,112],{"class":111},"sAwPA","# From https://gist.github.com/davidbgk/b10113c3779b8388e96e6d0c44e03a74\n",[105,114,116,120],{"class":107,"line":115},2,[105,117,119],{"class":118},"sD7c4","import",[105,121,123],{"class":122},"sgsFI"," http.server\n",[105,125,127,129],{"class":107,"line":126},3,[105,128,119],{"class":118},[105,130,131],{"class":122}," socketserver\n",[105,133,135,138,141,143],{"class":107,"line":134},4,[105,136,137],{"class":118},"from",[105,139,140],{"class":122}," http ",[105,142,119],{"class":118},[105,144,145],{"class":122}," HTTPStatus\n",[105,147,149],{"class":107,"line":148},5,[105,150,152],{"emptyLinePlaceholder":151},true,"\n",[105,154,156,159,163,166,169,171,174,176,179],{"class":107,"line":155},6,[105,157,158],{"class":118},"class",[105,160,162],{"class":161},"s7eDp"," Handler",[105,164,165],{"class":122},"(",[105,167,168],{"class":161},"http",[105,170,23],{"class":122},[105,172,173],{"class":161},"server",[105,175,23],{"class":122},[105,177,178],{"class":161},"SimpleHTTPRequestHandler",[105,180,181],{"class":122},"):\n",[105,183,185,188,191],{"class":107,"line":184},7,[105,186,187],{"class":118},"    def",[105,189,190],{"class":161}," do_GET",[105,192,193],{"class":122},"(self):\n",[105,195,197,201,204,207],{"class":107,"line":196},8,[105,198,200],{"class":199},"sYu0t","        self",[105,202,203],{"class":122},".send_response(HTTPStatus.",[105,205,206],{"class":199},"OK",[105,208,209],{"class":122},")\n",[105,211,213,215],{"class":107,"line":212},9,[105,214,200],{"class":199},[105,216,217],{"class":122},".end_headers()\n",[105,219,221,223,226,229,233],{"class":107,"line":220},10,[105,222,200],{"class":199},[105,224,225],{"class":122},".wfile.write(",[105,227,228],{"class":118},"b",[105,230,232],{"class":231},"sYBdl","'Hello world'",[105,234,209],{"class":122},[105,236,238],{"class":107,"line":237},11,[105,239,152],{"emptyLinePlaceholder":151},[105,241,243,246,249,252,255,258,261],{"class":107,"line":242},12,[105,244,245],{"class":122},"httpd ",[105,247,248],{"class":118},"=",[105,250,251],{"class":122}," socketserver.TCPServer((",[105,253,254],{"class":231},"''",[105,256,257],{"class":122},", ",[105,259,260],{"class":199},"5000",[105,262,263],{"class":122},"), Handler)\n",[105,265,267],{"class":107,"line":266},13,[105,268,269],{"class":122},"httpd.serve_forever()\n",[84,271,272,273,276,277],{},"Create the ",[91,274,275],{},"Dockerfile"," with:\n",[96,278,283],{"className":279,"code":281,"language":282,"meta":101},[280],"language-text","FROM python:3.9.10-slim-bullseye\n\nWORKDIR /app\n\nCOPY ./src .\n\nEXPOSE 5000\n\nCMD [ \"python\", \"main.py\" ]\n","text",[91,284,281],{"__ignoreMap":101},[84,286,287],{},"Commit the change to the repository.",[28,289,291],{"id":290},"how-to-set-up-auto-devops","How to set up Auto DevOps",[81,293,294,344,418,641],{},[84,295,296,301,302],{},[19,297,300],{"href":298,"rel":299},"https://docs.gitlab.com/user/clusters/agent/work_with_agent/",[],"Share the CI/CD tunnel"," with the hello-world project. Note, that the Agent configuration project amd the application project should be in the same project hierarchy and the Agent configuration project needs to be higher in this hierarchy.\n",[96,303,307],{"className":304,"code":305,"language":306,"meta":101,"style":101},"language-yaml shiki shiki-themes github-light","ci_access:\n  # This agent is accessible from CI jobs in projects in these groups\n  projects:\n    - id: \u003Cpath>/\u003Cto>/\u003Cyour>/\u003Cproject>\n","yaml",[91,308,309,318,323,330],{"__ignoreMap":101},[105,310,311,315],{"class":107,"line":108},[105,312,314],{"class":313},"shJU0","ci_access",[105,316,317],{"class":122},":\n",[105,319,320],{"class":107,"line":115},[105,321,322],{"class":111},"  # This agent is accessible from CI jobs in projects in these groups\n",[105,324,325,328],{"class":107,"line":126},[105,326,327],{"class":313},"  projects",[105,329,317],{"class":122},[105,331,332,335,338,341],{"class":107,"line":134},[105,333,334],{"class":122},"    - ",[105,336,337],{"class":313},"id",[105,339,340],{"class":122},": ",[105,342,343],{"class":231},"\u003Cpath>/\u003Cto>/\u003Cyour>/\u003Cproject>\n",[84,345,346,347,350,351],{},"Find out the Kubernetes context name. The agent context name is ",[91,348,349],{},"\u003Cnamespace>/\u003Cgroup>/\u003Cproject>:\u003Cagent-name>",". You can see the available contexts in CI with the following job:\n",[96,352,354],{"className":304,"code":353,"language":306,"meta":101,"style":101},"contexts:\n  stage: .pre\n  image:\n    name: bitnami/kubectl:latest\n    entrypoint: [\"\"]\n  script:\n    - kubectl config get-contexts \n",[91,355,356,363,373,380,390,404,411],{"__ignoreMap":101},[105,357,358,361],{"class":107,"line":108},[105,359,360],{"class":313},"contexts",[105,362,317],{"class":122},[105,364,365,368,370],{"class":107,"line":115},[105,366,367],{"class":313},"  stage",[105,369,340],{"class":122},[105,371,372],{"class":231},".pre\n",[105,374,375,378],{"class":107,"line":126},[105,376,377],{"class":313},"  image",[105,379,317],{"class":122},[105,381,382,385,387],{"class":107,"line":134},[105,383,384],{"class":313},"    name",[105,386,340],{"class":122},[105,388,389],{"class":231},"bitnami/kubectl:latest\n",[105,391,392,395,398,401],{"class":107,"line":148},[105,393,394],{"class":313},"    entrypoint",[105,396,397],{"class":122},": [",[105,399,400],{"class":231},"\"\"",[105,402,403],{"class":122},"]\n",[105,405,406,409],{"class":107,"line":155},[105,407,408],{"class":313},"  script",[105,410,317],{"class":122},[105,412,413,415],{"class":107,"line":184},[105,414,334],{"class":122},[105,416,417],{"class":231},"kubectl config get-contexts\n",[84,419,420,421,424,425],{},"Create your ",[91,422,423],{},".gitlab-ci.yml"," file to have Auto DevOps working:\n",[96,426,428],{"className":304,"code":427,"language":306,"meta":101,"style":101},"include:\n    template: Auto-DevOps.gitlab-ci.yml\n\nvariables:\n    # KUBE_INGRESS_BASE_DOMAIN is the application deployment domain and should be set as a variable at the group or project level.\n    KUBE_INGRESS_BASE_DOMAIN: 74.220.23.215.nip.io\n    KUBE_CONTEXT: \"gitlab-examples/ops/gitops-demo/k8s-agents:demo-agent\"\n    KUBE_NAMESPACE: \"demo-agent\"\n\n    # Feel free to enable any of these\n    TEST_DISABLED: \"true\"\n    CODE_QUALITY_DISABLED: \"true\"\n    LICENSE_MANAGEMENT_DISABLED: \"true\"\n    BROWSER_PERFORMANCE_DISABLED: \"true\"\n    LOAD_PERFORMANCE_DISABLED: \"true\"\n    SAST_DISABLED: \"true\"\n    SECRET_DETECTION_DISABLED: \"true\"\n    DEPENDENCY_SCANNING_DISABLED: \"true\"\n    CONTAINER_SCANNING_DISABLED: \"true\"\n    DAST_DISABLED: \"true\"\n    REVIEW_DISABLED: \"true\"\n    CODE_INTELLIGENCE_DISABLED: \"true\"\n    CLUSTER_IMAGE_SCANNING_DISABLED: \"true\"\n    POSTGRES_ENABLED: \"false\"\n",[91,429,430,437,447,451,458,463,473,483,493,497,502,512,521,530,540,550,560,570,580,590,600,610,620,630],{"__ignoreMap":101},[105,431,432,435],{"class":107,"line":108},[105,433,434],{"class":313},"include",[105,436,317],{"class":122},[105,438,439,442,444],{"class":107,"line":115},[105,440,441],{"class":313},"    template",[105,443,340],{"class":122},[105,445,446],{"class":231},"Auto-DevOps.gitlab-ci.yml\n",[105,448,449],{"class":107,"line":126},[105,450,152],{"emptyLinePlaceholder":151},[105,452,453,456],{"class":107,"line":134},[105,454,455],{"class":313},"variables",[105,457,317],{"class":122},[105,459,460],{"class":107,"line":148},[105,461,462],{"class":111},"    # KUBE_INGRESS_BASE_DOMAIN is the application deployment domain and should be set as a variable at the group or project level.\n",[105,464,465,468,470],{"class":107,"line":155},[105,466,467],{"class":313},"    KUBE_INGRESS_BASE_DOMAIN",[105,469,340],{"class":122},[105,471,472],{"class":231},"74.220.23.215.nip.io\n",[105,474,475,478,480],{"class":107,"line":184},[105,476,477],{"class":313},"    KUBE_CONTEXT",[105,479,340],{"class":122},[105,481,482],{"class":231},"\"gitlab-examples/ops/gitops-demo/k8s-agents:demo-agent\"\n",[105,484,485,488,490],{"class":107,"line":196},[105,486,487],{"class":313},"    KUBE_NAMESPACE",[105,489,340],{"class":122},[105,491,492],{"class":231},"\"demo-agent\"\n",[105,494,495],{"class":107,"line":212},[105,496,152],{"emptyLinePlaceholder":151},[105,498,499],{"class":107,"line":220},[105,500,501],{"class":111},"    # Feel free to enable any of these\n",[105,503,504,507,509],{"class":107,"line":237},[105,505,506],{"class":313},"    TEST_DISABLED",[105,508,340],{"class":122},[105,510,511],{"class":231},"\"true\"\n",[105,513,514,517,519],{"class":107,"line":242},[105,515,516],{"class":313},"    CODE_QUALITY_DISABLED",[105,518,340],{"class":122},[105,520,511],{"class":231},[105,522,523,526,528],{"class":107,"line":266},[105,524,525],{"class":313},"    LICENSE_MANAGEMENT_DISABLED",[105,527,340],{"class":122},[105,529,511],{"class":231},[105,531,533,536,538],{"class":107,"line":532},14,[105,534,535],{"class":313},"    BROWSER_PERFORMANCE_DISABLED",[105,537,340],{"class":122},[105,539,511],{"class":231},[105,541,543,546,548],{"class":107,"line":542},15,[105,544,545],{"class":313},"    LOAD_PERFORMANCE_DISABLED",[105,547,340],{"class":122},[105,549,511],{"class":231},[105,551,553,556,558],{"class":107,"line":552},16,[105,554,555],{"class":313},"    SAST_DISABLED",[105,557,340],{"class":122},[105,559,511],{"class":231},[105,561,563,566,568],{"class":107,"line":562},17,[105,564,565],{"class":313},"    SECRET_DETECTION_DISABLED",[105,567,340],{"class":122},[105,569,511],{"class":231},[105,571,573,576,578],{"class":107,"line":572},18,[105,574,575],{"class":313},"    DEPENDENCY_SCANNING_DISABLED",[105,577,340],{"class":122},[105,579,511],{"class":231},[105,581,583,586,588],{"class":107,"line":582},19,[105,584,585],{"class":313},"    CONTAINER_SCANNING_DISABLED",[105,587,340],{"class":122},[105,589,511],{"class":231},[105,591,593,596,598],{"class":107,"line":592},20,[105,594,595],{"class":313},"    DAST_DISABLED",[105,597,340],{"class":122},[105,599,511],{"class":231},[105,601,603,606,608],{"class":107,"line":602},21,[105,604,605],{"class":313},"    REVIEW_DISABLED",[105,607,340],{"class":122},[105,609,511],{"class":231},[105,611,613,616,618],{"class":107,"line":612},22,[105,614,615],{"class":313},"    CODE_INTELLIGENCE_DISABLED",[105,617,340],{"class":122},[105,619,511],{"class":231},[105,621,623,626,628],{"class":107,"line":622},23,[105,624,625],{"class":313},"    CLUSTER_IMAGE_SCANNING_DISABLED",[105,627,340],{"class":122},[105,629,511],{"class":231},[105,631,633,636,638],{"class":107,"line":632},24,[105,634,635],{"class":313},"    POSTGRES_ENABLED",[105,637,340],{"class":122},[105,639,640],{"class":231},"\"false\"\n",[84,642,643],{},"Commit the changes.",[12,645,646],{},"As you can see, I disabled many Auto DevOps functionalities in the above CI YAML. I did this for two reasons:",[81,648,649,652],{},[84,650,651],{},"Some of these features require a Premium or Ultimate license or tests in the repo. I wanted to keep this tutorial \"stable\" for everyone.",[84,653,654,655,660,661,666,667,670],{},"Every use case differs a little bit and Auto DevOps allows a large number of customizations. I wanted to highlight this by showing you the most basic ones. Read more about ",[19,656,659],{"href":657,"rel":658},"https://docs.gitlab.com/topics/autodevops/customize/",[],"customizing Auto DevOps",". If you would like ",[19,662,665],{"href":663,"rel":664},"https://docs.gitlab.com/ci/review_apps/",[],"Review Apps"," support, just remove the ",[91,668,669],{},"REVIEW_DISABLED"," line.",[12,672,673],{},"There are actually only three settings to get the Auto DevOps pipeline up and running:",[675,676,677,684,690],"ul",{},[84,678,679,680,683],{},"The ",[91,681,682],{},"KUBE_CONTEXT"," specifies the context used for the connection, it's provided by the GitLab Agent for Kubernetes.",[84,685,679,686,689],{},[91,687,688],{},"KUBE_NAMESPACE"," specifies the Kubernetes namespace to target with the deployments. This namespace will be used as we apply the Helm charts used behind the hood.",[84,691,679,692,695],{},[91,693,694],{},"KUBE_INGRESS_BASE_DOMAIN"," sets up an Ingress and enables user friendly access to the deployed service.",[28,697,699],{"id":698},"recap","Recap",[12,701,702],{},"A very common setup I see with GitLab customers is that the development team is responsible for writing the application code and packaging it into a Docker container. During this process, they take care of basic testing as well, but they are not familiar with all the security and compliance requirements or the deployment pipelines used within the company. The presented setup and the Auto DevOps suite of templates serves these teams. As you can see, the teams need minimal GitLab CI setup to run a complex pipeline that can take care of many of their requirements.",[28,704,706],{"id":705},"whats-next","What's next",[12,708,709],{},"In the next article, I will show you how to deploy an application project with a GitOps style workflow.",[12,711,712],{},[15,713,714,717],{},[19,715,716],{"href":21},"Click here"," for the next tutorial.",[719,720,721],"style",{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}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 .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 .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 .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}",{"title":101,"searchDepth":115,"depth":115,"links":723},[724,725,726,727,728,729,730],{"id":30,"depth":115,"text":31},{"id":40,"depth":115,"text":41},{"id":55,"depth":115,"text":56},{"id":75,"depth":115,"text":76},{"id":290,"depth":115,"text":291},{"id":698,"depth":115,"text":699},{"id":705,"depth":115,"text":706},"engineering","2022-02-08","This is the 6th article in a series of tutorials on how to do GitOps with GitLab","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663397/Blog/Hero%20Images/logoforblogpost.jpg",{},"/en-us/blog/gitops-with-gitlab-auto-devops",{"title":741,"description":733,"ogTitle":741,"ogDescription":733,"noIndex":736,"ogImage":737,"ogUrl":742,"ogSiteName":743,"ogType":744,"canonicalUrls":742},"Connecting Kubernetes clusters to GitLab with Auto DevOps","https://about.gitlab.com/blog/gitops-with-gitlab-auto-devops","https://about.gitlab.com","article","gitops-with-gitlab-auto-devops","en-us/blog/gitops-with-gitlab-auto-devops",[748,749,750],"GitOps","kubernetes","tutorial","BlogPost","7dwtBLi8lEDsuk91iZpFyeLpBJIFKKLGsgqOW-Ipq7o",{"logo":754,"freeTrial":759,"sales":764,"login":769,"items":774,"search":1101,"minimal":1132,"duo":1151,"switchNav":1160,"pricingDeployment":1171},{"config":755},{"href":756,"dataGaName":757,"dataGaLocation":758},"/","gitlab logo","header",{"text":760,"config":761},"Get free trial",{"href":762,"dataGaName":763,"dataGaLocation":758},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":765,"config":766},"Request a demo",{"href":767,"dataGaName":768,"dataGaLocation":758},"/sales/?contact-topic=request-demo","sales",{"text":770,"config":771},"Sign in",{"href":772,"dataGaName":773,"dataGaLocation":758},"https://gitlab.com/users/sign_in/","sign in",[775,804,904,909,1023,1079],{"text":776,"config":777,"menu":779},"Platform",{"dataNavLevelOne":778},"platform",{"type":780,"columns":781},"cards",[782,788,796],{"title":776,"description":783,"link":784},"The intelligent orchestration platform for DevSecOps",{"text":785,"config":786},"Explore our Platform",{"href":787,"dataGaName":778,"dataGaLocation":758},"/platform/",{"title":789,"description":790,"link":791},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":792,"config":793},"Meet GitLab Duo",{"href":794,"dataGaName":795,"dataGaLocation":758},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":797,"description":798,"link":799},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":800,"config":801},"Learn more",{"href":802,"dataGaName":803,"dataGaLocation":758},"/why-gitlab/","why gitlab",{"text":805,"left":151,"config":806,"menu":808},"Product",{"dataNavLevelOne":807},"solutions",{"type":809,"link":810,"columns":814,"feature":883},"lists",{"text":811,"config":812},"View all Solutions",{"href":813,"dataGaName":807,"dataGaLocation":758},"/solutions/",[815,839,862],{"title":816,"description":817,"link":818,"items":823},"Automation","CI/CD and automation to accelerate deployment",{"config":819},{"icon":820,"href":821,"dataGaName":822,"dataGaLocation":758},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[824,828,831,835],{"text":825,"config":826},"CI/CD",{"href":827,"dataGaLocation":758,"dataGaName":825},"/solutions/continuous-integration/",{"text":789,"config":829},{"href":794,"dataGaLocation":758,"dataGaName":830},"gitlab duo agent platform - product menu",{"text":832,"config":833},"Source Code Management",{"href":834,"dataGaLocation":758,"dataGaName":832},"/solutions/source-code-management/",{"text":836,"config":837},"Automated Software Delivery",{"href":821,"dataGaLocation":758,"dataGaName":838},"Automated software delivery",{"title":840,"description":841,"link":842,"items":847},"Security","Deliver code faster without compromising security",{"config":843},{"href":844,"dataGaName":845,"dataGaLocation":758,"icon":846},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[848,852,857],{"text":849,"config":850},"Application Security Testing",{"href":844,"dataGaName":851,"dataGaLocation":758},"Application security testing",{"text":853,"config":854},"Software Supply Chain Security",{"href":855,"dataGaLocation":758,"dataGaName":856},"/solutions/supply-chain/","Software supply chain security",{"text":858,"config":859},"Software Compliance",{"href":860,"dataGaName":861,"dataGaLocation":758},"/solutions/software-compliance/","software compliance",{"title":863,"link":864,"items":869},"Measurement",{"config":865},{"icon":866,"href":867,"dataGaName":868,"dataGaLocation":758},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[870,874,878],{"text":871,"config":872},"Visibility & Measurement",{"href":867,"dataGaLocation":758,"dataGaName":873},"Visibility and Measurement",{"text":875,"config":876},"Value Stream Management",{"href":877,"dataGaLocation":758,"dataGaName":875},"/solutions/value-stream-management/",{"text":879,"config":880},"Analytics & Insights",{"href":881,"dataGaLocation":758,"dataGaName":882},"/solutions/analytics-and-insights/","Analytics and insights",{"title":884,"type":809,"items":885},"GitLab for",[886,892,898],{"text":887,"config":888},"Enterprise",{"icon":889,"href":890,"dataGaLocation":758,"dataGaName":891},"Building","/enterprise/","enterprise",{"text":893,"config":894},"Small Business",{"icon":895,"href":896,"dataGaLocation":758,"dataGaName":897},"Work","/small-business/","small business",{"text":899,"config":900},"Public Sector",{"icon":901,"href":902,"dataGaLocation":758,"dataGaName":903},"Organization","/solutions/public-sector/","public sector",{"text":905,"config":906},"Pricing",{"href":907,"dataGaName":908,"dataGaLocation":758,"dataNavLevelOne":908},"/pricing/","pricing",{"text":910,"config":911,"menu":913},"Resources",{"dataNavLevelOne":912},"resources",{"type":809,"link":914,"columns":918,"feature":1012},{"text":915,"config":916},"View all resources",{"href":917,"dataGaName":912,"dataGaLocation":758},"/resources/",[919,952,979],{"title":920,"items":921},"Getting started",[922,927,932,937,942,947],{"text":923,"config":924},"Install",{"href":925,"dataGaName":926,"dataGaLocation":758},"/install/","install",{"text":928,"config":929},"Quick start guides",{"href":930,"dataGaName":931,"dataGaLocation":758},"/get-started/","quick setup checklists",{"text":933,"config":934},"Learn",{"href":935,"dataGaLocation":758,"dataGaName":936},"https://university.gitlab.com/","learn",{"text":938,"config":939},"Product documentation",{"href":940,"dataGaName":941,"dataGaLocation":758},"https://docs.gitlab.com/","product documentation",{"text":943,"config":944},"Best practice videos",{"href":945,"dataGaName":946,"dataGaLocation":758},"/getting-started-videos/","best practice videos",{"text":948,"config":949},"Integrations",{"href":950,"dataGaName":951,"dataGaLocation":758},"/integrations/","integrations",{"title":953,"items":954},"Discover",[955,960,965,970,974],{"text":956,"config":957},"Customer success stories",{"href":958,"dataGaName":959,"dataGaLocation":758},"/customers/","customer success stories",{"text":961,"config":962},"Blog",{"href":963,"dataGaName":964,"dataGaLocation":758},"/blog/","blog",{"text":966,"config":967},"Demo Hub",{"href":968,"dataGaName":969,"dataGaLocation":758},"/demo-hub/","demo hub",{"text":971,"config":972},"The Source",{"href":973,"dataGaName":964,"dataGaLocation":758},"/the-source/",{"text":975,"config":976},"Remote",{"href":977,"dataGaName":978,"dataGaLocation":758},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":980,"items":981},"Connect",[982,987,992,997,1002,1007],{"text":983,"config":984},"GitLab Services",{"href":985,"dataGaName":986,"dataGaLocation":758},"/services/","services",{"text":988,"config":989},"Contribute",{"href":990,"dataGaName":991,"dataGaLocation":758},"https://contributors.gitlab.com","contribute",{"text":993,"config":994},"Community",{"href":995,"dataGaName":996,"dataGaLocation":758},"/community/","community",{"text":998,"config":999},"Forum",{"href":1000,"dataGaName":1001,"dataGaLocation":758},"https://forum.gitlab.com/","forum",{"text":1003,"config":1004},"Events",{"href":1005,"dataGaName":1006,"dataGaLocation":758},"/events/","events",{"text":1008,"config":1009},"Partners",{"href":1010,"dataGaName":1011,"dataGaLocation":758},"/partners/","partners",{"config":1013,"title":1016,"text":1017,"link":1018},{"background":1014,"textColor":1015},"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":1019,"config":1020},"Read the latest",{"href":1021,"dataGaName":1022,"dataGaLocation":758},"/whats-new/","whats new",{"text":1024,"config":1025,"menu":1027},"Company",{"dataNavLevelOne":1026},"company",{"type":809,"columns":1028},[1029],{"items":1030},[1031,1036,1042,1044,1049,1054,1059,1064,1069,1074],{"text":1032,"config":1033},"About",{"href":1034,"dataGaName":1035,"dataGaLocation":758},"/company/","about",{"text":1037,"config":1038,"footerGa":1041},"Jobs",{"href":1039,"dataGaName":1040,"dataGaLocation":758},"/jobs/","jobs",{"dataGaName":1040},{"text":1003,"config":1043},{"href":1005,"dataGaName":1006,"dataGaLocation":758},{"text":1045,"config":1046},"Leadership",{"href":1047,"dataGaName":1048,"dataGaLocation":758},"/company/team/e-group/","leadership",{"text":1050,"config":1051},"Handbook",{"href":1052,"dataGaName":1053,"dataGaLocation":758},"https://handbook.gitlab.com/","handbook",{"text":1055,"config":1056},"Investor relations",{"href":1057,"dataGaName":1058,"dataGaLocation":758},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1060,"config":1061},"Trust Center",{"href":1062,"dataGaName":1063,"dataGaLocation":758},"/security/","trust center",{"text":1065,"config":1066},"AI Transparency Center",{"href":1067,"dataGaName":1068,"dataGaLocation":758},"/ai-transparency-center/","ai transparency center",{"text":1070,"config":1071},"Newsletter",{"href":1072,"dataGaName":1073,"dataGaLocation":758},"/company/contact/#contact-forms","newsletter",{"text":1075,"config":1076},"Press",{"href":1077,"dataGaName":1078,"dataGaLocation":758},"/press/","press",{"text":1080,"config":1081,"menu":1082},"Contact us",{"dataNavLevelOne":1026},{"type":809,"columns":1083},[1084],{"items":1085},[1086,1091,1096],{"text":1087,"config":1088},"Talk to sales",{"href":1089,"dataGaName":1090,"dataGaLocation":758},"/sales/","talk to sales",{"text":1092,"config":1093},"Support portal",{"href":1094,"dataGaName":1095,"dataGaLocation":758},"https://support.gitlab.com/hc/en-us","support portal",{"text":1097,"config":1098},"Customer portal",{"href":1099,"dataGaName":1100,"dataGaLocation":758},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1102,"login":1103,"suggestions":1110},"Close",{"text":1104,"link":1105},"To search repositories and projects, login to",{"text":1106,"config":1107},"gitlab.com",{"href":772,"dataGaName":1108,"dataGaLocation":1109},"search login","search",{"text":1111,"default":1112},"Suggestions",[1113,1115,1119,1121,1125,1129],{"text":789,"config":1114},{"href":794,"dataGaName":789,"dataGaLocation":1109},{"text":1116,"config":1117},"Code Suggestions (AI)",{"href":1118,"dataGaName":1116,"dataGaLocation":1109},"/solutions/code-suggestions/",{"text":825,"config":1120},{"href":827,"dataGaName":825,"dataGaLocation":1109},{"text":1122,"config":1123},"GitLab on AWS",{"href":1124,"dataGaName":1122,"dataGaLocation":1109},"/partners/technology-partners/aws/",{"text":1126,"config":1127},"GitLab on Google Cloud",{"href":1128,"dataGaName":1126,"dataGaLocation":1109},"/partners/technology-partners/google-cloud-platform/",{"text":1130,"config":1131},"Why GitLab?",{"href":802,"dataGaName":1130,"dataGaLocation":1109},{"freeTrial":1133,"mobileIcon":1138,"desktopIcon":1143,"secondaryButton":1146},{"text":1134,"config":1135},"Start free trial",{"href":1136,"dataGaName":763,"dataGaLocation":1137},"https://gitlab.com/-/trials/new/","nav",{"altText":1139,"config":1140},"Gitlab Icon",{"src":1141,"dataGaName":1142,"dataGaLocation":1137},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1139,"config":1144},{"src":1145,"dataGaName":1142,"dataGaLocation":1137},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1147,"config":1148},"Get Started",{"href":1149,"dataGaName":1150,"dataGaLocation":1137},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1152,"mobileIcon":1156,"desktopIcon":1158},{"text":1153,"config":1154},"Learn more about GitLab Duo",{"href":794,"dataGaName":1155,"dataGaLocation":1137},"gitlab duo",{"altText":1139,"config":1157},{"src":1141,"dataGaName":1142,"dataGaLocation":1137},{"altText":1139,"config":1159},{"src":1145,"dataGaName":1142,"dataGaLocation":1137},{"button":1161,"mobileIcon":1166,"desktopIcon":1168},{"text":1162,"config":1163},"/switch",{"href":1164,"dataGaName":1165,"dataGaLocation":1137},"#contact","switch",{"altText":1139,"config":1167},{"src":1141,"dataGaName":1142,"dataGaLocation":1137},{"altText":1139,"config":1169},{"src":1170,"dataGaName":1142,"dataGaLocation":1137},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1172,"mobileIcon":1177,"desktopIcon":1179},{"text":1173,"config":1174},"Back to pricing",{"href":907,"dataGaName":1175,"dataGaLocation":1137,"icon":1176},"back to pricing","GoBack",{"altText":1139,"config":1178},{"src":1141,"dataGaName":1142,"dataGaLocation":1137},{"altText":1139,"config":1180},{"src":1145,"dataGaName":1142,"dataGaLocation":1137},{"title":1182,"titleMobile":1183,"button":1184,"config":1189},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":800,"config":1185},{"href":1186,"dataGaName":1187,"dataGaLocation":1188},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1190,"disabled":736},"release",{"data":1192},{"text":1193,"source":1194,"edit":1200,"contribute":1205,"config":1210,"items":1215,"minimal":1424},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1195,"config":1196},"View page source",{"href":1197,"dataGaName":1198,"dataGaLocation":1199},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1201,"config":1202},"Edit this page",{"href":1203,"dataGaName":1204,"dataGaLocation":1199},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1206,"config":1207},"Please contribute",{"href":1208,"dataGaName":1209,"dataGaLocation":1199},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1211,"facebook":1212,"youtube":1213,"linkedin":1214},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1216,1263,1316,1360,1392],{"title":905,"links":1217,"subMenu":1232},[1218,1222,1227],{"text":1219,"config":1220},"View plans",{"href":907,"dataGaName":1221,"dataGaLocation":1199},"view plans",{"text":1223,"config":1224},"Why Premium?",{"href":1225,"dataGaName":1226,"dataGaLocation":1199},"/pricing/premium/","why premium",{"text":1228,"config":1229},"Why Ultimate?",{"href":1230,"dataGaName":1231,"dataGaLocation":1199},"/pricing/ultimate/","why ultimate",[1233],{"title":1234,"links":1235},"Contact Us",[1236,1239,1241,1243,1248,1253,1258],{"text":1237,"config":1238},"Contact sales",{"href":1089,"dataGaName":768,"dataGaLocation":1199},{"text":1092,"config":1240},{"href":1094,"dataGaName":1095,"dataGaLocation":1199},{"text":1097,"config":1242},{"href":1099,"dataGaName":1100,"dataGaLocation":1199},{"text":1244,"config":1245},"Status",{"href":1246,"dataGaName":1247,"dataGaLocation":1199},"https://status.gitlab.com/","status",{"text":1249,"config":1250},"Terms of use",{"href":1251,"dataGaName":1252,"dataGaLocation":1199},"/terms/","terms of use",{"text":1254,"config":1255},"Privacy statement",{"href":1256,"dataGaName":1257,"dataGaLocation":1199},"/privacy/","privacy statement",{"text":1259,"config":1260},"Cookie preferences",{"dataGaName":1261,"dataGaLocation":1199,"id":1262,"isOneTrustButton":151},"cookie preferences","ot-sdk-btn",{"title":805,"links":1264,"subMenu":1273},[1265,1269],{"text":1266,"config":1267},"DevSecOps platform",{"href":787,"dataGaName":1268,"dataGaLocation":1199},"devsecops platform",{"text":1270,"config":1271},"AI-Assisted Development",{"href":794,"dataGaName":1272,"dataGaLocation":1199},"ai-assisted development",[1274],{"title":1275,"links":1276},"Topics",[1277,1282,1286,1291,1296,1301,1306,1311],{"text":1278,"config":1279},"CICD",{"href":1280,"dataGaName":1281,"dataGaLocation":1199},"/topics/ci-cd/","cicd",{"text":748,"config":1283},{"href":1284,"dataGaName":1285,"dataGaLocation":1199},"/topics/gitops/","gitops",{"text":1287,"config":1288},"DevOps",{"href":1289,"dataGaName":1290,"dataGaLocation":1199},"/topics/devops/","devops",{"text":1292,"config":1293},"Version Control",{"href":1294,"dataGaName":1295,"dataGaLocation":1199},"/topics/version-control/","version control",{"text":1297,"config":1298},"DevSecOps",{"href":1299,"dataGaName":1300,"dataGaLocation":1199},"/topics/devsecops/","devsecops",{"text":1302,"config":1303},"Cloud Native",{"href":1304,"dataGaName":1305,"dataGaLocation":1199},"/topics/cloud-native/","cloud native",{"text":1307,"config":1308},"AI for Coding",{"href":1309,"dataGaName":1310,"dataGaLocation":1199},"/topics/devops/ai-for-coding/","ai for coding",{"text":1312,"config":1313},"Agentic AI",{"href":1314,"dataGaName":1315,"dataGaLocation":1199},"/topics/agentic-ai/","agentic ai",{"title":1317,"links":1318},"Solutions",[1319,1321,1323,1328,1332,1335,1339,1342,1344,1347,1350,1355],{"text":849,"config":1320},{"href":844,"dataGaName":849,"dataGaLocation":1199},{"text":838,"config":1322},{"href":821,"dataGaName":822,"dataGaLocation":1199},{"text":1324,"config":1325},"Agile development",{"href":1326,"dataGaName":1327,"dataGaLocation":1199},"/solutions/agile-delivery/","agile delivery",{"text":1329,"config":1330},"SCM",{"href":834,"dataGaName":1331,"dataGaLocation":1199},"source code management",{"text":1278,"config":1333},{"href":827,"dataGaName":1334,"dataGaLocation":1199},"continuous integration & delivery",{"text":1336,"config":1337},"Value stream management",{"href":877,"dataGaName":1338,"dataGaLocation":1199},"value stream management",{"text":748,"config":1340},{"href":1341,"dataGaName":1285,"dataGaLocation":1199},"/solutions/gitops/",{"text":887,"config":1343},{"href":890,"dataGaName":891,"dataGaLocation":1199},{"text":1345,"config":1346},"Small business",{"href":896,"dataGaName":897,"dataGaLocation":1199},{"text":1348,"config":1349},"Public sector",{"href":902,"dataGaName":903,"dataGaLocation":1199},{"text":1351,"config":1352},"Education",{"href":1353,"dataGaName":1354,"dataGaLocation":1199},"/solutions/education/","education",{"text":1356,"config":1357},"Financial services",{"href":1358,"dataGaName":1359,"dataGaLocation":1199},"/solutions/finance/","financial services",{"title":910,"links":1361},[1362,1364,1366,1368,1371,1373,1376,1378,1380,1382,1384,1386,1388,1390],{"text":923,"config":1363},{"href":925,"dataGaName":926,"dataGaLocation":1199},{"text":928,"config":1365},{"href":930,"dataGaName":931,"dataGaLocation":1199},{"text":933,"config":1367},{"href":935,"dataGaName":936,"dataGaLocation":1199},{"text":938,"config":1369},{"href":940,"dataGaName":1370,"dataGaLocation":1199},"docs",{"text":961,"config":1372},{"href":963,"dataGaName":964,"dataGaLocation":1199},{"text":1374,"config":1375},"What's new",{"href":1021,"dataGaName":1022,"dataGaLocation":1199},{"text":956,"config":1377},{"href":958,"dataGaName":959,"dataGaLocation":1199},{"text":975,"config":1379},{"href":977,"dataGaName":978,"dataGaLocation":1199},{"text":983,"config":1381},{"href":985,"dataGaName":986,"dataGaLocation":1199},{"text":988,"config":1383},{"href":990,"dataGaName":991,"dataGaLocation":1199},{"text":993,"config":1385},{"href":995,"dataGaName":996,"dataGaLocation":1199},{"text":998,"config":1387},{"href":1000,"dataGaName":1001,"dataGaLocation":1199},{"text":1003,"config":1389},{"href":1005,"dataGaName":1006,"dataGaLocation":1199},{"text":1008,"config":1391},{"href":1010,"dataGaName":1011,"dataGaLocation":1199},{"title":1024,"links":1393},[1394,1396,1398,1400,1402,1404,1408,1413,1415,1417,1419],{"text":1032,"config":1395},{"href":1034,"dataGaName":1026,"dataGaLocation":1199},{"text":1037,"config":1397},{"href":1039,"dataGaName":1040,"dataGaLocation":1199},{"text":1045,"config":1399},{"href":1047,"dataGaName":1048,"dataGaLocation":1199},{"text":1050,"config":1401},{"href":1052,"dataGaName":1053,"dataGaLocation":1199},{"text":1055,"config":1403},{"href":1057,"dataGaName":1058,"dataGaLocation":1199},{"text":1405,"config":1406},"Sustainability",{"href":1407,"dataGaName":1405,"dataGaLocation":1199},"/sustainability/",{"text":1409,"config":1410},"Diversity, inclusion and belonging (DIB)",{"href":1411,"dataGaName":1412,"dataGaLocation":1199},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1060,"config":1414},{"href":1062,"dataGaName":1063,"dataGaLocation":1199},{"text":1070,"config":1416},{"href":1072,"dataGaName":1073,"dataGaLocation":1199},{"text":1075,"config":1418},{"href":1077,"dataGaName":1078,"dataGaLocation":1199},{"text":1420,"config":1421},"Modern Slavery Transparency Statement",{"href":1422,"dataGaName":1423,"dataGaLocation":1199},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1425},[1426,1429,1432],{"text":1427,"config":1428},"Terms",{"href":1251,"dataGaName":1252,"dataGaLocation":1199},{"text":1430,"config":1431},"Cookies",{"dataGaName":1261,"dataGaLocation":1199,"id":1262,"isOneTrustButton":151},{"text":1433,"config":1434},"Privacy",{"href":1256,"dataGaName":1257,"dataGaLocation":1199},[1436],{"id":1437,"title":7,"body":735,"config":1438,"content":1440,"description":735,"extension":1444,"meta":1445,"navigation":151,"path":1446,"seo":1447,"stem":1448,"__hash__":1449},"blogAuthors/en-us/blog/authors/viktor-nagy.yml",{"template":1439},"BlogAuthor",{"name":7,"config":1441},{"headshot":1442,"ctfId":1443},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662918/Blog/Author%20Headshots/nagy-headshot.jpg","nagyvgitlab","yml",{},"/en-us/blog/authors/viktor-nagy",{},"en-us/blog/authors/viktor-nagy","rM3QZ5iaPa1fk9rDH9Dq-owlsuuFm699I03jWP1dUY4",[1451,1460,1468],{"title":1452,"description":1453,"heroImage":1454,"category":731,"date":1455,"authors":1456,"slug":1459,"externalUrl":735},"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",[1457,1458],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1461,"description":1462,"heroImage":1463,"category":731,"date":1464,"authors":1465,"slug":1467,"externalUrl":735},"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",[1466],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1469,"description":1470,"heroImage":1471,"category":731,"date":1472,"authors":1473,"slug":1475,"externalUrl":735},"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",[1474],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1477},[1478,1492,1504,1516],{"id":1479,"categories":1480,"header":1482,"text":1483,"button":1484,"image":1489},"ai-modernization",[1481],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1485,"config":1486},"Get your AI maturity score",{"href":1487,"dataGaName":1488,"dataGaLocation":964},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1490},{"src":1491},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1493,"categories":1494,"header":1496,"text":1483,"button":1497,"image":1501},"devops-modernization",[1495,1300],"product","Are you just managing tools or shipping innovation?",{"text":1498,"config":1499},"Get your DevOps maturity score",{"href":1500,"dataGaName":1488,"dataGaLocation":964},"/assessments/devops-modernization-assessment/",{"config":1502},{"src":1503},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1505,"categories":1506,"header":1508,"text":1483,"button":1509,"image":1513},"security-modernization",[1507],"security","Are you trading speed for security?",{"text":1510,"config":1511},"Get your security maturity score",{"href":1512,"dataGaName":1488,"dataGaLocation":964},"/assessments/security-modernization-assessment/",{"config":1514},{"src":1515},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1517,"paths":1518,"header":1521,"text":1522,"button":1523,"image":1528},"github-azure-migration",[1519,1520],"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":1524,"config":1525},"See how GitLab compares to GitHub",{"href":1526,"dataGaName":1527,"dataGaLocation":964},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1529},{"src":1503},{"header":1531,"blurb":1532,"button":1533,"secondaryButton":1538},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1534,"config":1535},"Get your free trial",{"href":1536,"dataGaName":763,"dataGaLocation":1537},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1237,"config":1539},{"href":1089,"dataGaName":768,"dataGaLocation":1537},1786803769111]