[{"data":1,"prerenderedAt":1465},["ShallowReactive",2],{"/blog/building-gitlab-with-gitlab-a-multi-region-service-to-deliver-ai-features":3,"navigation-en-us":667,"banner-en-us":1094,"footer-en-us":1104,"blog-post-authors-en-us-Chance Feick|Sam Wiskow":1348,"blog-related-posts-en-us-building-gitlab-with-gitlab-a-multi-region-service-to-deliver-ai-features":1375,"blog-promotions-en-us":1401,"next-steps-en-us":1455},{"id":4,"title":5,"authors":6,"body":9,"category":640,"date":641,"description":642,"extension":643,"externalUrl":644,"faq":644,"featured":409,"heroImage":645,"meta":646,"navigation":409,"path":647,"seo":648,"slug":653,"stem":654,"tags":655,"template":665,"updatedDate":644,"__hash__":666},"blogPosts/en-us/blog/building-gitlab-with-gitlab-a-multi-region-service-to-deliver-ai-features.md","Building GitLab with GitLab: A multi-region service to deliver AI features",[7,8],"Chance Feick","Sam Wiskow",{"type":10,"value":11,"toc":621},"minimark",[12,23,26,31,46,49,58,62,65,68,73,76,79,83,86,89,92,99,102,106,109,113,116,119,140,149,152,270,273,277,286,289,297,306,321,324,416,419,422,426,435,441,450,456,459,462,468,471,475,478,481,485,488,494,497,501,504,507,513,523,526,532,538,541,545,548,557,560,564,567,574,578,617],[13,14,15,16,22],"p",{},"For GitLab Duo, real-time AI-powered capabilities like ",[17,18,21],"a",{"href":19,"rel":20},"https://about.gitlab.com/solutions/code-suggestions/",[],"Code Suggestions"," need low-latency response times for a frictionless developer experience. Users don’t want to interrupt their flow and wait for a code suggestion to show up. To ensure GitLab Duo can provide the right suggestion at the right time and meet high performance standards for critical AI infrastructure, GitLab recently launched our first multi-region service to deliver AI features.",[13,24,25],{},"In this article, we will cover the benefits of multi-region services, how we built an internal platform codenamed ‘Runway’ for provisioning and deploying multi-region services using GitLab features, and the lessons learned migrating to multi-region in production.",[27,28,30],"h2",{"id":29},"background-on-the-project","Background on the project",[13,32,33,34,39,40,45],{},"Runway is GitLab’s internal platform as a service (PaaS) for provisioning, deploying, and operating containerized services. Runway's purpose is to enable GitLab service owners to self-serve infrastructure needs with production readiness out of the box, so application developers can focus on providing value to customers. As part of ",[17,35,38],{"href":36,"rel":37},"https://handbook.gitlab.com/handbook/values/#results",[],"our corporate value of dogfooding",", the first iteration was built in 2023 by the Infrastructure department on top of core GitLab capabilities, such as continuous integration/continuous delivery (",[17,41,44],{"href":42,"rel":43},"https://about.gitlab.com/topics/ci-cd/",[],"CI/CD","), environments, and deployments.",[13,47,48],{},"By establishing automated GitOps best practices, Runway services use infrastructure as code (IaC), merge requests (MRs), and CI/CD by default.",[13,50,51,52,57],{},"GitLab Duo is primarily powered by ",[17,53,56],{"href":54,"rel":55},"https://gitlab.com/gitlab-org/modelops/applied-ml/code-suggestions/ai-assist",[],"AI Gateway",", a satellite service written in Python outside of GitLab’s modular monolith written in Ruby. In cloud computing, a region is a geographical location of data centers operated by cloud providers.",[27,59,61],{"id":60},"defining-a-multi-region-strategy","Defining a multi-region strategy",[13,63,64],{},"Deploying in a single region is a good starting point for most services, but can come with downsides when you are trying to reach a global audience. Users who are geographically far from where your service is deployed may experience different levels of service and responsiveness than those who are closer. This can lead to a poor user experience, even if your service is well built in all other respects.",[13,66,67],{},"For AI Gateway, it was important to meet global customers wherever they are located, whether on GitLab.com or self-managed instances using Cloud Connector. When a developer is deciding to accept or reject a code suggestion, milliseconds matter and can define the user experience.",[69,70,72],"h3",{"id":71},"goals","Goals",[13,74,75],{},"Multi-region deployments require more infrastructure complexity, but for use cases where latency is a core component of the user experience, the benefits often outweigh the downsides. First, multi-region deployments offer increased responsiveness to the user. By serving requests from locations closest to end users, latency can be significantly reduced. Second, multi-region deployments provide greater availability. With fault tolerance, services can fail over during a regional outage. There is a much lower chance of a service failing completely, meaning users should not be interrupted even in partial failures.",[13,77,78],{},"Based on our goals for performance and availability, we used this opportunity to create a scalable multi-region strategy in Runway, which is built leveraging GitLab features.",[69,80,82],{"id":81},"architecture","Architecture",[13,84,85],{},"In SaaS platforms, GitLab.com’s infrastructure is hosted on Google Cloud Platform (GCP). As a result, Runway’s first supported platform runtime is Cloud Run. The initial workloads deployed on Runway are stateless satellite services (e.g., AI Gateway), so Cloud Run services are a good fit that provide a clear migration path to more complex and flexible platform runtimes, e.g. Kubernetes.",[13,87,88],{},"Building Runway on top of GCP Cloud Run using GitLab has allowed us to iterate and tease out the right level of abstractions for service owners as part of a platform play in the Infrastructure department.",[13,90,91],{},"To serve traffic from multiple regions in Cloud Run, the multi-region deployment strategy must support global load balancing, and the provisioning and configuration of regional resources. Here’s a simplified diagram of the proposed architecture in GCP:",[13,93,94],{},[95,96],"img",{"alt":97,"src":98},"simplified diagram of the proposed architecture in GCP","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098671/Blog/Content%20Images/Blog/Content%20Images/image7_aHR0cHM6_1750098671612.png",[13,100,101],{},"By replicating Cloud Run services across multiple regions and configuring the existing global load balancing with serverless network endpoint group (NEG) backends, we’re able to serve traffic from multiple regions. For the remainder of the article, we’ll focus less on specifics of Cloud Run and more on how we’re building with GitLab.",[27,103,105],{"id":104},"building-a-multi-region-platform-with-gitlab","Building a multi-region platform with GitLab",[13,107,108],{},"Now that you have context about Runway, let's walk through how to build a multi-region platform using GitLab features.",[69,110,112],{"id":111},"provision","Provision",[13,114,115],{},"When building an internal platform, the first challenge is provisioning infrastructure for a service. In Runway, Provisioner is the component that is responsible for maintaining a service inventory and managing IaC for GCP resources using Terraform.",[13,117,118],{},"To provision a service, an application developer will open an MR to add a service project to the inventory using git, and Provisioner will create required resources, such as service accounts and identity and access management policies. When building this functionality with GitLab, Runway leverages OpenID Connect (OIDC) with GPC Workload Identity Federation for managing IaC.",[13,120,121,122,127,128,133,134,139],{},"Additionally, Provisioner will create a deployment project for each service project. The purpose of creating separate projects for deployments is to ensure the ",[17,123,126],{"href":124,"rel":125},"https://about.gitlab.com/blog/the-ultimate-guide-to-least-privilege-access-with-gitlab/",[],"principle of least privilege"," by authenticating as a GCP service account with restricted permissions. Runway leverages the ",[17,129,132],{"href":130,"rel":131},"https://docs.gitlab.com/api/projects/",[],"Projects API"," for creating projects with ",[17,135,138],{"href":136,"rel":137},"https://registry.terraform.io/providers/gitlabhq/gitlab/latest/docs",[],"Terraform provider",".",[13,141,142,143,148],{},"Finally, Provisioner defines variables in the deployment project for the service account, so that deployment CI jobs can authenticate to GCP. Runway leverages ",[17,144,147],{"href":145,"rel":146},"https://docs.gitlab.com/ci/variables/",[],"CI/CD variables"," and Job Token allowlist to handle authentication and authorization.",[13,150,151],{},"Here’s a simplified example of provisioning a multi-region service in the service inventory:",[153,154,159],"pre",{"className":155,"code":156,"language":157,"meta":158,"style":158},"language-json shiki shiki-themes github-light","{\n  \"inventory\": [\n    {\n      \"name\": \"example-service\",\n      \"project_id\": 46267196,\n      \"regions\": [\n        \"europe-west1\",\n        \"us-east1\",\n        \"us-west1\"\n      ]\n    }\n  ]\n}\n","json","",[160,161,162,171,181,187,203,216,224,232,240,246,252,258,264],"code",{"__ignoreMap":158},[163,164,167],"span",{"class":165,"line":166},"line",1,[163,168,170],{"class":169},"sgsFI","{\n",[163,172,174,178],{"class":165,"line":173},2,[163,175,177],{"class":176},"sYu0t","  \"inventory\"",[163,179,180],{"class":169},": [\n",[163,182,184],{"class":165,"line":183},3,[163,185,186],{"class":169},"    {\n",[163,188,190,193,196,200],{"class":165,"line":189},4,[163,191,192],{"class":176},"      \"name\"",[163,194,195],{"class":169},": ",[163,197,199],{"class":198},"sYBdl","\"example-service\"",[163,201,202],{"class":169},",\n",[163,204,206,209,211,214],{"class":165,"line":205},5,[163,207,208],{"class":176},"      \"project_id\"",[163,210,195],{"class":169},[163,212,213],{"class":176},"46267196",[163,215,202],{"class":169},[163,217,219,222],{"class":165,"line":218},6,[163,220,221],{"class":176},"      \"regions\"",[163,223,180],{"class":169},[163,225,227,230],{"class":165,"line":226},7,[163,228,229],{"class":198},"        \"europe-west1\"",[163,231,202],{"class":169},[163,233,235,238],{"class":165,"line":234},8,[163,236,237],{"class":198},"        \"us-east1\"",[163,239,202],{"class":169},[163,241,243],{"class":165,"line":242},9,[163,244,245],{"class":198},"        \"us-west1\"\n",[163,247,249],{"class":165,"line":248},10,[163,250,251],{"class":169},"      ]\n",[163,253,255],{"class":165,"line":254},11,[163,256,257],{"class":169},"    }\n",[163,259,261],{"class":165,"line":260},12,[163,262,263],{"class":169},"  ]\n",[163,265,267],{"class":165,"line":266},13,[163,268,269],{"class":169},"}\n",[13,271,272],{},"Once provisioned, a deployment project and necessary infrastructure will be created for a service.",[69,274,276],{"id":275},"configure","Configure",[13,278,279,280,285],{},"After a service is provisioned, the next challenge is the configuration for a service. In Runway, ",[17,281,284],{"href":282,"rel":283},"https://gitlab.com/gitlab-com/gl-infra/platform/runway/runwayctl",[],"Reconciler"," is a component that is responsible for configuring and deploying services by aligning the actual state with the desired state using Golang and Terraform.",[13,287,288],{},"Here’s a simplified example of an application developer configuring GitLab CI/CD in their service project:",[153,290,295],{"className":291,"code":293,"language":294,"meta":158},[292],"language-text","# .gitlab-ci.yml\nstages:\n  - validate\n  - runway_staging\n  - runway_production\n\ninclude:\n  - project: 'gitlab-com/gl-infra/platform/runway/runwayctl'\n    file: 'ci-tasks/service-project/runway.yml'\n    inputs:\n      runway_service_id: example-service\n      image: \"$CI_REGISTRY_IMAGE/${CI_PROJECT_NAME}:${CI_COMMIT_SHORT_SHA}\"\n      runway_version: v3.22.0\n\n# omitted for brevity\n","text",[160,296,293],{"__ignoreMap":158},[13,298,299,300,305],{},"Runway provides sane default values for configuration that are based on our experience in delivering stable and reliable features to customers. Additionally, service owners can configure infrastructure using a service manifest file hosted in a service project. The service manifest uses JSON Schema for validation. When building this functionality with GitLab, Runway leverages ",[17,301,304],{"href":302,"rel":303},"https://docs.gitlab.com/user/project/pages/",[],"Pages"," for schema documentation.",[13,307,308,309,314,315,320],{},"To deliver this part of the platform, Runway leverages ",[17,310,313],{"href":311,"rel":312},"https://docs.gitlab.com/development/cicd/templates/",[],"CI/CD templates",", ",[17,316,319],{"href":317,"rel":318},"https://docs.gitlab.com/user/project/releases/",[],"Releases",", and Container Registry for integrating with service projects.",[13,322,323],{},"Here’s a simplified example of a service manifest:",[153,325,329],{"className":326,"code":327,"language":328,"meta":158,"style":158},"language-yaml shiki shiki-themes github-light","# .runway/runway-production.yml\napiVersion: runway/v1\nkind: RunwayService\nspec:\n container_port: 8181\n regions:\n   - us-east1\n   - us-west1\n   - europe-west1\n\n# omitted for brevity\n","yaml",[160,330,331,337,348,358,366,376,383,391,398,405,411],{"__ignoreMap":158},[163,332,333],{"class":165,"line":166},[163,334,336],{"class":335},"sAwPA","# .runway/runway-production.yml\n",[163,338,339,343,345],{"class":165,"line":173},[163,340,342],{"class":341},"shJU0","apiVersion",[163,344,195],{"class":169},[163,346,347],{"class":198},"runway/v1\n",[163,349,350,353,355],{"class":165,"line":183},[163,351,352],{"class":341},"kind",[163,354,195],{"class":169},[163,356,357],{"class":198},"RunwayService\n",[163,359,360,363],{"class":165,"line":189},[163,361,362],{"class":341},"spec",[163,364,365],{"class":169},":\n",[163,367,368,371,373],{"class":165,"line":205},[163,369,370],{"class":341}," container_port",[163,372,195],{"class":169},[163,374,375],{"class":176},"8181\n",[163,377,378,381],{"class":165,"line":218},[163,379,380],{"class":341}," regions",[163,382,365],{"class":169},[163,384,385,388],{"class":165,"line":226},[163,386,387],{"class":169},"   - ",[163,389,390],{"class":198},"us-east1\n",[163,392,393,395],{"class":165,"line":234},[163,394,387],{"class":169},[163,396,397],{"class":198},"us-west1\n",[163,399,400,402],{"class":165,"line":242},[163,401,387],{"class":169},[163,403,404],{"class":198},"europe-west1\n",[163,406,407],{"class":165,"line":248},[163,408,410],{"emptyLinePlaceholder":409},true,"\n",[163,412,413],{"class":165,"line":254},[163,414,415],{"class":335},"# omitted for brevity\n",[13,417,418],{},"For multi-region services, Runway injects an environment variable into the container instance runtime, e.g. RUNWAY_REGION, so application developers have the context to make any downstream dependencies regionally-aware, e.g. Vertex AI API.",[13,420,421],{},"Once configured, a service project will be integrated with a deployment project.",[69,423,425],{"id":424},"deploy","Deploy",[13,427,428,429,434],{},"After a service project is configured, the next challenge is deploying a service. In Runway, Reconciler handles this by triggering a deployment job in the deployment project when an MR is merged to the main branch. When building this functionality with GitLab, Runway leverages ",[17,430,433],{"href":431,"rel":432},"https://docs.gitlab.com/ci/triggers/",[],"Trigger Pipelines"," and Multi-Project Pipelines to trigger jobs from service project to deployment project.",[13,436,437],{},[95,438],{"alt":439,"src":440},"trigger jobs from service project to deployment project","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098672/Blog/Content%20Images/Blog/Content%20Images/image5_aHR0cHM6_1750098671612.png",[13,442,443,444,449],{},"Once a pipeline is running in a deployment project, it will be deployed to an environment. By default, Runway will provision staging and production environments for all services. At this point, Reconciler will apply any Terraform resource changes for infrastructure. When building this functionality with GitLab, Runway leverages ",[17,445,448],{"href":446,"rel":447},"https://docs.gitlab.com/ci/environments/",[],"Environments/Deployments"," and GitLab-managed Terraform state for each service.",[13,451,452],{},[95,453],{"alt":454,"src":455},"Reconciler applies any Terraform resource changes for infrastructure","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098672/Blog/Content%20Images/Blog/Content%20Images/image1_aHR0cHM6_1750098671614.png",[13,457,458],{},"Runway provides default application metrics for services. Additionally, custom metrics can be used by enabling a sidecar container with OpenTelemetry Collector configured to scrape Prometheus and remote write to Mimir. By providing observability out of the box, Runway is able to bake monitoring into CI/CD pipelines.",[13,460,461],{},"Example scenarios include gradual rollouts for blue/green deployments, preventing promotions to production when staging is broken, or automatically rolling back to previous revision when elevated error rates occur in production.",[13,463,464],{},[95,465],{"alt":466,"src":467},"Runway bakes monitoring into CI/CD pipelines","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098672/Blog/Content%20Images/Blog/Content%20Images/image2_aHR0cHM6_1750098671615.png",[13,469,470],{},"Once deployed, environments will serve the latest revision of a service. At this point, you should have a good understanding of some of the challenges that will be encountered, and how to solve them with GitLab features.",[27,472,474],{"id":473},"migrating-to-multi-region-in-production","Migrating to multi-region in production",[13,476,477],{},"After extending Runway components to support multi-region in Cloud Run, the final challenge was migrating from AI Gateway’s single-region deployment in production with zero downtime. Today, teams using Runway to deploy their services can self-serve on regions making a multi-region deployment just as simple as a single-region deployment.",[13,479,480],{},"We were able to iterate on building multi-region functionality without impacting existing infrastructure by using semantic versioning for Runway. Next, we’ll share some learnings from the migration that may inform how to operate services for an internal multi-region platform.",[69,482,484],{"id":483},"dry-run-deployments","Dry run deployments",[13,486,487],{},"In Runway, Reconciler will apply Terraform changes in CI/CD. The trade-off is that plans cannot be verified in advance, which could risk inadvertently destroying or misconfiguring production infrastructure. To solve this problem, Runway will perform a “dry run” deployment for MRs.",[13,489,490],{},[95,491],{"alt":492,"src":493},"\"Dry run\" deployment","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098672/Blog/Content%20Images/Blog/Content%20Images/image6_aHR0cHM6_1750098671616.png",[13,495,496],{},"For migrating AI Gateway, dry run deployments increased confidence and helped mitigate risk of downtime during rollout. When building an internal platform with GitLab, we recommend supporting dry run deployments from the start.",[69,498,500],{"id":499},"regional-observability","Regional observability",[13,502,503],{},"In Runway, existing observability was aggregated by assuming a single-region deployment. To solve this problem, Runway observability was retrofitted to include a new region label for Prometheus metrics.",[13,505,506],{},"Once metrics were retrofitted, we were able to introduce service level indicators (SLIs) for both regional Cloud Run services and global load balancing. Here’s an example dashboard screenshot for a general Runway service:",[13,508,509],{},[95,510],{"alt":511,"src":512},"dashboard screenshot for a general Runway service","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098672/Blog/Content%20Images/Blog/Content%20Images/image3_aHR0cHM6_1750098671617.png",[13,514,515],{},[516,517,518,522],"em",{},[519,520,521],"strong",{},"Note:"," Data is not actual production data and is only for illustration purposes.",[13,524,525],{},"Additionally, we were able to update our service level objectives (SLOs) to support regions. As a result, service owners could be alerted when a specific region experiences an elevated error rate, or increase in response times.",[13,527,528],{},[95,529],{"alt":530,"src":531},"screenshot of alerts","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098672/Blog/Content%20Images/Blog/Content%20Images/image4_aHR0cHM6_1750098671617.png",[13,533,534],{},[516,535,536,522],{},[519,537,521],{},[13,539,540],{},"For migrating AI Gateway, regional observability increased confidence and helped provide more visibility into new infrastructure. When building an internal platform with GitLab, we recommend supporting regional observability from the start.",[69,542,544],{"id":543},"self-service-regions","Self-service regions",[13,546,547],{},"The Infrastructure department successfully performed the initial migration of multi-region support for AI Gateway in production with zero downtime. Given the risk associated with rolling out a large infrastructure migration, it was important to ensure the service continued working as expected.",[13,549,550,551,556],{},"Shortly afterwards, service owners began self-serving additional regions to meet the growth of customers. At the time of writing, ",[17,552,555],{"href":553,"rel":554},"https://about.gitlab.com/gitlab-duo-agent-platform/",[],"GitLab Duo"," is available in six regions around the globe and counting. Service owners are able to configure the desired regions, and Runway will provide guardrails along the way in a scalable solution.",[13,558,559],{},"Additionally, three other internal services have already started using multi-region functionality on Runway. Application developers have entirely self-served functionality, which validates that we’ve provided a good platform experience for service owners. For a platform play, a scalable solution like Runway is considered a good outcome since the Infrastructure department is no longer a blocker.",[27,561,563],{"id":562},"whats-next-for-runway","What’s next for Runway",[13,565,566],{},"Based on how quickly we could iterate to provide results for customers, the SaaS Platforms department has continued to invest in Runway. We’ve grown the Runway team with additional contributors, started evolving the platform runtime (e.g. Google Kubernetes Engine), and continue dogfooding with tighter integration in the product.",[13,568,569,570,139],{},"If you’re interested in learning more, feel free to check out ",[17,571,572],{"href":572,"rel":573},"https://gitlab.com/gitlab-com/gl-infra/platform/runway",[],[27,575,577],{"id":576},"more-building-gitlab-with-gitlab","More Building GitLab with GitLab",[579,580,581,589,596,603,610],"ul",{},[582,583,584],"li",{},[17,585,588],{"href":586,"rel":587},"https://about.gitlab.com/blog/there-is-no-mlops-without-devsecops/",[],"Why there is no MLOps without DevSecOps",[582,590,591],{},[17,592,595],{"href":593,"rel":594},"https://about.gitlab.com/blog/building-gitlab-with-gitlab-stress-testing-product-analytics/",[],"Stress-testing Product Analytics",[582,597,598],{},[17,599,602],{"href":600,"rel":601},"https://about.gitlab.com/blog/building-gitlab-with-gitlab-api-fuzzing-workflow/",[],"Web API Fuzz Testing",[582,604,605],{},[17,606,609],{"href":607,"rel":608},"https://about.gitlab.com/blog/building-gitlab-with-gitlabcom-how-gitlab-inspired-dedicated/",[],"How GitLab.com inspired Dedicated",[582,611,612],{},[17,613,616],{"href":614,"rel":615},"https://about.gitlab.com/blog/building-gitlab-with-gitlab-expanding-our-security-certification-portfolio/",[],"Expanding our security certification portfolio",[618,619,620],"style",{},"html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html 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 .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}",{"title":158,"searchDepth":173,"depth":173,"links":622},[623,624,628,633,638,639],{"id":29,"depth":173,"text":30},{"id":60,"depth":173,"text":61,"children":625},[626,627],{"id":71,"depth":183,"text":72},{"id":81,"depth":183,"text":82},{"id":104,"depth":173,"text":105,"children":629},[630,631,632],{"id":111,"depth":183,"text":112},{"id":275,"depth":183,"text":276},{"id":424,"depth":183,"text":425},{"id":473,"depth":173,"text":474,"children":634},[635,636,637],{"id":483,"depth":183,"text":484},{"id":499,"depth":183,"text":500},{"id":543,"depth":183,"text":544},{"id":562,"depth":173,"text":563},{"id":576,"depth":173,"text":577},"engineering","2024-09-12","Discover how we built our first multi-region deployment for teams at GitLab using the platform's many features, helping create a frictionless developer experience for GitLab Duo users.","md",null,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1750098664/Blog/Hero%20Images/Blog/Hero%20Images/building-gitlab-with-gitlab-no-type_building-gitlab-with-gitlab-no-type.png_1750098663794.png",{},"/en-us/blog/building-gitlab-with-gitlab-a-multi-region-service-to-deliver-ai-features",{"title":5,"description":642,"ogTitle":5,"ogDescription":642,"noIndex":649,"ogImage":645,"ogUrl":650,"ogSiteName":651,"ogType":652,"canonicalUrls":650},false,"https://about.gitlab.com/blog/building-gitlab-with-gitlab-a-multi-region-service-to-deliver-ai-features","https://about.gitlab.com","article","building-gitlab-with-gitlab-a-multi-region-service-to-deliver-ai-features","en-us/blog/building-gitlab-with-gitlab-a-multi-region-service-to-deliver-ai-features",[44,656,657,658,659,660,661,662,663,664],"CD","CI","inside GitLab","tutorial","performance","google","git","DevSecOps","AI","BlogPost","KiSf2tZJ84ISTatn3ZG96xUJ2Ayg6DkTEP0P8MsK0Pk",{"logo":668,"freeTrial":673,"sales":678,"login":683,"items":688,"search":1014,"minimal":1045,"duo":1064,"switchNav":1073,"pricingDeployment":1084},{"config":669},{"href":670,"dataGaName":671,"dataGaLocation":672},"/","gitlab logo","header",{"text":674,"config":675},"Get free trial",{"href":676,"dataGaName":677,"dataGaLocation":672},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":679,"config":680},"Request a demo",{"href":681,"dataGaName":682,"dataGaLocation":672},"/sales/?contact-topic=request-demo","sales",{"text":684,"config":685},"Sign in",{"href":686,"dataGaName":687,"dataGaLocation":672},"https://gitlab.com/users/sign_in/","sign in",[689,718,817,822,936,992],{"text":690,"config":691,"menu":693},"Platform",{"dataNavLevelOne":692},"platform",{"type":694,"columns":695},"cards",[696,702,710],{"title":690,"description":697,"link":698},"The intelligent orchestration platform for DevSecOps",{"text":699,"config":700},"Explore our Platform",{"href":701,"dataGaName":692,"dataGaLocation":672},"/platform/",{"title":703,"description":704,"link":705},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":706,"config":707},"Meet GitLab Duo",{"href":708,"dataGaName":709,"dataGaLocation":672},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":711,"description":712,"link":713},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":714,"config":715},"Learn more",{"href":716,"dataGaName":717,"dataGaLocation":672},"/why-gitlab/","why gitlab",{"text":719,"left":409,"config":720,"menu":722},"Product",{"dataNavLevelOne":721},"solutions",{"type":723,"link":724,"columns":728,"feature":796},"lists",{"text":725,"config":726},"View all Solutions",{"href":727,"dataGaName":721,"dataGaLocation":672},"/solutions/",[729,752,775],{"title":730,"description":731,"link":732,"items":737},"Automation","CI/CD and automation to accelerate deployment",{"config":733},{"icon":734,"href":735,"dataGaName":736,"dataGaLocation":672},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[738,741,744,748],{"text":44,"config":739},{"href":740,"dataGaLocation":672,"dataGaName":44},"/solutions/continuous-integration/",{"text":703,"config":742},{"href":708,"dataGaLocation":672,"dataGaName":743},"gitlab duo agent platform - product menu",{"text":745,"config":746},"Source Code Management",{"href":747,"dataGaLocation":672,"dataGaName":745},"/solutions/source-code-management/",{"text":749,"config":750},"Automated Software Delivery",{"href":735,"dataGaLocation":672,"dataGaName":751},"Automated software delivery",{"title":753,"description":754,"link":755,"items":760},"Security","Deliver code faster without compromising security",{"config":756},{"href":757,"dataGaName":758,"dataGaLocation":672,"icon":759},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[761,765,770],{"text":762,"config":763},"Application Security Testing",{"href":757,"dataGaName":764,"dataGaLocation":672},"Application security testing",{"text":766,"config":767},"Software Supply Chain Security",{"href":768,"dataGaLocation":672,"dataGaName":769},"/solutions/supply-chain/","Software supply chain security",{"text":771,"config":772},"Software Compliance",{"href":773,"dataGaName":774,"dataGaLocation":672},"/solutions/software-compliance/","software compliance",{"title":776,"link":777,"items":782},"Measurement",{"config":778},{"icon":779,"href":780,"dataGaName":781,"dataGaLocation":672},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[783,787,791],{"text":784,"config":785},"Visibility & Measurement",{"href":780,"dataGaLocation":672,"dataGaName":786},"Visibility and Measurement",{"text":788,"config":789},"Value Stream Management",{"href":790,"dataGaLocation":672,"dataGaName":788},"/solutions/value-stream-management/",{"text":792,"config":793},"Analytics & Insights",{"href":794,"dataGaLocation":672,"dataGaName":795},"/solutions/analytics-and-insights/","Analytics and insights",{"title":797,"type":723,"items":798},"GitLab for",[799,805,811],{"text":800,"config":801},"Enterprise",{"icon":802,"href":803,"dataGaLocation":672,"dataGaName":804},"Building","/enterprise/","enterprise",{"text":806,"config":807},"Small Business",{"icon":808,"href":809,"dataGaLocation":672,"dataGaName":810},"Work","/small-business/","small business",{"text":812,"config":813},"Public Sector",{"icon":814,"href":815,"dataGaLocation":672,"dataGaName":816},"Organization","/solutions/public-sector/","public sector",{"text":818,"config":819},"Pricing",{"href":820,"dataGaName":821,"dataGaLocation":672,"dataNavLevelOne":821},"/pricing/","pricing",{"text":823,"config":824,"menu":826},"Resources",{"dataNavLevelOne":825},"resources",{"type":723,"link":827,"columns":831,"feature":925},{"text":828,"config":829},"View all resources",{"href":830,"dataGaName":825,"dataGaLocation":672},"/resources/",[832,865,892],{"title":833,"items":834},"Getting started",[835,840,845,850,855,860],{"text":836,"config":837},"Install",{"href":838,"dataGaName":839,"dataGaLocation":672},"/install/","install",{"text":841,"config":842},"Quick start guides",{"href":843,"dataGaName":844,"dataGaLocation":672},"/get-started/","quick setup checklists",{"text":846,"config":847},"Learn",{"href":848,"dataGaLocation":672,"dataGaName":849},"https://university.gitlab.com/","learn",{"text":851,"config":852},"Product documentation",{"href":853,"dataGaName":854,"dataGaLocation":672},"https://docs.gitlab.com/","product documentation",{"text":856,"config":857},"Best practice videos",{"href":858,"dataGaName":859,"dataGaLocation":672},"/getting-started-videos/","best practice videos",{"text":861,"config":862},"Integrations",{"href":863,"dataGaName":864,"dataGaLocation":672},"/integrations/","integrations",{"title":866,"items":867},"Discover",[868,873,878,883,887],{"text":869,"config":870},"Customer success stories",{"href":871,"dataGaName":872,"dataGaLocation":672},"/customers/","customer success stories",{"text":874,"config":875},"Blog",{"href":876,"dataGaName":877,"dataGaLocation":672},"/blog/","blog",{"text":879,"config":880},"Demo Hub",{"href":881,"dataGaName":882,"dataGaLocation":672},"/demo-hub/","demo hub",{"text":884,"config":885},"The Source",{"href":886,"dataGaName":877,"dataGaLocation":672},"/the-source/",{"text":888,"config":889},"Remote",{"href":890,"dataGaName":891,"dataGaLocation":672},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":893,"items":894},"Connect",[895,900,905,910,915,920],{"text":896,"config":897},"GitLab Services",{"href":898,"dataGaName":899,"dataGaLocation":672},"/services/","services",{"text":901,"config":902},"Contribute",{"href":903,"dataGaName":904,"dataGaLocation":672},"https://contributors.gitlab.com","contribute",{"text":906,"config":907},"Community",{"href":908,"dataGaName":909,"dataGaLocation":672},"/community/","community",{"text":911,"config":912},"Forum",{"href":913,"dataGaName":914,"dataGaLocation":672},"https://forum.gitlab.com/","forum",{"text":916,"config":917},"Events",{"href":918,"dataGaName":919,"dataGaLocation":672},"/events/","events",{"text":921,"config":922},"Partners",{"href":923,"dataGaName":924,"dataGaLocation":672},"/partners/","partners",{"config":926,"title":929,"text":930,"link":931},{"background":927,"textColor":928},"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":932,"config":933},"Read the latest",{"href":934,"dataGaName":935,"dataGaLocation":672},"/whats-new/","whats new",{"text":937,"config":938,"menu":940},"Company",{"dataNavLevelOne":939},"company",{"type":723,"columns":941},[942],{"items":943},[944,949,955,957,962,967,972,977,982,987],{"text":945,"config":946},"About",{"href":947,"dataGaName":948,"dataGaLocation":672},"/company/","about",{"text":950,"config":951,"footerGa":954},"Jobs",{"href":952,"dataGaName":953,"dataGaLocation":672},"/jobs/","jobs",{"dataGaName":953},{"text":916,"config":956},{"href":918,"dataGaName":919,"dataGaLocation":672},{"text":958,"config":959},"Leadership",{"href":960,"dataGaName":961,"dataGaLocation":672},"/company/team/e-group/","leadership",{"text":963,"config":964},"Handbook",{"href":965,"dataGaName":966,"dataGaLocation":672},"https://handbook.gitlab.com/","handbook",{"text":968,"config":969},"Investor relations",{"href":970,"dataGaName":971,"dataGaLocation":672},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":973,"config":974},"Trust Center",{"href":975,"dataGaName":976,"dataGaLocation":672},"/security/","trust center",{"text":978,"config":979},"AI Transparency Center",{"href":980,"dataGaName":981,"dataGaLocation":672},"/ai-transparency-center/","ai transparency center",{"text":983,"config":984},"Newsletter",{"href":985,"dataGaName":986,"dataGaLocation":672},"/company/contact/#contact-forms","newsletter",{"text":988,"config":989},"Press",{"href":990,"dataGaName":991,"dataGaLocation":672},"/press/","press",{"text":993,"config":994,"menu":995},"Contact us",{"dataNavLevelOne":939},{"type":723,"columns":996},[997],{"items":998},[999,1004,1009],{"text":1000,"config":1001},"Talk to sales",{"href":1002,"dataGaName":1003,"dataGaLocation":672},"/sales/","talk to sales",{"text":1005,"config":1006},"Support portal",{"href":1007,"dataGaName":1008,"dataGaLocation":672},"https://support.gitlab.com/hc/en-us","support portal",{"text":1010,"config":1011},"Customer portal",{"href":1012,"dataGaName":1013,"dataGaLocation":672},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1015,"login":1016,"suggestions":1023},"Close",{"text":1017,"link":1018},"To search repositories and projects, login to",{"text":1019,"config":1020},"gitlab.com",{"href":686,"dataGaName":1021,"dataGaLocation":1022},"search login","search",{"text":1024,"default":1025},"Suggestions",[1026,1028,1032,1034,1038,1042],{"text":703,"config":1027},{"href":708,"dataGaName":703,"dataGaLocation":1022},{"text":1029,"config":1030},"Code Suggestions (AI)",{"href":1031,"dataGaName":1029,"dataGaLocation":1022},"/solutions/code-suggestions/",{"text":44,"config":1033},{"href":740,"dataGaName":44,"dataGaLocation":1022},{"text":1035,"config":1036},"GitLab on AWS",{"href":1037,"dataGaName":1035,"dataGaLocation":1022},"/partners/technology-partners/aws/",{"text":1039,"config":1040},"GitLab on Google Cloud",{"href":1041,"dataGaName":1039,"dataGaLocation":1022},"/partners/technology-partners/google-cloud-platform/",{"text":1043,"config":1044},"Why GitLab?",{"href":716,"dataGaName":1043,"dataGaLocation":1022},{"freeTrial":1046,"mobileIcon":1051,"desktopIcon":1056,"secondaryButton":1059},{"text":1047,"config":1048},"Start free trial",{"href":1049,"dataGaName":677,"dataGaLocation":1050},"https://gitlab.com/-/trials/new/","nav",{"altText":1052,"config":1053},"Gitlab Icon",{"src":1054,"dataGaName":1055,"dataGaLocation":1050},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1052,"config":1057},{"src":1058,"dataGaName":1055,"dataGaLocation":1050},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1060,"config":1061},"Get Started",{"href":1062,"dataGaName":1063,"dataGaLocation":1050},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1065,"mobileIcon":1069,"desktopIcon":1071},{"text":1066,"config":1067},"Learn more about GitLab Duo",{"href":708,"dataGaName":1068,"dataGaLocation":1050},"gitlab duo",{"altText":1052,"config":1070},{"src":1054,"dataGaName":1055,"dataGaLocation":1050},{"altText":1052,"config":1072},{"src":1058,"dataGaName":1055,"dataGaLocation":1050},{"button":1074,"mobileIcon":1079,"desktopIcon":1081},{"text":1075,"config":1076},"/switch",{"href":1077,"dataGaName":1078,"dataGaLocation":1050},"#contact","switch",{"altText":1052,"config":1080},{"src":1054,"dataGaName":1055,"dataGaLocation":1050},{"altText":1052,"config":1082},{"src":1083,"dataGaName":1055,"dataGaLocation":1050},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1085,"mobileIcon":1090,"desktopIcon":1092},{"text":1086,"config":1087},"Back to pricing",{"href":820,"dataGaName":1088,"dataGaLocation":1050,"icon":1089},"back to pricing","GoBack",{"altText":1052,"config":1091},{"src":1054,"dataGaName":1055,"dataGaLocation":1050},{"altText":1052,"config":1093},{"src":1058,"dataGaName":1055,"dataGaLocation":1050},{"title":1095,"titleMobile":1096,"button":1097,"config":1102},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":714,"config":1098},{"href":1099,"dataGaName":1100,"dataGaLocation":1101},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1103,"disabled":649},"release",{"data":1105},{"text":1106,"source":1107,"edit":1113,"contribute":1118,"config":1123,"items":1128,"minimal":1337},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1108,"config":1109},"View page source",{"href":1110,"dataGaName":1111,"dataGaLocation":1112},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1114,"config":1115},"Edit this page",{"href":1116,"dataGaName":1117,"dataGaLocation":1112},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1119,"config":1120},"Please contribute",{"href":1121,"dataGaName":1122,"dataGaLocation":1112},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1124,"facebook":1125,"youtube":1126,"linkedin":1127},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1129,1176,1229,1273,1305],{"title":818,"links":1130,"subMenu":1145},[1131,1135,1140],{"text":1132,"config":1133},"View plans",{"href":820,"dataGaName":1134,"dataGaLocation":1112},"view plans",{"text":1136,"config":1137},"Why Premium?",{"href":1138,"dataGaName":1139,"dataGaLocation":1112},"/pricing/premium/","why premium",{"text":1141,"config":1142},"Why Ultimate?",{"href":1143,"dataGaName":1144,"dataGaLocation":1112},"/pricing/ultimate/","why ultimate",[1146],{"title":1147,"links":1148},"Contact Us",[1149,1152,1154,1156,1161,1166,1171],{"text":1150,"config":1151},"Contact sales",{"href":1002,"dataGaName":682,"dataGaLocation":1112},{"text":1005,"config":1153},{"href":1007,"dataGaName":1008,"dataGaLocation":1112},{"text":1010,"config":1155},{"href":1012,"dataGaName":1013,"dataGaLocation":1112},{"text":1157,"config":1158},"Status",{"href":1159,"dataGaName":1160,"dataGaLocation":1112},"https://status.gitlab.com/","status",{"text":1162,"config":1163},"Terms of use",{"href":1164,"dataGaName":1165,"dataGaLocation":1112},"/terms/","terms of use",{"text":1167,"config":1168},"Privacy statement",{"href":1169,"dataGaName":1170,"dataGaLocation":1112},"/privacy/","privacy statement",{"text":1172,"config":1173},"Cookie preferences",{"dataGaName":1174,"dataGaLocation":1112,"id":1175,"isOneTrustButton":409},"cookie preferences","ot-sdk-btn",{"title":719,"links":1177,"subMenu":1186},[1178,1182],{"text":1179,"config":1180},"DevSecOps platform",{"href":701,"dataGaName":1181,"dataGaLocation":1112},"devsecops platform",{"text":1183,"config":1184},"AI-Assisted Development",{"href":708,"dataGaName":1185,"dataGaLocation":1112},"ai-assisted development",[1187],{"title":1188,"links":1189},"Topics",[1190,1195,1200,1205,1210,1214,1219,1224],{"text":1191,"config":1192},"CICD",{"href":1193,"dataGaName":1194,"dataGaLocation":1112},"/topics/ci-cd/","cicd",{"text":1196,"config":1197},"GitOps",{"href":1198,"dataGaName":1199,"dataGaLocation":1112},"/topics/gitops/","gitops",{"text":1201,"config":1202},"DevOps",{"href":1203,"dataGaName":1204,"dataGaLocation":1112},"/topics/devops/","devops",{"text":1206,"config":1207},"Version Control",{"href":1208,"dataGaName":1209,"dataGaLocation":1112},"/topics/version-control/","version control",{"text":663,"config":1211},{"href":1212,"dataGaName":1213,"dataGaLocation":1112},"/topics/devsecops/","devsecops",{"text":1215,"config":1216},"Cloud Native",{"href":1217,"dataGaName":1218,"dataGaLocation":1112},"/topics/cloud-native/","cloud native",{"text":1220,"config":1221},"AI for Coding",{"href":1222,"dataGaName":1223,"dataGaLocation":1112},"/topics/devops/ai-for-coding/","ai for coding",{"text":1225,"config":1226},"Agentic AI",{"href":1227,"dataGaName":1228,"dataGaLocation":1112},"/topics/agentic-ai/","agentic ai",{"title":1230,"links":1231},"Solutions",[1232,1234,1236,1241,1245,1248,1252,1255,1257,1260,1263,1268],{"text":762,"config":1233},{"href":757,"dataGaName":762,"dataGaLocation":1112},{"text":751,"config":1235},{"href":735,"dataGaName":736,"dataGaLocation":1112},{"text":1237,"config":1238},"Agile development",{"href":1239,"dataGaName":1240,"dataGaLocation":1112},"/solutions/agile-delivery/","agile delivery",{"text":1242,"config":1243},"SCM",{"href":747,"dataGaName":1244,"dataGaLocation":1112},"source code management",{"text":1191,"config":1246},{"href":740,"dataGaName":1247,"dataGaLocation":1112},"continuous integration & delivery",{"text":1249,"config":1250},"Value stream management",{"href":790,"dataGaName":1251,"dataGaLocation":1112},"value stream management",{"text":1196,"config":1253},{"href":1254,"dataGaName":1199,"dataGaLocation":1112},"/solutions/gitops/",{"text":800,"config":1256},{"href":803,"dataGaName":804,"dataGaLocation":1112},{"text":1258,"config":1259},"Small business",{"href":809,"dataGaName":810,"dataGaLocation":1112},{"text":1261,"config":1262},"Public sector",{"href":815,"dataGaName":816,"dataGaLocation":1112},{"text":1264,"config":1265},"Education",{"href":1266,"dataGaName":1267,"dataGaLocation":1112},"/solutions/education/","education",{"text":1269,"config":1270},"Financial services",{"href":1271,"dataGaName":1272,"dataGaLocation":1112},"/solutions/finance/","financial services",{"title":823,"links":1274},[1275,1277,1279,1281,1284,1286,1289,1291,1293,1295,1297,1299,1301,1303],{"text":836,"config":1276},{"href":838,"dataGaName":839,"dataGaLocation":1112},{"text":841,"config":1278},{"href":843,"dataGaName":844,"dataGaLocation":1112},{"text":846,"config":1280},{"href":848,"dataGaName":849,"dataGaLocation":1112},{"text":851,"config":1282},{"href":853,"dataGaName":1283,"dataGaLocation":1112},"docs",{"text":874,"config":1285},{"href":876,"dataGaName":877,"dataGaLocation":1112},{"text":1287,"config":1288},"What's new",{"href":934,"dataGaName":935,"dataGaLocation":1112},{"text":869,"config":1290},{"href":871,"dataGaName":872,"dataGaLocation":1112},{"text":888,"config":1292},{"href":890,"dataGaName":891,"dataGaLocation":1112},{"text":896,"config":1294},{"href":898,"dataGaName":899,"dataGaLocation":1112},{"text":901,"config":1296},{"href":903,"dataGaName":904,"dataGaLocation":1112},{"text":906,"config":1298},{"href":908,"dataGaName":909,"dataGaLocation":1112},{"text":911,"config":1300},{"href":913,"dataGaName":914,"dataGaLocation":1112},{"text":916,"config":1302},{"href":918,"dataGaName":919,"dataGaLocation":1112},{"text":921,"config":1304},{"href":923,"dataGaName":924,"dataGaLocation":1112},{"title":937,"links":1306},[1307,1309,1311,1313,1315,1317,1321,1326,1328,1330,1332],{"text":945,"config":1308},{"href":947,"dataGaName":939,"dataGaLocation":1112},{"text":950,"config":1310},{"href":952,"dataGaName":953,"dataGaLocation":1112},{"text":958,"config":1312},{"href":960,"dataGaName":961,"dataGaLocation":1112},{"text":963,"config":1314},{"href":965,"dataGaName":966,"dataGaLocation":1112},{"text":968,"config":1316},{"href":970,"dataGaName":971,"dataGaLocation":1112},{"text":1318,"config":1319},"Sustainability",{"href":1320,"dataGaName":1318,"dataGaLocation":1112},"/sustainability/",{"text":1322,"config":1323},"Diversity, inclusion and belonging (DIB)",{"href":1324,"dataGaName":1325,"dataGaLocation":1112},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":973,"config":1327},{"href":975,"dataGaName":976,"dataGaLocation":1112},{"text":983,"config":1329},{"href":985,"dataGaName":986,"dataGaLocation":1112},{"text":988,"config":1331},{"href":990,"dataGaName":991,"dataGaLocation":1112},{"text":1333,"config":1334},"Modern Slavery Transparency Statement",{"href":1335,"dataGaName":1336,"dataGaLocation":1112},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1338},[1339,1342,1345],{"text":1340,"config":1341},"Terms",{"href":1164,"dataGaName":1165,"dataGaLocation":1112},{"text":1343,"config":1344},"Cookies",{"dataGaName":1174,"dataGaLocation":1112,"id":1175,"isOneTrustButton":409},{"text":1346,"config":1347},"Privacy",{"href":1169,"dataGaName":1170,"dataGaLocation":1112},[1349,1363],{"id":1350,"title":7,"body":644,"config":1351,"content":1353,"description":644,"extension":1357,"meta":1358,"navigation":409,"path":1359,"seo":1360,"stem":1361,"__hash__":1362},"blogAuthors/en-us/blog/authors/chance-feick.yml",{"template":1352},"BlogAuthor",{"name":7,"config":1354},{"headshot":1355,"ctfId":1356},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749666442/Blog/Author%20Headshots/chance_feick_headshot.png","18dtRbXV47xqf5iDrOIduM","yml",{},"/en-us/blog/authors/chance-feick",{},"en-us/blog/authors/chance-feick","pxxX1V45KXOH1YzuHzTMX2CSDIDxZxItHztW_c1H0Zc",{"id":1364,"title":8,"body":644,"config":1365,"content":1366,"description":644,"extension":1357,"meta":1370,"navigation":409,"path":1371,"seo":1372,"stem":1373,"__hash__":1374},"blogAuthors/en-us/blog/authors/sam-wiskow.yml",{"template":1352},{"name":8,"config":1367},{"headshot":1368,"ctfId":1369},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659433/Blog/Author%20Headshots/swiskow-headshot.jpg","swiskow",{},"/en-us/blog/authors/sam-wiskow",{},"en-us/blog/authors/sam-wiskow","TR52XmFI8G3xfSF6pTXW6r_bf0Bd5tf82MmM7VjjKfM",[1376,1385,1393],{"title":1377,"description":1378,"heroImage":1379,"category":640,"date":1380,"authors":1381,"slug":1384,"externalUrl":644},"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",[1382,1383],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1386,"description":1387,"heroImage":1388,"category":640,"date":1389,"authors":1390,"slug":1392,"externalUrl":644},"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",[1391],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1394,"description":1395,"heroImage":1396,"category":640,"date":1397,"authors":1398,"slug":1400,"externalUrl":644},"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",[1399],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1402},[1403,1417,1429,1441],{"id":1404,"categories":1405,"header":1407,"text":1408,"button":1409,"image":1414},"ai-modernization",[1406],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1410,"config":1411},"Get your AI maturity score",{"href":1412,"dataGaName":1413,"dataGaLocation":877},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1415},{"src":1416},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1418,"categories":1419,"header":1421,"text":1408,"button":1422,"image":1426},"devops-modernization",[1420,1213],"product","Are you just managing tools or shipping innovation?",{"text":1423,"config":1424},"Get your DevOps maturity score",{"href":1425,"dataGaName":1413,"dataGaLocation":877},"/assessments/devops-modernization-assessment/",{"config":1427},{"src":1428},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1430,"categories":1431,"header":1433,"text":1408,"button":1434,"image":1438},"security-modernization",[1432],"security","Are you trading speed for security?",{"text":1435,"config":1436},"Get your security maturity score",{"href":1437,"dataGaName":1413,"dataGaLocation":877},"/assessments/security-modernization-assessment/",{"config":1439},{"src":1440},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1442,"paths":1443,"header":1446,"text":1447,"button":1448,"image":1453},"github-azure-migration",[1444,1445],"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":1449,"config":1450},"See how GitLab compares to GitHub",{"href":1451,"dataGaName":1452,"dataGaLocation":877},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1454},{"src":1428},{"header":1456,"blurb":1457,"button":1458,"secondaryButton":1463},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1459,"config":1460},"Get your free trial",{"href":1461,"dataGaName":677,"dataGaLocation":1462},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1150,"config":1464},{"href":1002,"dataGaName":682,"dataGaLocation":1462},1786803747526]