[{"data":1,"prerenderedAt":1622},["ShallowReactive",2],{"/blog/gitlab-container-registry":3,"navigation-en-us":836,"banner-en-us":1263,"footer-en-us":1273,"blog-post-authors-en-us-Mark Pundsack":1517,"blog-related-posts-en-us-gitlab-container-registry":1532,"blog-promotions-en-us":1558,"next-steps-en-us":1612},{"id":4,"title":5,"authors":6,"body":8,"category":795,"date":796,"description":797,"extension":798,"externalUrl":799,"faq":799,"featured":800,"heroImage":801,"meta":802,"navigation":425,"path":827,"seo":828,"slug":832,"stem":833,"tags":799,"template":834,"updatedDate":799,"__hash__":835},"blogPosts/en-us/blog/gitlab-container-registry.md","Introducing GitLab Container Registry",[7],"Mark Pundsack",{"type":9,"value":10,"toc":786},"minimark",[11,22,27,35,43,46,55,59,62,65,69,72,99,103,106,123,127,135,141,148,154,179,182,215,221,226,237,241,244,252,273,280,382,393,753,757,765,768,782],[12,13,14,15,21],"p",{},"Yesterday ",[16,17,20],"a",{"href":18,"rel":19},"https://docs.gitlab.com/releases/",[],"we released GitLab 8.8",", super powering GitLab's built-in\ncontinuous integration. With it, you can build a pipeline in GitLab,\nvisualizing your builds, tests, deploys and any other stage of the life cycle of\nyour software. Today (and already in GitLab 8.8), we're releasing the next\nstep: GitLab Container Registry.",[23,24,26],"h2",{"id":25},"what-is-gitlab-container-registry","What is GitLab Container Registry?",[12,28,29,30,34],{},"GitLab Container Registry is a secure and private registry for Docker images.\nBuilt on open source software,\nGitLab Container Registry isn't just a standalone registry;\nit's ",[31,32,33],"em",{},"completely"," integrated with GitLab.",[12,36,37,38,42],{},"GitLab is all about having a single, integrated experience and our registry\nis no exception. You can now easily use your images for ",[16,39,41],{"href":40},"/topics/ci-cd/","GitLab CI",", create\nimages specific for tags or branches and much more.",[12,44,45],{},"Our container registry is the first Docker registry that is\nfully integrated with Git repository management and comes out of the box with\nGitLab 8.8. So if you've upgraded, you already have it!\nThis means our integrated Container Registry requires no additional\ninstallation. It allows for easy upload and download of images\nfrom GitLab CI. And it's free.",[12,47,48,49,54],{},"Read the ",[16,50,53],{"href":51,"rel":52},"https://docs.gitlab.com/administration/packages/container_registry/",[],"administration documentation"," to learn how to enable it\non your GitLab instance. (This documentation covers everything from self-signed certificates to environment variables, garbage collect commands, various APIs, curl commands, setting rate limits, how to use an external registry, and more.)",[23,56,58],{"id":57},"some-docker-basics","Some Docker basics",[12,60,61],{},"The main component of a Docker-based workflow is an image, which contains\neverything needed to run an application. Images are often created automatically\nas part of continuous integration, so they are updated whenever code changes.\nWhen images are built to be shared between developers and machines, they need to\nbe stored somewhere, and that's where a container registry comes in.",[12,63,64],{},"The registry is the place to store (or host) and tag images for later use. Developers may\nwant to maintain their own private registry for private images, or for\nthrow-away images used only in testing. Using GitLab Container Registry means\nyou don't need to set up and administer yet another service, or use a public\nregistry.",[23,66,68],{"id":67},"tight-integration","Tight integration",[12,70,71],{},"GitLab Container Registry is fully-integrated with GitLab making it easy for\ndevelopers to code, test, and deploy Docker container images using GitLab CI\nand other Docker-compatible tooling.",[73,74,75,79,82,90,93,96],"ul",{},[76,77,78],"li",{},"User authentication is from GitLab itself, so all the user and group\ndefinitions are respected.",[76,80,81],{},"There's no need to create repositories in the registry; the project is already\ndefined in GitLab.",[76,83,84,85,89],{},"Projects have a new tab, ",[86,87,88],"strong",{},"Container Registry",", which lists all images\nrelated to the project.",[76,91,92],{},"Every project can have an image repository, but this can be turned off\nper-project.",[76,94,95],{},"Developers can easily upload and download images from GitLab CI.",[76,97,98],{},"There's no need to download or install additional software.",[23,100,102],{"id":101},"how-gitlab-container-registry-can-simplify-your-workflow","How GitLab Container Registry can simplify your workflow",[12,104,105],{},"GitLab Container Registry is seamless and secure.\nHere are some examples of how GitLab Container Registry can simplify your\ndevelopment and deployment workflows:",[73,107,108,111,114,117,120],{},[76,109,110],{},"Easily build Docker images with the help of GitLab CI and store them in the\nGitLab Container Registry.",[76,112,113],{},"Easily create images per branches, tags, or any other way suitable to your\nworkflow, and with little effort, store them on GitLab.",[76,115,116],{},"Use your own build images, stored in your registry to test your applications\nagainst these images, allowing you to simplify the Docker-based workflow.",[76,118,119],{},"Let the team easily contribute to the images, using the same workflow they are\nalready accustomed to. With the help of GitLab CI you can automatically\nrebuild images that inherit from yours, allowing you to easily deliver fixes\nand new features to a base image used by your teams.",[76,121,122],{},"Have a full Continuous Deployment and Delivery workflow by pointing your\nCaaS to use images directly from GitLab Container Registry. You'll be able to\nperform automated deployments of your applications to the cloud\n(Docker Cloud, Docker Swarm, Kubernetes and others) when you build and test\nyour images.",[23,124,126],{"id":125},"how-to-start-using-gitlab-container-registry","How to start using GitLab Container Registry",[12,128,129,130,134],{},"First, ask your system administrator to enable GitLab Container Registry\nfollowing the ",[16,131,53],{"href":132,"rel":133},"https://docs.gitlab.com/administration/container_registry/",[],".",[12,136,137,138,140],{},"After that, you will be allowed to enable ",[86,139,88],{}," for your project.",[12,142,143],{},[144,145],"img",{"alt":146,"src":147},"","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782404838/site/Content%20Images/container-registry/project_feature.png",[12,149,150,151,153],{},"To start using your brand new ",[86,152,88],{}," you first have to login:",[155,156,160],"pre",{"className":157,"code":158,"language":159,"meta":146,"style":146},"language-shell shiki shiki-themes github-light","docker login registry.example.com\n","shell",[161,162,163],"code",{"__ignoreMap":146},[164,165,168,172,176],"span",{"class":166,"line":167},"line",1,[164,169,171],{"class":170},"s7eDp","docker",[164,173,175],{"class":174},"sYBdl"," login",[164,177,178],{"class":174}," registry.example.com\n",[12,180,181],{},"Then you can simply build and push images to GitLab:",[155,183,185],{"className":157,"code":184,"language":159,"meta":146,"style":146},"docker build -t registry.example.com/group/project .\ndocker push registry.example.com/group/project\n",[161,186,187,204],{"__ignoreMap":146},[164,188,189,191,194,198,201],{"class":166,"line":167},[164,190,171],{"class":170},[164,192,193],{"class":174}," build",[164,195,197],{"class":196},"sYu0t"," -t",[164,199,200],{"class":174}," registry.example.com/group/project",[164,202,203],{"class":174}," .\n",[164,205,207,209,212],{"class":166,"line":206},2,[164,208,171],{"class":170},[164,210,211],{"class":174}," push",[164,213,214],{"class":174}," registry.example.com/group/project\n",[12,216,217,218,220],{},"GitLab also offers simple Container Registry management. Go to your project and click ",[86,219,88],{},".\nThis view will show you all tags in your repository and will allow you to delete them and view details about each tag, such as when it was published and how much storage it consumes.",[12,222,223],{},[144,224],{"alt":146,"src":225},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782404838/site/Content%20Images/container-registry/container_registry.png",[227,228,229],"blockquote",{},[12,230,231,232,134],{},"Read more in the ",[16,233,236],{"href":234,"rel":235},"https://docs.gitlab.com/user/packages/container_registry/",[],"GitLab Container Registry user guide",[23,238,240],{"id":239},"use-with-gitlab-ci","Use with GitLab CI",[12,242,243],{},"You can use GitLab's integrated CI solution to build, push, and deploy your\ncontainer images.",[227,245,246],{},[12,247,248,251],{},[86,249,250],{},"Note:"," This feature requires GitLab Runner 1.2.",[227,253,254],{},[12,255,256,258,259,268,269,272],{},[86,257,250],{},"\nTo use Docker in Docker images you need to have ",[16,260,263,264,267],{"href":261,"rel":262},"https://gitlab.com/gitlab-org/gitlab-runner/blob/master/docs/executors/docker.md#use-docker-in-docker-with-privileged-mode",[],"the ",[161,265,266],{},"privileged"," flag","\nset up in your Runner's configuration. This is ",[86,270,271],{},"not"," the case for the shared\nRunners on GitLab.com for now; we plan to enable this flag next week. For the\nmoment you can use your own Runners.",[12,274,275,276,279],{},"Here's an example GitLab CI configuration file (",[161,277,278],{},".gitlab-ci.yml",") which builds\nan image, runs tests, and if the tests are successful, tags the build and\nuploads the build to the container registry:",[155,281,285],{"className":282,"code":283,"language":284,"meta":146,"style":146},"language-yaml shiki shiki-themes github-light","build_image:\n  image: docker:git\n  services:\n  - docker:dind\n  script:\n    - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.example.com\n    - docker build -t registry.example.com/my-group/my-project .\n    - docker run registry.example.com/my-group/my-project /script/to/run/tests\n    - docker push registry.example.com/my-group/my-project:latest\n  only:\n    - master\n\n","yaml",[161,286,287,297,308,316,325,333,342,350,358,366,374],{"__ignoreMap":146},[164,288,289,293],{"class":166,"line":167},[164,290,292],{"class":291},"shJU0","build_image",[164,294,296],{"class":295},"sgsFI",":\n",[164,298,299,302,305],{"class":166,"line":206},[164,300,301],{"class":291},"  image",[164,303,304],{"class":295},": ",[164,306,307],{"class":174},"docker:git\n",[164,309,311,314],{"class":166,"line":310},3,[164,312,313],{"class":291},"  services",[164,315,296],{"class":295},[164,317,319,322],{"class":166,"line":318},4,[164,320,321],{"class":295},"  - ",[164,323,324],{"class":174},"docker:dind\n",[164,326,328,331],{"class":166,"line":327},5,[164,329,330],{"class":291},"  script",[164,332,296],{"class":295},[164,334,336,339],{"class":166,"line":335},6,[164,337,338],{"class":295},"    - ",[164,340,341],{"class":174},"docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.example.com\n",[164,343,345,347],{"class":166,"line":344},7,[164,346,338],{"class":295},[164,348,349],{"class":174},"docker build -t registry.example.com/my-group/my-project .\n",[164,351,353,355],{"class":166,"line":352},8,[164,354,338],{"class":295},[164,356,357],{"class":174},"docker run registry.example.com/my-group/my-project /script/to/run/tests\n",[164,359,361,363],{"class":166,"line":360},9,[164,362,338],{"class":295},[164,364,365],{"class":174},"docker push registry.example.com/my-group/my-project:latest\n",[164,367,369,372],{"class":166,"line":368},10,[164,370,371],{"class":291},"  only",[164,373,296],{"class":295},[164,375,377,379],{"class":166,"line":376},11,[164,378,338],{"class":295},[164,380,381],{"class":174},"master\n",[12,383,384,385,388,389,392],{},"Here's a more elaborate example that splits up the tasks into four stages,\nincluding two tests that run in parallel. The build is stored in the container\nregistry and used by subsequent stages, downloading the image automatically\nwhen needed. Changes to ",[161,386,387],{},"master"," also get tagged as ",[161,390,391],{},"latest"," and deployed using\nan application-specific deploy script:",[155,394,396],{"className":282,"code":395,"language":284,"meta":146,"style":146},"image: docker:git\nservices:\n- docker:dind\n\nstages:\n- build\n- test\n- release\n- deploy\n\nvariables:\n  CONTAINER_TEST_IMAGE: registry.example.com/my-group/my-project:$CI_BUILD_REF_NAME\n  CONTAINER_RELEASE_IMAGE: registry.example.com/my-group/my-project:latest\n\nbefore_script:\n  - docker login -u gitlab-ci-token -p $CI_BUILD_TOKEN registry.example.com\n\nbuild:\n  stage: build\n  script:\n    - docker build -t $CONTAINER_TEST_IMAGE .\n    - docker push $CONTAINER_TEST_IMAGE\n\ntest1:\n  stage: test\n  script:\n    - docker run $CONTAINER_TEST_IMAGE /script/to/run/tests\n\ntest2:\n  stage: test\n  script:\n    - docker run $CONTAINER_TEST_IMAGE /script/to/run/another/test\n\nrelease-image:\n  stage: release\n  script:\n    - docker pull $CONTAINER_TEST_IMAGE\n    - docker tag $CONTAINER_TEST_IMAGE $CONTAINER_RELEASE_IMAGE\n    - docker push $CONTAINER_RELEASE_IMAGE\n  only:\n    - master\n\ndeploy:\n  stage: deploy\n  script:\n    - ./deploy.sh\n  only:\n    - master\n\n",[161,397,398,407,414,421,427,434,441,448,455,462,466,473,484,495,500,508,515,520,528,538,545,553,561,566,574,583,590,598,603,611,620,627,635,640,648,657,664,672,680,688,695,702,707,715,724,731,739,746],{"__ignoreMap":146},[164,399,400,403,405],{"class":166,"line":167},[164,401,402],{"class":291},"image",[164,404,304],{"class":295},[164,406,307],{"class":174},[164,408,409,412],{"class":166,"line":206},[164,410,411],{"class":291},"services",[164,413,296],{"class":295},[164,415,416,419],{"class":166,"line":310},[164,417,418],{"class":295},"- ",[164,420,324],{"class":174},[164,422,423],{"class":166,"line":318},[164,424,426],{"emptyLinePlaceholder":425},true,"\n",[164,428,429,432],{"class":166,"line":327},[164,430,431],{"class":291},"stages",[164,433,296],{"class":295},[164,435,436,438],{"class":166,"line":335},[164,437,418],{"class":295},[164,439,440],{"class":174},"build\n",[164,442,443,445],{"class":166,"line":344},[164,444,418],{"class":295},[164,446,447],{"class":174},"test\n",[164,449,450,452],{"class":166,"line":352},[164,451,418],{"class":295},[164,453,454],{"class":174},"release\n",[164,456,457,459],{"class":166,"line":360},[164,458,418],{"class":295},[164,460,461],{"class":174},"deploy\n",[164,463,464],{"class":166,"line":368},[164,465,426],{"emptyLinePlaceholder":425},[164,467,468,471],{"class":166,"line":376},[164,469,470],{"class":291},"variables",[164,472,296],{"class":295},[164,474,476,479,481],{"class":166,"line":475},12,[164,477,478],{"class":291},"  CONTAINER_TEST_IMAGE",[164,480,304],{"class":295},[164,482,483],{"class":174},"registry.example.com/my-group/my-project:$CI_BUILD_REF_NAME\n",[164,485,487,490,492],{"class":166,"line":486},13,[164,488,489],{"class":291},"  CONTAINER_RELEASE_IMAGE",[164,491,304],{"class":295},[164,493,494],{"class":174},"registry.example.com/my-group/my-project:latest\n",[164,496,498],{"class":166,"line":497},14,[164,499,426],{"emptyLinePlaceholder":425},[164,501,503,506],{"class":166,"line":502},15,[164,504,505],{"class":291},"before_script",[164,507,296],{"class":295},[164,509,511,513],{"class":166,"line":510},16,[164,512,321],{"class":295},[164,514,341],{"class":174},[164,516,518],{"class":166,"line":517},17,[164,519,426],{"emptyLinePlaceholder":425},[164,521,523,526],{"class":166,"line":522},18,[164,524,525],{"class":291},"build",[164,527,296],{"class":295},[164,529,531,534,536],{"class":166,"line":530},19,[164,532,533],{"class":291},"  stage",[164,535,304],{"class":295},[164,537,440],{"class":174},[164,539,541,543],{"class":166,"line":540},20,[164,542,330],{"class":291},[164,544,296],{"class":295},[164,546,548,550],{"class":166,"line":547},21,[164,549,338],{"class":295},[164,551,552],{"class":174},"docker build -t $CONTAINER_TEST_IMAGE .\n",[164,554,556,558],{"class":166,"line":555},22,[164,557,338],{"class":295},[164,559,560],{"class":174},"docker push $CONTAINER_TEST_IMAGE\n",[164,562,564],{"class":166,"line":563},23,[164,565,426],{"emptyLinePlaceholder":425},[164,567,569,572],{"class":166,"line":568},24,[164,570,571],{"class":291},"test1",[164,573,296],{"class":295},[164,575,577,579,581],{"class":166,"line":576},25,[164,578,533],{"class":291},[164,580,304],{"class":295},[164,582,447],{"class":174},[164,584,586,588],{"class":166,"line":585},26,[164,587,330],{"class":291},[164,589,296],{"class":295},[164,591,593,595],{"class":166,"line":592},27,[164,594,338],{"class":295},[164,596,597],{"class":174},"docker run $CONTAINER_TEST_IMAGE /script/to/run/tests\n",[164,599,601],{"class":166,"line":600},28,[164,602,426],{"emptyLinePlaceholder":425},[164,604,606,609],{"class":166,"line":605},29,[164,607,608],{"class":291},"test2",[164,610,296],{"class":295},[164,612,614,616,618],{"class":166,"line":613},30,[164,615,533],{"class":291},[164,617,304],{"class":295},[164,619,447],{"class":174},[164,621,623,625],{"class":166,"line":622},31,[164,624,330],{"class":291},[164,626,296],{"class":295},[164,628,630,632],{"class":166,"line":629},32,[164,631,338],{"class":295},[164,633,634],{"class":174},"docker run $CONTAINER_TEST_IMAGE /script/to/run/another/test\n",[164,636,638],{"class":166,"line":637},33,[164,639,426],{"emptyLinePlaceholder":425},[164,641,643,646],{"class":166,"line":642},34,[164,644,645],{"class":291},"release-image",[164,647,296],{"class":295},[164,649,651,653,655],{"class":166,"line":650},35,[164,652,533],{"class":291},[164,654,304],{"class":295},[164,656,454],{"class":174},[164,658,660,662],{"class":166,"line":659},36,[164,661,330],{"class":291},[164,663,296],{"class":295},[164,665,667,669],{"class":166,"line":666},37,[164,668,338],{"class":295},[164,670,671],{"class":174},"docker pull $CONTAINER_TEST_IMAGE\n",[164,673,675,677],{"class":166,"line":674},38,[164,676,338],{"class":295},[164,678,679],{"class":174},"docker tag $CONTAINER_TEST_IMAGE $CONTAINER_RELEASE_IMAGE\n",[164,681,683,685],{"class":166,"line":682},39,[164,684,338],{"class":295},[164,686,687],{"class":174},"docker push $CONTAINER_RELEASE_IMAGE\n",[164,689,691,693],{"class":166,"line":690},40,[164,692,371],{"class":291},[164,694,296],{"class":295},[164,696,698,700],{"class":166,"line":697},41,[164,699,338],{"class":295},[164,701,381],{"class":174},[164,703,705],{"class":166,"line":704},42,[164,706,426],{"emptyLinePlaceholder":425},[164,708,710,713],{"class":166,"line":709},43,[164,711,712],{"class":291},"deploy",[164,714,296],{"class":295},[164,716,718,720,722],{"class":166,"line":717},44,[164,719,533],{"class":291},[164,721,304],{"class":295},[164,723,461],{"class":174},[164,725,727,729],{"class":166,"line":726},45,[164,728,330],{"class":291},[164,730,296],{"class":295},[164,732,734,736],{"class":166,"line":733},46,[164,735,338],{"class":295},[164,737,738],{"class":174},"./deploy.sh\n",[164,740,742,744],{"class":166,"line":741},47,[164,743,371],{"class":291},[164,745,296],{"class":295},[164,747,749,751],{"class":166,"line":748},48,[164,750,338],{"class":295},[164,752,381],{"class":174},[23,754,756],{"id":755},"summary","Summary",[12,758,759,760,764],{},"GitLab Container Registry is the latest addition to GitLab's integrated set of\ntools for the software development lifecycle and comes with\n",[16,761,763],{"href":18,"rel":762},[],"GitLab 8.8 and up",". With GitLab Container Registry,\ntesting and deploying Docker containers has never been easier.\nGitLab Container Registry is available on-premises in GitLab CE and GitLab EE\nat no additional cost and installs in the same infrastructure as the rest of\nyour GitLab instance.",[12,766,767],{},"Container Registry is enabled on GitLab.com, the pricing is simple (it's completely free), and you can start using it right now!",[227,769,770],{},[12,771,772,258,774,268,779,781],{},[86,773,250],{},[16,775,263,777,267],{"href":261,"rel":776},[],[161,778,266],{},[86,780,271],{}," the case for the shared\nRunners on GitLab.com for now. We plan to enable this flag next week.",[783,784,785],"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 .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 .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}",{"title":146,"searchDepth":206,"depth":206,"links":787},[788,789,790,791,792,793,794],{"id":25,"depth":206,"text":26},{"id":57,"depth":206,"text":58},{"id":67,"depth":206,"text":68},{"id":101,"depth":206,"text":102},{"id":125,"depth":206,"text":126},{"id":239,"depth":206,"text":240},{"id":755,"depth":206,"text":756},"engineering","2016-05-23","Built on open source software, GitLab Container Registry isn't just a standalone registry; it's completely integrated with GitLab.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749665223/Blog/Hero%20Images/containers.jpg",{"excerpt":803},{"type":9,"value":804},[805,810,812,816,820,822],[12,806,14,807,21],{},[16,808,20],{"href":18,"rel":809},[],[23,811,26],{"id":25},[12,813,29,814,34],{},[31,815,33],{},[12,817,37,818,42],{},[16,819,41],{"href":40},[12,821,45],{},[12,823,48,824,54],{},[16,825,53],{"href":51,"rel":826},[],"/en-us/blog/gitlab-container-registry",{"title":5,"description":797,"ogTitle":5,"ogDescription":797,"noIndex":800,"ogImage":801,"ogUrl":829,"ogSiteName":830,"ogType":831,"canonicalUrls":829},"https://about.gitlab.com/blog/gitlab-container-registry","https://about.gitlab.com","article","gitlab-container-registry","en-us/blog/gitlab-container-registry","BlogPost","hhFu_CAsf1rPLOuVrJMtInM_hoybWgkUdOqfINanjdk",{"logo":837,"freeTrial":842,"sales":847,"login":852,"items":857,"search":1183,"minimal":1214,"duo":1233,"switchNav":1242,"pricingDeployment":1253},{"config":838},{"href":839,"dataGaName":840,"dataGaLocation":841},"/","gitlab logo","header",{"text":843,"config":844},"Get free trial",{"href":845,"dataGaName":846,"dataGaLocation":841},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":848,"config":849},"Request a demo",{"href":850,"dataGaName":851,"dataGaLocation":841},"/sales/?contact-topic=request-demo","sales",{"text":853,"config":854},"Sign in",{"href":855,"dataGaName":856,"dataGaLocation":841},"https://gitlab.com/users/sign_in/","sign in",[858,887,987,992,1105,1161],{"text":859,"config":860,"menu":862},"Platform",{"dataNavLevelOne":861},"platform",{"type":863,"columns":864},"cards",[865,871,879],{"title":859,"description":866,"link":867},"The intelligent orchestration platform for DevSecOps",{"text":868,"config":869},"Explore our Platform",{"href":870,"dataGaName":861,"dataGaLocation":841},"/platform/",{"title":872,"description":873,"link":874},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":875,"config":876},"Meet GitLab Duo",{"href":877,"dataGaName":878,"dataGaLocation":841},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":880,"description":881,"link":882},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":883,"config":884},"Learn more",{"href":885,"dataGaName":886,"dataGaLocation":841},"/why-gitlab/","why gitlab",{"text":888,"left":425,"config":889,"menu":891},"Product",{"dataNavLevelOne":890},"solutions",{"type":892,"link":893,"columns":897,"feature":966},"lists",{"text":894,"config":895},"View all Solutions",{"href":896,"dataGaName":890,"dataGaLocation":841},"/solutions/",[898,922,945],{"title":899,"description":900,"link":901,"items":906},"Automation","CI/CD and automation to accelerate deployment",{"config":902},{"icon":903,"href":904,"dataGaName":905,"dataGaLocation":841},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[907,911,914,918],{"text":908,"config":909},"CI/CD",{"href":910,"dataGaLocation":841,"dataGaName":908},"/solutions/continuous-integration/",{"text":872,"config":912},{"href":877,"dataGaLocation":841,"dataGaName":913},"gitlab duo agent platform - product menu",{"text":915,"config":916},"Source Code Management",{"href":917,"dataGaLocation":841,"dataGaName":915},"/solutions/source-code-management/",{"text":919,"config":920},"Automated Software Delivery",{"href":904,"dataGaLocation":841,"dataGaName":921},"Automated software delivery",{"title":923,"description":924,"link":925,"items":930},"Security","Deliver code faster without compromising security",{"config":926},{"href":927,"dataGaName":928,"dataGaLocation":841,"icon":929},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[931,935,940],{"text":932,"config":933},"Application Security Testing",{"href":927,"dataGaName":934,"dataGaLocation":841},"Application security testing",{"text":936,"config":937},"Software Supply Chain Security",{"href":938,"dataGaLocation":841,"dataGaName":939},"/solutions/supply-chain/","Software supply chain security",{"text":941,"config":942},"Software Compliance",{"href":943,"dataGaName":944,"dataGaLocation":841},"/solutions/software-compliance/","software compliance",{"title":946,"link":947,"items":952},"Measurement",{"config":948},{"icon":949,"href":950,"dataGaName":951,"dataGaLocation":841},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[953,957,961],{"text":954,"config":955},"Visibility & Measurement",{"href":950,"dataGaLocation":841,"dataGaName":956},"Visibility and Measurement",{"text":958,"config":959},"Value Stream Management",{"href":960,"dataGaLocation":841,"dataGaName":958},"/solutions/value-stream-management/",{"text":962,"config":963},"Analytics & Insights",{"href":964,"dataGaLocation":841,"dataGaName":965},"/solutions/analytics-and-insights/","Analytics and insights",{"title":967,"type":892,"items":968},"GitLab for",[969,975,981],{"text":970,"config":971},"Enterprise",{"icon":972,"href":973,"dataGaLocation":841,"dataGaName":974},"Building","/enterprise/","enterprise",{"text":976,"config":977},"Small Business",{"icon":978,"href":979,"dataGaLocation":841,"dataGaName":980},"Work","/small-business/","small business",{"text":982,"config":983},"Public Sector",{"icon":984,"href":985,"dataGaLocation":841,"dataGaName":986},"Organization","/solutions/public-sector/","public sector",{"text":988,"config":989},"Pricing",{"href":990,"dataGaName":991,"dataGaLocation":841,"dataNavLevelOne":991},"/pricing/","pricing",{"text":993,"config":994,"menu":996},"Resources",{"dataNavLevelOne":995},"resources",{"type":892,"link":997,"columns":1001,"feature":1094},{"text":998,"config":999},"View all resources",{"href":1000,"dataGaName":995,"dataGaLocation":841},"/resources/",[1002,1035,1062],{"title":1003,"items":1004},"Getting started",[1005,1010,1015,1020,1025,1030],{"text":1006,"config":1007},"Install",{"href":1008,"dataGaName":1009,"dataGaLocation":841},"/install/","install",{"text":1011,"config":1012},"Quick start guides",{"href":1013,"dataGaName":1014,"dataGaLocation":841},"/get-started/","quick setup checklists",{"text":1016,"config":1017},"Learn",{"href":1018,"dataGaLocation":841,"dataGaName":1019},"https://university.gitlab.com/","learn",{"text":1021,"config":1022},"Product documentation",{"href":1023,"dataGaName":1024,"dataGaLocation":841},"https://docs.gitlab.com/","product documentation",{"text":1026,"config":1027},"Best practice videos",{"href":1028,"dataGaName":1029,"dataGaLocation":841},"/getting-started-videos/","best practice videos",{"text":1031,"config":1032},"Integrations",{"href":1033,"dataGaName":1034,"dataGaLocation":841},"/integrations/","integrations",{"title":1036,"items":1037},"Discover",[1038,1043,1048,1053,1057],{"text":1039,"config":1040},"Customer success stories",{"href":1041,"dataGaName":1042,"dataGaLocation":841},"/customers/","customer success stories",{"text":1044,"config":1045},"Blog",{"href":1046,"dataGaName":1047,"dataGaLocation":841},"/blog/","blog",{"text":1049,"config":1050},"Demo Hub",{"href":1051,"dataGaName":1052,"dataGaLocation":841},"/demo-hub/","demo hub",{"text":1054,"config":1055},"The Source",{"href":1056,"dataGaName":1047,"dataGaLocation":841},"/the-source/",{"text":1058,"config":1059},"Remote",{"href":1060,"dataGaName":1061,"dataGaLocation":841},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1063,"items":1064},"Connect",[1065,1069,1074,1079,1084,1089],{"text":1066,"config":1067},"GitLab Services",{"href":1068,"dataGaName":411,"dataGaLocation":841},"/services/",{"text":1070,"config":1071},"Contribute",{"href":1072,"dataGaName":1073,"dataGaLocation":841},"https://contributors.gitlab.com","contribute",{"text":1075,"config":1076},"Community",{"href":1077,"dataGaName":1078,"dataGaLocation":841},"/community/","community",{"text":1080,"config":1081},"Forum",{"href":1082,"dataGaName":1083,"dataGaLocation":841},"https://forum.gitlab.com/","forum",{"text":1085,"config":1086},"Events",{"href":1087,"dataGaName":1088,"dataGaLocation":841},"/events/","events",{"text":1090,"config":1091},"Partners",{"href":1092,"dataGaName":1093,"dataGaLocation":841},"/partners/","partners",{"config":1095,"title":1098,"text":1099,"link":1100},{"background":1096,"textColor":1097},"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":1101,"config":1102},"Read the latest",{"href":1103,"dataGaName":1104,"dataGaLocation":841},"/whats-new/","whats new",{"text":1106,"config":1107,"menu":1109},"Company",{"dataNavLevelOne":1108},"company",{"type":892,"columns":1110},[1111],{"items":1112},[1113,1118,1124,1126,1131,1136,1141,1146,1151,1156],{"text":1114,"config":1115},"About",{"href":1116,"dataGaName":1117,"dataGaLocation":841},"/company/","about",{"text":1119,"config":1120,"footerGa":1123},"Jobs",{"href":1121,"dataGaName":1122,"dataGaLocation":841},"/jobs/","jobs",{"dataGaName":1122},{"text":1085,"config":1125},{"href":1087,"dataGaName":1088,"dataGaLocation":841},{"text":1127,"config":1128},"Leadership",{"href":1129,"dataGaName":1130,"dataGaLocation":841},"/company/team/e-group/","leadership",{"text":1132,"config":1133},"Handbook",{"href":1134,"dataGaName":1135,"dataGaLocation":841},"https://handbook.gitlab.com/","handbook",{"text":1137,"config":1138},"Investor relations",{"href":1139,"dataGaName":1140,"dataGaLocation":841},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1142,"config":1143},"Trust Center",{"href":1144,"dataGaName":1145,"dataGaLocation":841},"/security/","trust center",{"text":1147,"config":1148},"AI Transparency Center",{"href":1149,"dataGaName":1150,"dataGaLocation":841},"/ai-transparency-center/","ai transparency center",{"text":1152,"config":1153},"Newsletter",{"href":1154,"dataGaName":1155,"dataGaLocation":841},"/company/contact/#contact-forms","newsletter",{"text":1157,"config":1158},"Press",{"href":1159,"dataGaName":1160,"dataGaLocation":841},"/press/","press",{"text":1162,"config":1163,"menu":1164},"Contact us",{"dataNavLevelOne":1108},{"type":892,"columns":1165},[1166],{"items":1167},[1168,1173,1178],{"text":1169,"config":1170},"Talk to sales",{"href":1171,"dataGaName":1172,"dataGaLocation":841},"/sales/","talk to sales",{"text":1174,"config":1175},"Support portal",{"href":1176,"dataGaName":1177,"dataGaLocation":841},"https://support.gitlab.com/hc/en-us","support portal",{"text":1179,"config":1180},"Customer portal",{"href":1181,"dataGaName":1182,"dataGaLocation":841},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1184,"login":1185,"suggestions":1192},"Close",{"text":1186,"link":1187},"To search repositories and projects, login to",{"text":1188,"config":1189},"gitlab.com",{"href":855,"dataGaName":1190,"dataGaLocation":1191},"search login","search",{"text":1193,"default":1194},"Suggestions",[1195,1197,1201,1203,1207,1211],{"text":872,"config":1196},{"href":877,"dataGaName":872,"dataGaLocation":1191},{"text":1198,"config":1199},"Code Suggestions (AI)",{"href":1200,"dataGaName":1198,"dataGaLocation":1191},"/solutions/code-suggestions/",{"text":908,"config":1202},{"href":910,"dataGaName":908,"dataGaLocation":1191},{"text":1204,"config":1205},"GitLab on AWS",{"href":1206,"dataGaName":1204,"dataGaLocation":1191},"/partners/technology-partners/aws/",{"text":1208,"config":1209},"GitLab on Google Cloud",{"href":1210,"dataGaName":1208,"dataGaLocation":1191},"/partners/technology-partners/google-cloud-platform/",{"text":1212,"config":1213},"Why GitLab?",{"href":885,"dataGaName":1212,"dataGaLocation":1191},{"freeTrial":1215,"mobileIcon":1220,"desktopIcon":1225,"secondaryButton":1228},{"text":1216,"config":1217},"Start free trial",{"href":1218,"dataGaName":846,"dataGaLocation":1219},"https://gitlab.com/-/trials/new/","nav",{"altText":1221,"config":1222},"Gitlab Icon",{"src":1223,"dataGaName":1224,"dataGaLocation":1219},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1221,"config":1226},{"src":1227,"dataGaName":1224,"dataGaLocation":1219},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1229,"config":1230},"Get Started",{"href":1231,"dataGaName":1232,"dataGaLocation":1219},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1234,"mobileIcon":1238,"desktopIcon":1240},{"text":1235,"config":1236},"Learn more about GitLab Duo",{"href":877,"dataGaName":1237,"dataGaLocation":1219},"gitlab duo",{"altText":1221,"config":1239},{"src":1223,"dataGaName":1224,"dataGaLocation":1219},{"altText":1221,"config":1241},{"src":1227,"dataGaName":1224,"dataGaLocation":1219},{"button":1243,"mobileIcon":1248,"desktopIcon":1250},{"text":1244,"config":1245},"/switch",{"href":1246,"dataGaName":1247,"dataGaLocation":1219},"#contact","switch",{"altText":1221,"config":1249},{"src":1223,"dataGaName":1224,"dataGaLocation":1219},{"altText":1221,"config":1251},{"src":1252,"dataGaName":1224,"dataGaLocation":1219},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1254,"mobileIcon":1259,"desktopIcon":1261},{"text":1255,"config":1256},"Back to pricing",{"href":990,"dataGaName":1257,"dataGaLocation":1219,"icon":1258},"back to pricing","GoBack",{"altText":1221,"config":1260},{"src":1223,"dataGaName":1224,"dataGaLocation":1219},{"altText":1221,"config":1262},{"src":1227,"dataGaName":1224,"dataGaLocation":1219},{"title":1264,"titleMobile":1265,"button":1266,"config":1271},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":883,"config":1267},{"href":1268,"dataGaName":1269,"dataGaLocation":1270},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1272,"disabled":800},"release",{"data":1274},{"text":1275,"source":1276,"edit":1282,"contribute":1287,"config":1292,"items":1297,"minimal":1506},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1277,"config":1278},"View page source",{"href":1279,"dataGaName":1280,"dataGaLocation":1281},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1283,"config":1284},"Edit this page",{"href":1285,"dataGaName":1286,"dataGaLocation":1281},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1288,"config":1289},"Please contribute",{"href":1290,"dataGaName":1291,"dataGaLocation":1281},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1293,"facebook":1294,"youtube":1295,"linkedin":1296},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1298,1345,1398,1442,1474],{"title":988,"links":1299,"subMenu":1314},[1300,1304,1309],{"text":1301,"config":1302},"View plans",{"href":990,"dataGaName":1303,"dataGaLocation":1281},"view plans",{"text":1305,"config":1306},"Why Premium?",{"href":1307,"dataGaName":1308,"dataGaLocation":1281},"/pricing/premium/","why premium",{"text":1310,"config":1311},"Why Ultimate?",{"href":1312,"dataGaName":1313,"dataGaLocation":1281},"/pricing/ultimate/","why ultimate",[1315],{"title":1316,"links":1317},"Contact Us",[1318,1321,1323,1325,1330,1335,1340],{"text":1319,"config":1320},"Contact sales",{"href":1171,"dataGaName":851,"dataGaLocation":1281},{"text":1174,"config":1322},{"href":1176,"dataGaName":1177,"dataGaLocation":1281},{"text":1179,"config":1324},{"href":1181,"dataGaName":1182,"dataGaLocation":1281},{"text":1326,"config":1327},"Status",{"href":1328,"dataGaName":1329,"dataGaLocation":1281},"https://status.gitlab.com/","status",{"text":1331,"config":1332},"Terms of use",{"href":1333,"dataGaName":1334,"dataGaLocation":1281},"/terms/","terms of use",{"text":1336,"config":1337},"Privacy statement",{"href":1338,"dataGaName":1339,"dataGaLocation":1281},"/privacy/","privacy statement",{"text":1341,"config":1342},"Cookie preferences",{"dataGaName":1343,"dataGaLocation":1281,"id":1344,"isOneTrustButton":425},"cookie preferences","ot-sdk-btn",{"title":888,"links":1346,"subMenu":1355},[1347,1351],{"text":1348,"config":1349},"DevSecOps platform",{"href":870,"dataGaName":1350,"dataGaLocation":1281},"devsecops platform",{"text":1352,"config":1353},"AI-Assisted Development",{"href":877,"dataGaName":1354,"dataGaLocation":1281},"ai-assisted development",[1356],{"title":1357,"links":1358},"Topics",[1359,1363,1368,1373,1378,1383,1388,1393],{"text":1360,"config":1361},"CICD",{"href":40,"dataGaName":1362,"dataGaLocation":1281},"cicd",{"text":1364,"config":1365},"GitOps",{"href":1366,"dataGaName":1367,"dataGaLocation":1281},"/topics/gitops/","gitops",{"text":1369,"config":1370},"DevOps",{"href":1371,"dataGaName":1372,"dataGaLocation":1281},"/topics/devops/","devops",{"text":1374,"config":1375},"Version Control",{"href":1376,"dataGaName":1377,"dataGaLocation":1281},"/topics/version-control/","version control",{"text":1379,"config":1380},"DevSecOps",{"href":1381,"dataGaName":1382,"dataGaLocation":1281},"/topics/devsecops/","devsecops",{"text":1384,"config":1385},"Cloud Native",{"href":1386,"dataGaName":1387,"dataGaLocation":1281},"/topics/cloud-native/","cloud native",{"text":1389,"config":1390},"AI for Coding",{"href":1391,"dataGaName":1392,"dataGaLocation":1281},"/topics/devops/ai-for-coding/","ai for coding",{"text":1394,"config":1395},"Agentic AI",{"href":1396,"dataGaName":1397,"dataGaLocation":1281},"/topics/agentic-ai/","agentic ai",{"title":1399,"links":1400},"Solutions",[1401,1403,1405,1410,1414,1417,1421,1424,1426,1429,1432,1437],{"text":932,"config":1402},{"href":927,"dataGaName":932,"dataGaLocation":1281},{"text":921,"config":1404},{"href":904,"dataGaName":905,"dataGaLocation":1281},{"text":1406,"config":1407},"Agile development",{"href":1408,"dataGaName":1409,"dataGaLocation":1281},"/solutions/agile-delivery/","agile delivery",{"text":1411,"config":1412},"SCM",{"href":917,"dataGaName":1413,"dataGaLocation":1281},"source code management",{"text":1360,"config":1415},{"href":910,"dataGaName":1416,"dataGaLocation":1281},"continuous integration & delivery",{"text":1418,"config":1419},"Value stream management",{"href":960,"dataGaName":1420,"dataGaLocation":1281},"value stream management",{"text":1364,"config":1422},{"href":1423,"dataGaName":1367,"dataGaLocation":1281},"/solutions/gitops/",{"text":970,"config":1425},{"href":973,"dataGaName":974,"dataGaLocation":1281},{"text":1427,"config":1428},"Small business",{"href":979,"dataGaName":980,"dataGaLocation":1281},{"text":1430,"config":1431},"Public sector",{"href":985,"dataGaName":986,"dataGaLocation":1281},{"text":1433,"config":1434},"Education",{"href":1435,"dataGaName":1436,"dataGaLocation":1281},"/solutions/education/","education",{"text":1438,"config":1439},"Financial services",{"href":1440,"dataGaName":1441,"dataGaLocation":1281},"/solutions/finance/","financial services",{"title":993,"links":1443},[1444,1446,1448,1450,1453,1455,1458,1460,1462,1464,1466,1468,1470,1472],{"text":1006,"config":1445},{"href":1008,"dataGaName":1009,"dataGaLocation":1281},{"text":1011,"config":1447},{"href":1013,"dataGaName":1014,"dataGaLocation":1281},{"text":1016,"config":1449},{"href":1018,"dataGaName":1019,"dataGaLocation":1281},{"text":1021,"config":1451},{"href":1023,"dataGaName":1452,"dataGaLocation":1281},"docs",{"text":1044,"config":1454},{"href":1046,"dataGaName":1047,"dataGaLocation":1281},{"text":1456,"config":1457},"What's new",{"href":1103,"dataGaName":1104,"dataGaLocation":1281},{"text":1039,"config":1459},{"href":1041,"dataGaName":1042,"dataGaLocation":1281},{"text":1058,"config":1461},{"href":1060,"dataGaName":1061,"dataGaLocation":1281},{"text":1066,"config":1463},{"href":1068,"dataGaName":411,"dataGaLocation":1281},{"text":1070,"config":1465},{"href":1072,"dataGaName":1073,"dataGaLocation":1281},{"text":1075,"config":1467},{"href":1077,"dataGaName":1078,"dataGaLocation":1281},{"text":1080,"config":1469},{"href":1082,"dataGaName":1083,"dataGaLocation":1281},{"text":1085,"config":1471},{"href":1087,"dataGaName":1088,"dataGaLocation":1281},{"text":1090,"config":1473},{"href":1092,"dataGaName":1093,"dataGaLocation":1281},{"title":1106,"links":1475},[1476,1478,1480,1482,1484,1486,1490,1495,1497,1499,1501],{"text":1114,"config":1477},{"href":1116,"dataGaName":1108,"dataGaLocation":1281},{"text":1119,"config":1479},{"href":1121,"dataGaName":1122,"dataGaLocation":1281},{"text":1127,"config":1481},{"href":1129,"dataGaName":1130,"dataGaLocation":1281},{"text":1132,"config":1483},{"href":1134,"dataGaName":1135,"dataGaLocation":1281},{"text":1137,"config":1485},{"href":1139,"dataGaName":1140,"dataGaLocation":1281},{"text":1487,"config":1488},"Sustainability",{"href":1489,"dataGaName":1487,"dataGaLocation":1281},"/sustainability/",{"text":1491,"config":1492},"Diversity, inclusion and belonging (DIB)",{"href":1493,"dataGaName":1494,"dataGaLocation":1281},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1142,"config":1496},{"href":1144,"dataGaName":1145,"dataGaLocation":1281},{"text":1152,"config":1498},{"href":1154,"dataGaName":1155,"dataGaLocation":1281},{"text":1157,"config":1500},{"href":1159,"dataGaName":1160,"dataGaLocation":1281},{"text":1502,"config":1503},"Modern Slavery Transparency Statement",{"href":1504,"dataGaName":1505,"dataGaLocation":1281},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1507},[1508,1511,1514],{"text":1509,"config":1510},"Terms",{"href":1333,"dataGaName":1334,"dataGaLocation":1281},{"text":1512,"config":1513},"Cookies",{"dataGaName":1343,"dataGaLocation":1281,"id":1344,"isOneTrustButton":425},{"text":1515,"config":1516},"Privacy",{"href":1338,"dataGaName":1339,"dataGaLocation":1281},[1518],{"id":1519,"title":7,"body":799,"config":1520,"content":1522,"description":799,"extension":1526,"meta":1527,"navigation":425,"path":1528,"seo":1529,"stem":1530,"__hash__":1531},"blogAuthors/en-us/blog/authors/mark-pundsack.yml",{"template":1521},"BlogAuthor",{"name":7,"config":1523},{"headshot":1524,"ctfId":1525},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","markpundsack","yml",{},"/en-us/blog/authors/mark-pundsack",{},"en-us/blog/authors/mark-pundsack","0XkJx2hq2Kagj8C3zTex7xC4ZA-fT8eE1Uo1cML1zhU",[1533,1542,1550],{"title":1534,"description":1535,"heroImage":1536,"category":795,"date":1537,"authors":1538,"slug":1541,"externalUrl":799},"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",[1539,1540],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1543,"description":1544,"heroImage":1545,"category":795,"date":1546,"authors":1547,"slug":1549,"externalUrl":799},"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",[1548],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1551,"description":1552,"heroImage":1553,"category":795,"date":1554,"authors":1555,"slug":1557,"externalUrl":799},"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",[1556],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1559},[1560,1574,1586,1598],{"id":1561,"categories":1562,"header":1564,"text":1565,"button":1566,"image":1571},"ai-modernization",[1563],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1567,"config":1568},"Get your AI maturity score",{"href":1569,"dataGaName":1570,"dataGaLocation":1047},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1572},{"src":1573},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1575,"categories":1576,"header":1578,"text":1565,"button":1579,"image":1583},"devops-modernization",[1577,1382],"product","Are you just managing tools or shipping innovation?",{"text":1580,"config":1581},"Get your DevOps maturity score",{"href":1582,"dataGaName":1570,"dataGaLocation":1047},"/assessments/devops-modernization-assessment/",{"config":1584},{"src":1585},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1587,"categories":1588,"header":1590,"text":1565,"button":1591,"image":1595},"security-modernization",[1589],"security","Are you trading speed for security?",{"text":1592,"config":1593},"Get your security maturity score",{"href":1594,"dataGaName":1570,"dataGaLocation":1047},"/assessments/security-modernization-assessment/",{"config":1596},{"src":1597},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1599,"paths":1600,"header":1603,"text":1604,"button":1605,"image":1610},"github-azure-migration",[1601,1602],"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":1606,"config":1607},"See how GitLab compares to GitHub",{"href":1608,"dataGaName":1609,"dataGaLocation":1047},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1611},{"src":1585},{"header":1613,"blurb":1614,"button":1615,"secondaryButton":1620},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1616,"config":1617},"Get your free trial",{"href":1618,"dataGaName":846,"dataGaLocation":1619},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1319,"config":1621},{"href":1171,"dataGaName":851,"dataGaLocation":1619},1786803750206]