[{"data":1,"prerenderedAt":2458},["ShallowReactive",2],{"/blog/secure-ai-agent-deployment-to-gke":3,"navigation-en-us":1673,"banner-en-us":2101,"footer-en-us":2111,"blog-post-authors-en-us-Regnard Raquedan":2355,"blog-related-posts-en-us-secure-ai-agent-deployment-to-gke":2370,"blog-promotions-en-us":2395,"next-steps-en-us":2448},{"id":4,"title":5,"authors":6,"body":8,"category":1653,"date":1654,"description":1655,"extension":1656,"externalUrl":1657,"faq":1657,"featured":1658,"heroImage":1659,"meta":1660,"navigation":263,"path":1661,"seo":1662,"slug":1664,"stem":1665,"tags":1666,"template":1671,"updatedDate":1657,"__hash__":1672},"blogPosts/en-us/blog/secure-ai-agent-deployment-to-gke.md","Secure AI agent deployment to GKE",[7],"Regnard Raquedan",{"type":9,"value":10,"toc":1642},"minimark",[11,28,33,42,45,52,58,64,67,71,74,87,90,101,105,110,113,120,123,137,140,144,147,176,179,185,196,199,203,206,213,239,247,1108,1113,1116,1119,1122,1565,1569,1572,1579,1592,1596,1599,1602,1615,1638],[12,13,14,15,21,22,27],"p",{},"Building ",[16,17,20],"a",{"href":18,"rel":19},"https://about.gitlab.com/gitlab-duo-agent-platform/",[],"AI agents"," is exciting, but deploying them securely to production shouldn't be complicated. In this tutorial, you will learn how GitLab's ",[16,23,26],{"href":24,"rel":25},"https://cloud.google.com/blog/topics/partners/understand-the-google-cloud-gitlab-integration",[],"native Google Cloud integration"," makes it straightforward to deploy AI agents to Google Kubernetes Engine (GKE) — with built-in scanning and zero service account keys.",[29,30,32],"h2",{"id":31},"why-choose-gke-to-deploy-your-ai-agents","Why choose GKE to deploy your AI agents?",[12,34,35,36,41],{},"GKE provides enterprise-grade orchestration that connects seamlessly with GitLab CI/CD pipelines through OIDC authentication. Your development team can deploy AI agents while maintaining complete visibility, compliance, and control over your cloud infrastructure. This guide uses Google's Agent Development Kit (",[16,37,40],{"href":38,"rel":39},"https://developers.googleblog.com/en/agent-development-kit-easy-to-build-multi-agent-applications/",[],"ADK",") to build the app, so you can expect increased seamlessness as this is deployed using GitLab.",[12,43,44],{},"Three key advantages to this approach:",[12,46,47,51],{},[48,49,50],"strong",{},"Full infrastructure control"," - Your data, your rules, your environment. You maintain complete control over where your AI agents run and how they're configured.",[12,53,54,57],{},[48,55,56],{},"Native GitLab integration"," - No complex workarounds. Your existing pipelines work right out of the box thanks to GitLab's native integration with Google Cloud.",[12,59,60,63],{},[48,61,62],{},"Production-grade scaling"," - GKE automatically handles the heavy lifting of scaling and internal orchestration as your AI workloads grow.",[12,65,66],{},"The key point is that GitLab with GKE provides the enterprise reliability your AI deployments demand without sacrificing the developer experience your teams expect.",[29,68,70],{"id":69},"prerequisites","Prerequisites",[12,72,73],{},"Before you start, make sure you have these APIs enabled:",[75,76,77,81,84],"ul",{},[78,79,80],"li",{},"GKE API",[78,82,83],{},"Artifact Registry API",[78,85,86],{},"Vertex AI API",[12,88,89],{},"Also make sure you have:",[75,91,92,95,98],{},[78,93,94],{},"GitLab project created",[78,96,97],{},"GKE cluster provisioned",[78,99,100],{},"Artifact Registry repository created",[29,102,104],{"id":103},"the-deployment-process","The deployment process",[106,107,109],"h3",{"id":108},"_1-set-up-iam-and-permissions-on-gitlab","1. Set up IAM and permissions on GitLab",[12,111,112],{},"Navigate to your GitLab integrations to configure Google Cloud authentication (IAM).",[12,114,115,116,119],{},"Go to ",[48,117,118],{},"Settings > Integrations"," and configure the Google Cloud integration. If you're using a group-level integration, notice that default settings are already inherited by projects. This means you configure once at the group level, and all projects benefit and inherit this setting.",[12,121,122],{},"To set this up from scratch, provide:",[75,124,125,128,131,134],{},[78,126,127],{},"Project ID",[78,129,130],{},"Project Number",[78,132,133],{},"Workload Identity Pool ID",[78,135,136],{},"Provider ID",[12,138,139],{},"Once configured, GitLab provides a script to run in Google Cloud Console, via Cloud Shell. The outcome of running this script is a Workload Identity Federation pool with the necessary service principal to enable the proper access.",[106,141,143],{"id":142},"_2-configure-artifact-registry-integration","2. Configure Artifact Registry integration",[12,145,146],{},"Still in GitLab's integration settings, configure Artifact Management:",[148,149,150,157,163],"ol",{},[78,151,152,153,156],{},"Click ",[48,154,155],{},"Artifact Management",".",[78,158,159,160,156],{},"Select ",[48,161,162],{},"Google Artifact Registry",[78,164,165,166],{},"Provide:",[75,167,168,170,173],{},[78,169,127],{},[78,171,172],{},"Repository Name (created beforehand)",[78,174,175],{},"Repository Location",[12,177,178],{},"GitLab provides another script to run in Google Cloud Console.",[12,180,181,184],{},[48,182,183],{},"Important:"," Before proceeding, add these extra roles to the Workload Identity Federation pool:",[75,186,187,190,193],{},[78,188,189],{},"Service Account User",[78,191,192],{},"Kubernetes Developer",[78,194,195],{},"Kubernetes Cluster Viewer",[12,197,198],{},"These permissions allow GitLab to deploy to GKE in subsequent steps.",[106,200,202],{"id":201},"_3-create-the-cicd-pipeline","3. Create the CI/CD pipeline",[12,204,205],{},"Now for the key part — creating the CI/CD pipeline for deployment.",[12,207,208,209,212],{},"Head to ",[48,210,211],{},"Build > Pipeline Editor"," and define your pipeline with four stages:",[75,214,215,221,227,233],{},[78,216,217,220],{},[48,218,219],{},"Build"," - Docker creates the container image.",[78,222,223,226],{},[48,224,225],{},"Test"," - GitLab Auto DevOps provides built-in security scans to ensure there are no vulnerabilities.",[78,228,229,232],{},[48,230,231],{},"Upload"," - Uses GitLab's built-in CI/CD component to push to Google Artifact Registry.",[78,234,235,238],{},[48,236,237],{},"Deploy"," - Uses Kubernetes configuration to deploy to GKE.",[12,240,241,242,246],{},"Here's the complete ",[243,244,245],"code",{},".gitlab-ci.yml",":",[248,249,254],"pre",{"className":250,"code":251,"language":252,"meta":253,"style":253},"language-yaml shiki shiki-themes github-light","\n\ndefault:\n  tags: [ saas-linux-2xlarge-amd64 ]\n\nstages:\n  - build\n  - test\n  - upload\n  - deploy\n\nvariables:\n  GITLAB_IMAGE: $CI_REGISTRY_IMAGE/main:$CI_COMMIT_SHORT_SHA\n  AR_IMAGE: $GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_LOCATION-docker.pkg.dev/$GOOGLE_ARTIFACT_REGISTRY_PROJECT_ID/$GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_NAME/main:$CI_COMMIT_SHORT_SHA\n  GCP_PROJECT_ID: \"your-project-id\"\n  GKE_CLUSTER: \"your-cluster\"\n  GKE_REGION: \"us-central1\"\n  KSA_NAME: \"ai-agent-ksa\"\n\nbuild:\n  image: docker:24.0.5\n  stage: build\n  services:\n    - docker:24.0.5-dind\n  before_script:\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n  script:\n    - docker build -t $GITLAB_IMAGE .\n    - docker push $GITLAB_IMAGE\n\ninclude:\n  - template: Jobs/Dependency-Scanning.gitlab-ci.yml\n  - template: Jobs/Container-Scanning.gitlab-ci.yml\n  - template: Jobs/Secret-Detection.gitlab-ci.yml\n  - component: gitlab.com/google-gitlab-components/artifact-registry/upload-artifact-registry@main\n    inputs:\n      stage: upload\n      source: $GITLAB_IMAGE\n      target: $AR_IMAGE\n\ndeploy:\n  stage: deploy\n  image: google/cloud-sdk:slim\n  identity: google_cloud\n  before_script:\n    - apt-get update && apt-get install -y kubectl google-cloud-sdk-gke-gcloud-auth-plugin\n    - gcloud container clusters get-credentials $GKE_CLUSTER --region $GKE_REGION --project $GCP_PROJECT_ID\n  script:\n    - |\n      kubectl apply -f - \u003C\u003CEOF\n      apiVersion: apps/v1\n      kind: Deployment\n      metadata:\n        name: ai-agent\n        namespace: default\n      spec:\n        replicas: 2\n        selector:\n          matchLabels:\n            app: ai-agent\n        template:\n          metadata:\n            labels:\n              app: ai-agent\n          spec:\n            serviceAccountName: $KSA_NAME\n            containers:\n            - name: ai-agent\n              image: $AR_IMAGE\n              ports:\n              - containerPort: 8080\n              resources:\n                requests: {cpu: 500m, memory: 1Gi}\n                limits: {cpu: 2000m, memory: 4Gi}\n              livenessProbe:\n                httpGet: {path: /health, port: 8080}\n                initialDelaySeconds: 60\n              readinessProbe:\n                httpGet: {path: /health, port: 8080}\n                initialDelaySeconds: 30\n      ---\n      apiVersion: v1\n      kind: Service\n      metadata:\n        name: ai-agent-service\n        namespace: default\n      spec:\n        type: LoadBalancer\n        ports:\n        - port: 80\n          targetPort: 8080\n        selector:\n          app: ai-agent\n      ---\n      apiVersion: autoscaling/v2\n      kind: HorizontalPodAutoscaler\n      metadata:\n        name: ai-agent-hpa\n        namespace: default\n      spec:\n        scaleTargetRef:\n          apiVersion: apps/v1\n          kind: Deployment\n          name: ai-agent\n        minReplicas: 2\n        maxReplicas: 10\n        metrics:\n        - type: Resource\n          resource:\n            name: cpu\n            target: {type: Utilization, averageUtilization: 70}\n      EOF\n      \n      kubectl rollout status deployment/ai-agent -n default --timeout=5m\n      EXTERNAL_IP=$(kubectl get service ai-agent-service -n default -o jsonpath='{.status.loadBalancer.ingress[0].ip}')\n      echo \"Deployed at: http://$EXTERNAL_IP\"\n  only:\n    - main\n","yaml","",[243,255,256,265,270,281,297,302,310,319,327,335,343,348,356,368,379,390,401,412,423,428,436,447,457,465,474,482,490,498,506,514,519,527,540,552,564,577,585,595,606,617,622,630,639,649,660,667,675,683,690,699,705,711,717,723,729,735,741,747,753,759,765,771,777,783,789,795,801,807,813,819,825,831,837,843,849,855,861,867,873,878,884,890,896,902,907,913,918,923,929,935,941,947,952,958,963,969,975,980,986,991,996,1002,1008,1014,1020,1026,1032,1038,1044,1050,1056,1062,1068,1074,1080,1086,1092,1100],{"__ignoreMap":253},[257,258,261],"span",{"class":259,"line":260},"line",1,[257,262,264],{"emptyLinePlaceholder":263},true,"\n",[257,266,268],{"class":259,"line":267},2,[257,269,264],{"emptyLinePlaceholder":263},[257,271,273,277],{"class":259,"line":272},3,[257,274,276],{"class":275},"shJU0","default",[257,278,280],{"class":279},"sgsFI",":\n",[257,282,284,287,290,294],{"class":259,"line":283},4,[257,285,286],{"class":275},"  tags",[257,288,289],{"class":279},": [ ",[257,291,293],{"class":292},"sYBdl","saas-linux-2xlarge-amd64",[257,295,296],{"class":279}," ]\n",[257,298,300],{"class":259,"line":299},5,[257,301,264],{"emptyLinePlaceholder":263},[257,303,305,308],{"class":259,"line":304},6,[257,306,307],{"class":275},"stages",[257,309,280],{"class":279},[257,311,313,316],{"class":259,"line":312},7,[257,314,315],{"class":279},"  - ",[257,317,318],{"class":292},"build\n",[257,320,322,324],{"class":259,"line":321},8,[257,323,315],{"class":279},[257,325,326],{"class":292},"test\n",[257,328,330,332],{"class":259,"line":329},9,[257,331,315],{"class":279},[257,333,334],{"class":292},"upload\n",[257,336,338,340],{"class":259,"line":337},10,[257,339,315],{"class":279},[257,341,342],{"class":292},"deploy\n",[257,344,346],{"class":259,"line":345},11,[257,347,264],{"emptyLinePlaceholder":263},[257,349,351,354],{"class":259,"line":350},12,[257,352,353],{"class":275},"variables",[257,355,280],{"class":279},[257,357,359,362,365],{"class":259,"line":358},13,[257,360,361],{"class":275},"  GITLAB_IMAGE",[257,363,364],{"class":279},": ",[257,366,367],{"class":292},"$CI_REGISTRY_IMAGE/main:$CI_COMMIT_SHORT_SHA\n",[257,369,371,374,376],{"class":259,"line":370},14,[257,372,373],{"class":275},"  AR_IMAGE",[257,375,364],{"class":279},[257,377,378],{"class":292},"$GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_LOCATION-docker.pkg.dev/$GOOGLE_ARTIFACT_REGISTRY_PROJECT_ID/$GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_NAME/main:$CI_COMMIT_SHORT_SHA\n",[257,380,382,385,387],{"class":259,"line":381},15,[257,383,384],{"class":275},"  GCP_PROJECT_ID",[257,386,364],{"class":279},[257,388,389],{"class":292},"\"your-project-id\"\n",[257,391,393,396,398],{"class":259,"line":392},16,[257,394,395],{"class":275},"  GKE_CLUSTER",[257,397,364],{"class":279},[257,399,400],{"class":292},"\"your-cluster\"\n",[257,402,404,407,409],{"class":259,"line":403},17,[257,405,406],{"class":275},"  GKE_REGION",[257,408,364],{"class":279},[257,410,411],{"class":292},"\"us-central1\"\n",[257,413,415,418,420],{"class":259,"line":414},18,[257,416,417],{"class":275},"  KSA_NAME",[257,419,364],{"class":279},[257,421,422],{"class":292},"\"ai-agent-ksa\"\n",[257,424,426],{"class":259,"line":425},19,[257,427,264],{"emptyLinePlaceholder":263},[257,429,431,434],{"class":259,"line":430},20,[257,432,433],{"class":275},"build",[257,435,280],{"class":279},[257,437,439,442,444],{"class":259,"line":438},21,[257,440,441],{"class":275},"  image",[257,443,364],{"class":279},[257,445,446],{"class":292},"docker:24.0.5\n",[257,448,450,453,455],{"class":259,"line":449},22,[257,451,452],{"class":275},"  stage",[257,454,364],{"class":279},[257,456,318],{"class":292},[257,458,460,463],{"class":259,"line":459},23,[257,461,462],{"class":275},"  services",[257,464,280],{"class":279},[257,466,468,471],{"class":259,"line":467},24,[257,469,470],{"class":279},"    - ",[257,472,473],{"class":292},"docker:24.0.5-dind\n",[257,475,477,480],{"class":259,"line":476},25,[257,478,479],{"class":275},"  before_script",[257,481,280],{"class":279},[257,483,485,487],{"class":259,"line":484},26,[257,486,470],{"class":279},[257,488,489],{"class":292},"docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n",[257,491,493,496],{"class":259,"line":492},27,[257,494,495],{"class":275},"  script",[257,497,280],{"class":279},[257,499,501,503],{"class":259,"line":500},28,[257,502,470],{"class":279},[257,504,505],{"class":292},"docker build -t $GITLAB_IMAGE .\n",[257,507,509,511],{"class":259,"line":508},29,[257,510,470],{"class":279},[257,512,513],{"class":292},"docker push $GITLAB_IMAGE\n",[257,515,517],{"class":259,"line":516},30,[257,518,264],{"emptyLinePlaceholder":263},[257,520,522,525],{"class":259,"line":521},31,[257,523,524],{"class":275},"include",[257,526,280],{"class":279},[257,528,530,532,535,537],{"class":259,"line":529},32,[257,531,315],{"class":279},[257,533,534],{"class":275},"template",[257,536,364],{"class":279},[257,538,539],{"class":292},"Jobs/Dependency-Scanning.gitlab-ci.yml\n",[257,541,543,545,547,549],{"class":259,"line":542},33,[257,544,315],{"class":279},[257,546,534],{"class":275},[257,548,364],{"class":279},[257,550,551],{"class":292},"Jobs/Container-Scanning.gitlab-ci.yml\n",[257,553,555,557,559,561],{"class":259,"line":554},34,[257,556,315],{"class":279},[257,558,534],{"class":275},[257,560,364],{"class":279},[257,562,563],{"class":292},"Jobs/Secret-Detection.gitlab-ci.yml\n",[257,565,567,569,572,574],{"class":259,"line":566},35,[257,568,315],{"class":279},[257,570,571],{"class":275},"component",[257,573,364],{"class":279},[257,575,576],{"class":292},"gitlab.com/google-gitlab-components/artifact-registry/upload-artifact-registry@main\n",[257,578,580,583],{"class":259,"line":579},36,[257,581,582],{"class":275},"    inputs",[257,584,280],{"class":279},[257,586,588,591,593],{"class":259,"line":587},37,[257,589,590],{"class":275},"      stage",[257,592,364],{"class":279},[257,594,334],{"class":292},[257,596,598,601,603],{"class":259,"line":597},38,[257,599,600],{"class":275},"      source",[257,602,364],{"class":279},[257,604,605],{"class":292},"$GITLAB_IMAGE\n",[257,607,609,612,614],{"class":259,"line":608},39,[257,610,611],{"class":275},"      target",[257,613,364],{"class":279},[257,615,616],{"class":292},"$AR_IMAGE\n",[257,618,620],{"class":259,"line":619},40,[257,621,264],{"emptyLinePlaceholder":263},[257,623,625,628],{"class":259,"line":624},41,[257,626,627],{"class":275},"deploy",[257,629,280],{"class":279},[257,631,633,635,637],{"class":259,"line":632},42,[257,634,452],{"class":275},[257,636,364],{"class":279},[257,638,342],{"class":292},[257,640,642,644,646],{"class":259,"line":641},43,[257,643,441],{"class":275},[257,645,364],{"class":279},[257,647,648],{"class":292},"google/cloud-sdk:slim\n",[257,650,652,655,657],{"class":259,"line":651},44,[257,653,654],{"class":275},"  identity",[257,656,364],{"class":279},[257,658,659],{"class":292},"google_cloud\n",[257,661,663,665],{"class":259,"line":662},45,[257,664,479],{"class":275},[257,666,280],{"class":279},[257,668,670,672],{"class":259,"line":669},46,[257,671,470],{"class":279},[257,673,674],{"class":292},"apt-get update && apt-get install -y kubectl google-cloud-sdk-gke-gcloud-auth-plugin\n",[257,676,678,680],{"class":259,"line":677},47,[257,679,470],{"class":279},[257,681,682],{"class":292},"gcloud container clusters get-credentials $GKE_CLUSTER --region $GKE_REGION --project $GCP_PROJECT_ID\n",[257,684,686,688],{"class":259,"line":685},48,[257,687,495],{"class":275},[257,689,280],{"class":279},[257,691,693,695],{"class":259,"line":692},49,[257,694,470],{"class":279},[257,696,698],{"class":697},"sD7c4","|\n",[257,700,702],{"class":259,"line":701},50,[257,703,704],{"class":292},"      kubectl apply -f - \u003C\u003CEOF\n",[257,706,708],{"class":259,"line":707},51,[257,709,710],{"class":292},"      apiVersion: apps/v1\n",[257,712,714],{"class":259,"line":713},52,[257,715,716],{"class":292},"      kind: Deployment\n",[257,718,720],{"class":259,"line":719},53,[257,721,722],{"class":292},"      metadata:\n",[257,724,726],{"class":259,"line":725},54,[257,727,728],{"class":292},"        name: ai-agent\n",[257,730,732],{"class":259,"line":731},55,[257,733,734],{"class":292},"        namespace: default\n",[257,736,738],{"class":259,"line":737},56,[257,739,740],{"class":292},"      spec:\n",[257,742,744],{"class":259,"line":743},57,[257,745,746],{"class":292},"        replicas: 2\n",[257,748,750],{"class":259,"line":749},58,[257,751,752],{"class":292},"        selector:\n",[257,754,756],{"class":259,"line":755},59,[257,757,758],{"class":292},"          matchLabels:\n",[257,760,762],{"class":259,"line":761},60,[257,763,764],{"class":292},"            app: ai-agent\n",[257,766,768],{"class":259,"line":767},61,[257,769,770],{"class":292},"        template:\n",[257,772,774],{"class":259,"line":773},62,[257,775,776],{"class":292},"          metadata:\n",[257,778,780],{"class":259,"line":779},63,[257,781,782],{"class":292},"            labels:\n",[257,784,786],{"class":259,"line":785},64,[257,787,788],{"class":292},"              app: ai-agent\n",[257,790,792],{"class":259,"line":791},65,[257,793,794],{"class":292},"          spec:\n",[257,796,798],{"class":259,"line":797},66,[257,799,800],{"class":292},"            serviceAccountName: $KSA_NAME\n",[257,802,804],{"class":259,"line":803},67,[257,805,806],{"class":292},"            containers:\n",[257,808,810],{"class":259,"line":809},68,[257,811,812],{"class":292},"            - name: ai-agent\n",[257,814,816],{"class":259,"line":815},69,[257,817,818],{"class":292},"              image: $AR_IMAGE\n",[257,820,822],{"class":259,"line":821},70,[257,823,824],{"class":292},"              ports:\n",[257,826,828],{"class":259,"line":827},71,[257,829,830],{"class":292},"              - containerPort: 8080\n",[257,832,834],{"class":259,"line":833},72,[257,835,836],{"class":292},"              resources:\n",[257,838,840],{"class":259,"line":839},73,[257,841,842],{"class":292},"                requests: {cpu: 500m, memory: 1Gi}\n",[257,844,846],{"class":259,"line":845},74,[257,847,848],{"class":292},"                limits: {cpu: 2000m, memory: 4Gi}\n",[257,850,852],{"class":259,"line":851},75,[257,853,854],{"class":292},"              livenessProbe:\n",[257,856,858],{"class":259,"line":857},76,[257,859,860],{"class":292},"                httpGet: {path: /health, port: 8080}\n",[257,862,864],{"class":259,"line":863},77,[257,865,866],{"class":292},"                initialDelaySeconds: 60\n",[257,868,870],{"class":259,"line":869},78,[257,871,872],{"class":292},"              readinessProbe:\n",[257,874,876],{"class":259,"line":875},79,[257,877,860],{"class":292},[257,879,881],{"class":259,"line":880},80,[257,882,883],{"class":292},"                initialDelaySeconds: 30\n",[257,885,887],{"class":259,"line":886},81,[257,888,889],{"class":292},"      ---\n",[257,891,893],{"class":259,"line":892},82,[257,894,895],{"class":292},"      apiVersion: v1\n",[257,897,899],{"class":259,"line":898},83,[257,900,901],{"class":292},"      kind: Service\n",[257,903,905],{"class":259,"line":904},84,[257,906,722],{"class":292},[257,908,910],{"class":259,"line":909},85,[257,911,912],{"class":292},"        name: ai-agent-service\n",[257,914,916],{"class":259,"line":915},86,[257,917,734],{"class":292},[257,919,921],{"class":259,"line":920},87,[257,922,740],{"class":292},[257,924,926],{"class":259,"line":925},88,[257,927,928],{"class":292},"        type: LoadBalancer\n",[257,930,932],{"class":259,"line":931},89,[257,933,934],{"class":292},"        ports:\n",[257,936,938],{"class":259,"line":937},90,[257,939,940],{"class":292},"        - port: 80\n",[257,942,944],{"class":259,"line":943},91,[257,945,946],{"class":292},"          targetPort: 8080\n",[257,948,950],{"class":259,"line":949},92,[257,951,752],{"class":292},[257,953,955],{"class":259,"line":954},93,[257,956,957],{"class":292},"          app: ai-agent\n",[257,959,961],{"class":259,"line":960},94,[257,962,889],{"class":292},[257,964,966],{"class":259,"line":965},95,[257,967,968],{"class":292},"      apiVersion: autoscaling/v2\n",[257,970,972],{"class":259,"line":971},96,[257,973,974],{"class":292},"      kind: HorizontalPodAutoscaler\n",[257,976,978],{"class":259,"line":977},97,[257,979,722],{"class":292},[257,981,983],{"class":259,"line":982},98,[257,984,985],{"class":292},"        name: ai-agent-hpa\n",[257,987,989],{"class":259,"line":988},99,[257,990,734],{"class":292},[257,992,994],{"class":259,"line":993},100,[257,995,740],{"class":292},[257,997,999],{"class":259,"line":998},101,[257,1000,1001],{"class":292},"        scaleTargetRef:\n",[257,1003,1005],{"class":259,"line":1004},102,[257,1006,1007],{"class":292},"          apiVersion: apps/v1\n",[257,1009,1011],{"class":259,"line":1010},103,[257,1012,1013],{"class":292},"          kind: Deployment\n",[257,1015,1017],{"class":259,"line":1016},104,[257,1018,1019],{"class":292},"          name: ai-agent\n",[257,1021,1023],{"class":259,"line":1022},105,[257,1024,1025],{"class":292},"        minReplicas: 2\n",[257,1027,1029],{"class":259,"line":1028},106,[257,1030,1031],{"class":292},"        maxReplicas: 10\n",[257,1033,1035],{"class":259,"line":1034},107,[257,1036,1037],{"class":292},"        metrics:\n",[257,1039,1041],{"class":259,"line":1040},108,[257,1042,1043],{"class":292},"        - type: Resource\n",[257,1045,1047],{"class":259,"line":1046},109,[257,1048,1049],{"class":292},"          resource:\n",[257,1051,1053],{"class":259,"line":1052},110,[257,1054,1055],{"class":292},"            name: cpu\n",[257,1057,1059],{"class":259,"line":1058},111,[257,1060,1061],{"class":292},"            target: {type: Utilization, averageUtilization: 70}\n",[257,1063,1065],{"class":259,"line":1064},112,[257,1066,1067],{"class":292},"      EOF\n",[257,1069,1071],{"class":259,"line":1070},113,[257,1072,1073],{"class":292},"      \n",[257,1075,1077],{"class":259,"line":1076},114,[257,1078,1079],{"class":292},"      kubectl rollout status deployment/ai-agent -n default --timeout=5m\n",[257,1081,1083],{"class":259,"line":1082},115,[257,1084,1085],{"class":292},"      EXTERNAL_IP=$(kubectl get service ai-agent-service -n default -o jsonpath='{.status.loadBalancer.ingress[0].ip}')\n",[257,1087,1089],{"class":259,"line":1088},116,[257,1090,1091],{"class":292},"      echo \"Deployed at: http://$EXTERNAL_IP\"\n",[257,1093,1095,1098],{"class":259,"line":1094},117,[257,1096,1097],{"class":275},"  only",[257,1099,280],{"class":279},[257,1101,1103,1105],{"class":259,"line":1102},118,[257,1104,470],{"class":279},[257,1106,1107],{"class":292},"main\n",[1109,1110,1112],"h4",{"id":1111},"the-critical-configuration-for-gke","The critical configuration for GKE",[12,1114,1115],{},"What makes this work — and why we need this extra configuration for GKE— is that we must have a Kubernetes Service Account in the cluster that can work with Vertex AI. We need that service account to be permitted to access the AI capabilities of Google Cloud.",[12,1117,1118],{},"Without this, we can deploy the application, but the AI agent won't work. We need to create a Kubernetes Service Account that can access Vertex AI.",[12,1120,1121],{},"Run this one-time setup:",[248,1123,1127],{"className":1124,"code":1125,"language":1126,"meta":253,"style":253},"language-bash shiki shiki-themes github-light","\n\n#!/bin/bash\n\n\nPROJECT_ID=\"your-project-id\"\n\n\nGSA_NAME=\"ai-agent-vertex\"\n\n\nGSA_EMAIL=\"${GSA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com\"\n\n\nKSA_NAME=\"ai-agent-ksa\"\n\n\nCLUSTER_NAME=\"your-cluster\"\n\n\nREGION=\"us-central1\"\n\n\n\n# Create GCP Service Account\n\n\ngcloud iam service-accounts create $GSA_NAME \\\n    --display-name=\"AI Agent Vertex AI\" \\\n    --project=$PROJECT_ID\n\n# Grant Vertex AI permissions\n\n\ngcloud projects add-iam-policy-binding $PROJECT_ID \\\n    --member=\"serviceAccount:${GSA_EMAIL}\" \\\n    --role=\"roles/aiplatform.user\"\n\n# Get cluster credentials\n\n\ngcloud container clusters get-credentials $CLUSTER_NAME \\\n    --region $REGION --project $PROJECT_ID\n\n# Create Kubernetes Service Account\n\n\nkubectl create serviceaccount $KSA_NAME -n default\n\n\n\n# Link accounts\n\n\nkubectl annotate serviceaccount $KSA_NAME -n default \\\n    iam.gke.io/gcp-service-account=${GSA_EMAIL}\n\ngcloud iam service-accounts add-iam-policy-binding ${GSA_EMAIL} \\\n    --role=roles/iam.workloadIdentityUser \\\n    --member=\"serviceAccount:${PROJECT_ID}.svc.id.goog[default/${KSA_NAME}]\" \\\n    --project=$PROJECT_ID\n","bash",[243,1128,1129,1133,1137,1143,1147,1151,1161,1165,1169,1179,1183,1187,1207,1211,1215,1224,1228,1232,1241,1245,1249,1258,1262,1266,1270,1275,1279,1283,1305,1316,1324,1328,1333,1337,1341,1356,1371,1379,1383,1388,1392,1396,1414,1428,1432,1437,1441,1445,1464,1468,1472,1476,1481,1485,1489,1507,1515,1519,1534,1541,1559],{"__ignoreMap":253},[257,1130,1131],{"class":259,"line":260},[257,1132,264],{"emptyLinePlaceholder":263},[257,1134,1135],{"class":259,"line":267},[257,1136,264],{"emptyLinePlaceholder":263},[257,1138,1139],{"class":259,"line":272},[257,1140,1142],{"class":1141},"sAwPA","#!/bin/bash\n",[257,1144,1145],{"class":259,"line":283},[257,1146,264],{"emptyLinePlaceholder":263},[257,1148,1149],{"class":259,"line":299},[257,1150,264],{"emptyLinePlaceholder":263},[257,1152,1153,1156,1159],{"class":259,"line":304},[257,1154,1155],{"class":279},"PROJECT_ID",[257,1157,1158],{"class":697},"=",[257,1160,389],{"class":292},[257,1162,1163],{"class":259,"line":312},[257,1164,264],{"emptyLinePlaceholder":263},[257,1166,1167],{"class":259,"line":321},[257,1168,264],{"emptyLinePlaceholder":263},[257,1170,1171,1174,1176],{"class":259,"line":329},[257,1172,1173],{"class":279},"GSA_NAME",[257,1175,1158],{"class":697},[257,1177,1178],{"class":292},"\"ai-agent-vertex\"\n",[257,1180,1181],{"class":259,"line":337},[257,1182,264],{"emptyLinePlaceholder":263},[257,1184,1185],{"class":259,"line":345},[257,1186,264],{"emptyLinePlaceholder":263},[257,1188,1189,1192,1194,1197,1199,1202,1204],{"class":259,"line":350},[257,1190,1191],{"class":279},"GSA_EMAIL",[257,1193,1158],{"class":697},[257,1195,1196],{"class":292},"\"${",[257,1198,1173],{"class":279},[257,1200,1201],{"class":292},"}@${",[257,1203,1155],{"class":279},[257,1205,1206],{"class":292},"}.iam.gserviceaccount.com\"\n",[257,1208,1209],{"class":259,"line":358},[257,1210,264],{"emptyLinePlaceholder":263},[257,1212,1213],{"class":259,"line":370},[257,1214,264],{"emptyLinePlaceholder":263},[257,1216,1217,1220,1222],{"class":259,"line":381},[257,1218,1219],{"class":279},"KSA_NAME",[257,1221,1158],{"class":697},[257,1223,422],{"class":292},[257,1225,1226],{"class":259,"line":392},[257,1227,264],{"emptyLinePlaceholder":263},[257,1229,1230],{"class":259,"line":403},[257,1231,264],{"emptyLinePlaceholder":263},[257,1233,1234,1237,1239],{"class":259,"line":414},[257,1235,1236],{"class":279},"CLUSTER_NAME",[257,1238,1158],{"class":697},[257,1240,400],{"class":292},[257,1242,1243],{"class":259,"line":425},[257,1244,264],{"emptyLinePlaceholder":263},[257,1246,1247],{"class":259,"line":430},[257,1248,264],{"emptyLinePlaceholder":263},[257,1250,1251,1254,1256],{"class":259,"line":438},[257,1252,1253],{"class":279},"REGION",[257,1255,1158],{"class":697},[257,1257,411],{"class":292},[257,1259,1260],{"class":259,"line":449},[257,1261,264],{"emptyLinePlaceholder":263},[257,1263,1264],{"class":259,"line":459},[257,1265,264],{"emptyLinePlaceholder":263},[257,1267,1268],{"class":259,"line":467},[257,1269,264],{"emptyLinePlaceholder":263},[257,1271,1272],{"class":259,"line":476},[257,1273,1274],{"class":1141},"# Create GCP Service Account\n",[257,1276,1277],{"class":259,"line":484},[257,1278,264],{"emptyLinePlaceholder":263},[257,1280,1281],{"class":259,"line":492},[257,1282,264],{"emptyLinePlaceholder":263},[257,1284,1285,1289,1292,1295,1298,1301],{"class":259,"line":500},[257,1286,1288],{"class":1287},"s7eDp","gcloud",[257,1290,1291],{"class":292}," iam",[257,1293,1294],{"class":292}," service-accounts",[257,1296,1297],{"class":292}," create",[257,1299,1300],{"class":279}," $GSA_NAME ",[257,1302,1304],{"class":1303},"sYu0t","\\\n",[257,1306,1307,1310,1313],{"class":259,"line":508},[257,1308,1309],{"class":1303},"    --display-name=",[257,1311,1312],{"class":292},"\"AI Agent Vertex AI\"",[257,1314,1315],{"class":1303}," \\\n",[257,1317,1318,1321],{"class":259,"line":516},[257,1319,1320],{"class":1303},"    --project=",[257,1322,1323],{"class":279},"$PROJECT_ID\n",[257,1325,1326],{"class":259,"line":521},[257,1327,264],{"emptyLinePlaceholder":263},[257,1329,1330],{"class":259,"line":529},[257,1331,1332],{"class":1141},"# Grant Vertex AI permissions\n",[257,1334,1335],{"class":259,"line":542},[257,1336,264],{"emptyLinePlaceholder":263},[257,1338,1339],{"class":259,"line":554},[257,1340,264],{"emptyLinePlaceholder":263},[257,1342,1343,1345,1348,1351,1354],{"class":259,"line":566},[257,1344,1288],{"class":1287},[257,1346,1347],{"class":292}," projects",[257,1349,1350],{"class":292}," add-iam-policy-binding",[257,1352,1353],{"class":279}," $PROJECT_ID ",[257,1355,1304],{"class":1303},[257,1357,1358,1361,1364,1366,1369],{"class":259,"line":579},[257,1359,1360],{"class":1303},"    --member=",[257,1362,1363],{"class":292},"\"serviceAccount:${",[257,1365,1191],{"class":279},[257,1367,1368],{"class":292},"}\"",[257,1370,1315],{"class":1303},[257,1372,1373,1376],{"class":259,"line":587},[257,1374,1375],{"class":1303},"    --role=",[257,1377,1378],{"class":292},"\"roles/aiplatform.user\"\n",[257,1380,1381],{"class":259,"line":597},[257,1382,264],{"emptyLinePlaceholder":263},[257,1384,1385],{"class":259,"line":608},[257,1386,1387],{"class":1141},"# Get cluster credentials\n",[257,1389,1390],{"class":259,"line":619},[257,1391,264],{"emptyLinePlaceholder":263},[257,1393,1394],{"class":259,"line":624},[257,1395,264],{"emptyLinePlaceholder":263},[257,1397,1398,1400,1403,1406,1409,1412],{"class":259,"line":632},[257,1399,1288],{"class":1287},[257,1401,1402],{"class":292}," container",[257,1404,1405],{"class":292}," clusters",[257,1407,1408],{"class":292}," get-credentials",[257,1410,1411],{"class":279}," $CLUSTER_NAME ",[257,1413,1304],{"class":1303},[257,1415,1416,1419,1422,1425],{"class":259,"line":641},[257,1417,1418],{"class":1303},"    --region",[257,1420,1421],{"class":279}," $REGION ",[257,1423,1424],{"class":1303},"--project",[257,1426,1427],{"class":279}," $PROJECT_ID\n",[257,1429,1430],{"class":259,"line":651},[257,1431,264],{"emptyLinePlaceholder":263},[257,1433,1434],{"class":259,"line":662},[257,1435,1436],{"class":1141},"# Create Kubernetes Service Account\n",[257,1438,1439],{"class":259,"line":669},[257,1440,264],{"emptyLinePlaceholder":263},[257,1442,1443],{"class":259,"line":677},[257,1444,264],{"emptyLinePlaceholder":263},[257,1446,1447,1450,1452,1455,1458,1461],{"class":259,"line":685},[257,1448,1449],{"class":1287},"kubectl",[257,1451,1297],{"class":292},[257,1453,1454],{"class":292}," serviceaccount",[257,1456,1457],{"class":279}," $KSA_NAME ",[257,1459,1460],{"class":1303},"-n",[257,1462,1463],{"class":292}," default\n",[257,1465,1466],{"class":259,"line":692},[257,1467,264],{"emptyLinePlaceholder":263},[257,1469,1470],{"class":259,"line":701},[257,1471,264],{"emptyLinePlaceholder":263},[257,1473,1474],{"class":259,"line":707},[257,1475,264],{"emptyLinePlaceholder":263},[257,1477,1478],{"class":259,"line":713},[257,1479,1480],{"class":1141},"# Link accounts\n",[257,1482,1483],{"class":259,"line":719},[257,1484,264],{"emptyLinePlaceholder":263},[257,1486,1487],{"class":259,"line":725},[257,1488,264],{"emptyLinePlaceholder":263},[257,1490,1491,1493,1496,1498,1500,1502,1505],{"class":259,"line":731},[257,1492,1449],{"class":1287},[257,1494,1495],{"class":292}," annotate",[257,1497,1454],{"class":292},[257,1499,1457],{"class":279},[257,1501,1460],{"class":1303},[257,1503,1504],{"class":292}," default",[257,1506,1315],{"class":1303},[257,1508,1509,1512],{"class":259,"line":737},[257,1510,1511],{"class":292},"    iam.gke.io/gcp-service-account=",[257,1513,1514],{"class":279},"${GSA_EMAIL}\n",[257,1516,1517],{"class":259,"line":743},[257,1518,264],{"emptyLinePlaceholder":263},[257,1520,1521,1523,1525,1527,1529,1532],{"class":259,"line":749},[257,1522,1288],{"class":1287},[257,1524,1291],{"class":292},[257,1526,1294],{"class":292},[257,1528,1350],{"class":292},[257,1530,1531],{"class":279}," ${GSA_EMAIL} ",[257,1533,1304],{"class":1303},[257,1535,1536,1539],{"class":259,"line":755},[257,1537,1538],{"class":1303},"    --role=roles/iam.workloadIdentityUser",[257,1540,1315],{"class":1303},[257,1542,1543,1545,1547,1549,1552,1554,1557],{"class":259,"line":761},[257,1544,1360],{"class":1303},[257,1546,1363],{"class":292},[257,1548,1155],{"class":279},[257,1550,1551],{"class":292},"}.svc.id.goog[default/${",[257,1553,1219],{"class":279},[257,1555,1556],{"class":292},"}]\"",[257,1558,1315],{"class":1303},[257,1560,1561,1563],{"class":259,"line":767},[257,1562,1320],{"class":1303},[257,1564,1323],{"class":279},[106,1566,1568],{"id":1567},"_4-deploy-to-gke","4. Deploy to GKE",[12,1570,1571],{},"Once you're done, push this change to the pipeline and you're good to go.",[12,1573,1574,1575,1578],{},"You can see the pipeline has just deployed. Go to ",[48,1576,1577],{},"CI/CD > Pipelines"," and you'll see the four stages:",[75,1580,1581,1583,1586,1589],{},[78,1582,219],{},[78,1584,1585],{},"Test (with all defined security scans)",[78,1587,1588],{},"Upload to Artifact Registry (successful)",[78,1590,1591],{},"Deploy to Kubernetes in GKE (success)",[29,1593,1595],{"id":1594},"summary","Summary",[12,1597,1598],{},"With GitLab and Google Cloud together, you're able to deploy your AI agent to GKE with ease and security. We didn't have to go through a lot of steps — we were able to do that thanks to GitLab's native integration with Google Cloud.",[12,1600,1601],{},"Watch this demo:",[1603,1604,1607,1608],"figure",{"className":1605},[1606],"video_container","\n  ",[1609,1610,1614],"iframe",{"src":1611,"frameBorder":1612,"allowFullScreen":1613},"https://www.youtube.com/embed/mc2pCL5Qjus?si=QoH02lvz5KH5Ku9O","0","true"," ",[1616,1617,1618],"blockquote",{},[12,1619,1620,1621,1626,1627,1632,1633,156],{},"Use this tutorial's ",[16,1622,1625],{"href":1623,"rel":1624},"https://gitlab.com/gitlab-partners-public/google-cloud/demos/gke-ai-agent",[],"complete code example"," to get started now. Not a GitLab customer yet? Explore the DevSecOps platform with ",[16,1628,1631],{"href":1629,"rel":1630},"https://about.gitlab.com/free-trial/",[],"a free trial",". Startups hosted on Google Cloud have a ",[16,1634,1637],{"href":1635,"rel":1636},"https://about.gitlab.com/solutions/startups/google-cloud/",[],"special perk to try and use GitLab",[1639,1640,1641],"style",{},"html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}",{"title":253,"searchDepth":267,"depth":267,"links":1643},[1644,1645,1646,1652],{"id":31,"depth":267,"text":32},{"id":69,"depth":267,"text":70},{"id":103,"depth":267,"text":104,"children":1647},[1648,1649,1650,1651],{"id":108,"depth":272,"text":109},{"id":142,"depth":272,"text":143},{"id":201,"depth":272,"text":202},{"id":1567,"depth":272,"text":1568},{"id":1594,"depth":267,"text":1595},"ai","2025-11-10","This guide explains how to deploy an ADK-based AI agent to Google Kubernetes Engine using GitLab's AI-powered DevSecOps platform, with ease and security.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1749670563/Blog/Hero%20Images/cloudcomputing.jpg",{},"/en-us/blog/secure-ai-agent-deployment-to-gke",{"config":1663,"title":5,"description":1655},{"noIndex":1658},"secure-ai-agent-deployment-to-gke","en-us/blog/secure-ai-agent-deployment-to-gke",[1667,1668,1669,1670],"AI","google","cloud native","tutorial","BlogPost","QWjGIOwmiQpWfzCQqgBeP0Sz6zXZBfsT3pXMucxC-0o",{"logo":1674,"freeTrial":1679,"sales":1684,"login":1689,"items":1694,"search":2021,"minimal":2052,"duo":2071,"switchNav":2080,"pricingDeployment":2091},{"config":1675},{"href":1676,"dataGaName":1677,"dataGaLocation":1678},"/","gitlab logo","header",{"text":1680,"config":1681},"Get free trial",{"href":1682,"dataGaName":1683,"dataGaLocation":1678},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":1685,"config":1686},"Request a demo",{"href":1687,"dataGaName":1688,"dataGaLocation":1678},"/sales/?contact-topic=request-demo","sales",{"text":1690,"config":1691},"Sign in",{"href":1692,"dataGaName":1693,"dataGaLocation":1678},"https://gitlab.com/users/sign_in/","sign in",[1695,1724,1824,1829,1943,1999],{"text":1696,"config":1697,"menu":1699},"Platform",{"dataNavLevelOne":1698},"platform",{"type":1700,"columns":1701},"cards",[1702,1708,1716],{"title":1696,"description":1703,"link":1704},"The intelligent orchestration platform for DevSecOps",{"text":1705,"config":1706},"Explore our Platform",{"href":1707,"dataGaName":1698,"dataGaLocation":1678},"/platform/",{"title":1709,"description":1710,"link":1711},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":1712,"config":1713},"Meet GitLab Duo",{"href":1714,"dataGaName":1715,"dataGaLocation":1678},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1717,"description":1718,"link":1719},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":1720,"config":1721},"Learn more",{"href":1722,"dataGaName":1723,"dataGaLocation":1678},"/why-gitlab/","why gitlab",{"text":1725,"left":263,"config":1726,"menu":1728},"Product",{"dataNavLevelOne":1727},"solutions",{"type":1729,"link":1730,"columns":1734,"feature":1803},"lists",{"text":1731,"config":1732},"View all Solutions",{"href":1733,"dataGaName":1727,"dataGaLocation":1678},"/solutions/",[1735,1759,1782],{"title":1736,"description":1737,"link":1738,"items":1743},"Automation","CI/CD and automation to accelerate deployment",{"config":1739},{"icon":1740,"href":1741,"dataGaName":1742,"dataGaLocation":1678},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[1744,1748,1751,1755],{"text":1745,"config":1746},"CI/CD",{"href":1747,"dataGaLocation":1678,"dataGaName":1745},"/solutions/continuous-integration/",{"text":1709,"config":1749},{"href":1714,"dataGaLocation":1678,"dataGaName":1750},"gitlab duo agent platform - product menu",{"text":1752,"config":1753},"Source Code Management",{"href":1754,"dataGaLocation":1678,"dataGaName":1752},"/solutions/source-code-management/",{"text":1756,"config":1757},"Automated Software Delivery",{"href":1741,"dataGaLocation":1678,"dataGaName":1758},"Automated software delivery",{"title":1760,"description":1761,"link":1762,"items":1767},"Security","Deliver code faster without compromising security",{"config":1763},{"href":1764,"dataGaName":1765,"dataGaLocation":1678,"icon":1766},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1768,1772,1777],{"text":1769,"config":1770},"Application Security Testing",{"href":1764,"dataGaName":1771,"dataGaLocation":1678},"Application security testing",{"text":1773,"config":1774},"Software Supply Chain Security",{"href":1775,"dataGaLocation":1678,"dataGaName":1776},"/solutions/supply-chain/","Software supply chain security",{"text":1778,"config":1779},"Software Compliance",{"href":1780,"dataGaName":1781,"dataGaLocation":1678},"/solutions/software-compliance/","software compliance",{"title":1783,"link":1784,"items":1789},"Measurement",{"config":1785},{"icon":1786,"href":1787,"dataGaName":1788,"dataGaLocation":1678},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[1790,1794,1798],{"text":1791,"config":1792},"Visibility & Measurement",{"href":1787,"dataGaLocation":1678,"dataGaName":1793},"Visibility and Measurement",{"text":1795,"config":1796},"Value Stream Management",{"href":1797,"dataGaLocation":1678,"dataGaName":1795},"/solutions/value-stream-management/",{"text":1799,"config":1800},"Analytics & Insights",{"href":1801,"dataGaLocation":1678,"dataGaName":1802},"/solutions/analytics-and-insights/","Analytics and insights",{"title":1804,"type":1729,"items":1805},"GitLab for",[1806,1812,1818],{"text":1807,"config":1808},"Enterprise",{"icon":1809,"href":1810,"dataGaLocation":1678,"dataGaName":1811},"Building","/enterprise/","enterprise",{"text":1813,"config":1814},"Small Business",{"icon":1815,"href":1816,"dataGaLocation":1678,"dataGaName":1817},"Work","/small-business/","small business",{"text":1819,"config":1820},"Public Sector",{"icon":1821,"href":1822,"dataGaLocation":1678,"dataGaName":1823},"Organization","/solutions/public-sector/","public sector",{"text":1825,"config":1826},"Pricing",{"href":1827,"dataGaName":1828,"dataGaLocation":1678,"dataNavLevelOne":1828},"/pricing/","pricing",{"text":1830,"config":1831,"menu":1833},"Resources",{"dataNavLevelOne":1832},"resources",{"type":1729,"link":1834,"columns":1838,"feature":1932},{"text":1835,"config":1836},"View all resources",{"href":1837,"dataGaName":1832,"dataGaLocation":1678},"/resources/",[1839,1872,1899],{"title":1840,"items":1841},"Getting started",[1842,1847,1852,1857,1862,1867],{"text":1843,"config":1844},"Install",{"href":1845,"dataGaName":1846,"dataGaLocation":1678},"/install/","install",{"text":1848,"config":1849},"Quick start guides",{"href":1850,"dataGaName":1851,"dataGaLocation":1678},"/get-started/","quick setup checklists",{"text":1853,"config":1854},"Learn",{"href":1855,"dataGaLocation":1678,"dataGaName":1856},"https://university.gitlab.com/","learn",{"text":1858,"config":1859},"Product documentation",{"href":1860,"dataGaName":1861,"dataGaLocation":1678},"https://docs.gitlab.com/","product documentation",{"text":1863,"config":1864},"Best practice videos",{"href":1865,"dataGaName":1866,"dataGaLocation":1678},"/getting-started-videos/","best practice videos",{"text":1868,"config":1869},"Integrations",{"href":1870,"dataGaName":1871,"dataGaLocation":1678},"/integrations/","integrations",{"title":1873,"items":1874},"Discover",[1875,1880,1885,1890,1894],{"text":1876,"config":1877},"Customer success stories",{"href":1878,"dataGaName":1879,"dataGaLocation":1678},"/customers/","customer success stories",{"text":1881,"config":1882},"Blog",{"href":1883,"dataGaName":1884,"dataGaLocation":1678},"/blog/","blog",{"text":1886,"config":1887},"Demo Hub",{"href":1888,"dataGaName":1889,"dataGaLocation":1678},"/demo-hub/","demo hub",{"text":1891,"config":1892},"The Source",{"href":1893,"dataGaName":1884,"dataGaLocation":1678},"/the-source/",{"text":1895,"config":1896},"Remote",{"href":1897,"dataGaName":1898,"dataGaLocation":1678},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1900,"items":1901},"Connect",[1902,1907,1912,1917,1922,1927],{"text":1903,"config":1904},"GitLab Services",{"href":1905,"dataGaName":1906,"dataGaLocation":1678},"/services/","services",{"text":1908,"config":1909},"Contribute",{"href":1910,"dataGaName":1911,"dataGaLocation":1678},"https://contributors.gitlab.com","contribute",{"text":1913,"config":1914},"Community",{"href":1915,"dataGaName":1916,"dataGaLocation":1678},"/community/","community",{"text":1918,"config":1919},"Forum",{"href":1920,"dataGaName":1921,"dataGaLocation":1678},"https://forum.gitlab.com/","forum",{"text":1923,"config":1924},"Events",{"href":1925,"dataGaName":1926,"dataGaLocation":1678},"/events/","events",{"text":1928,"config":1929},"Partners",{"href":1930,"dataGaName":1931,"dataGaLocation":1678},"/partners/","partners",{"config":1933,"title":1936,"text":1937,"link":1938},{"background":1934,"textColor":1935},"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":1939,"config":1940},"Read the latest",{"href":1941,"dataGaName":1942,"dataGaLocation":1678},"/whats-new/","whats new",{"text":1944,"config":1945,"menu":1947},"Company",{"dataNavLevelOne":1946},"company",{"type":1729,"columns":1948},[1949],{"items":1950},[1951,1956,1962,1964,1969,1974,1979,1984,1989,1994],{"text":1952,"config":1953},"About",{"href":1954,"dataGaName":1955,"dataGaLocation":1678},"/company/","about",{"text":1957,"config":1958,"footerGa":1961},"Jobs",{"href":1959,"dataGaName":1960,"dataGaLocation":1678},"/jobs/","jobs",{"dataGaName":1960},{"text":1923,"config":1963},{"href":1925,"dataGaName":1926,"dataGaLocation":1678},{"text":1965,"config":1966},"Leadership",{"href":1967,"dataGaName":1968,"dataGaLocation":1678},"/company/team/e-group/","leadership",{"text":1970,"config":1971},"Handbook",{"href":1972,"dataGaName":1973,"dataGaLocation":1678},"https://handbook.gitlab.com/","handbook",{"text":1975,"config":1976},"Investor relations",{"href":1977,"dataGaName":1978,"dataGaLocation":1678},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1980,"config":1981},"Trust Center",{"href":1982,"dataGaName":1983,"dataGaLocation":1678},"/security/","trust center",{"text":1985,"config":1986},"AI Transparency Center",{"href":1987,"dataGaName":1988,"dataGaLocation":1678},"/ai-transparency-center/","ai transparency center",{"text":1990,"config":1991},"Newsletter",{"href":1992,"dataGaName":1993,"dataGaLocation":1678},"/company/contact/#contact-forms","newsletter",{"text":1995,"config":1996},"Press",{"href":1997,"dataGaName":1998,"dataGaLocation":1678},"/press/","press",{"text":2000,"config":2001,"menu":2002},"Contact us",{"dataNavLevelOne":1946},{"type":1729,"columns":2003},[2004],{"items":2005},[2006,2011,2016],{"text":2007,"config":2008},"Talk to sales",{"href":2009,"dataGaName":2010,"dataGaLocation":1678},"/sales/","talk to sales",{"text":2012,"config":2013},"Support portal",{"href":2014,"dataGaName":2015,"dataGaLocation":1678},"https://support.gitlab.com/hc/en-us","support portal",{"text":2017,"config":2018},"Customer portal",{"href":2019,"dataGaName":2020,"dataGaLocation":1678},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":2022,"login":2023,"suggestions":2030},"Close",{"text":2024,"link":2025},"To search repositories and projects, login to",{"text":2026,"config":2027},"gitlab.com",{"href":1692,"dataGaName":2028,"dataGaLocation":2029},"search login","search",{"text":2031,"default":2032},"Suggestions",[2033,2035,2039,2041,2045,2049],{"text":1709,"config":2034},{"href":1714,"dataGaName":1709,"dataGaLocation":2029},{"text":2036,"config":2037},"Code Suggestions (AI)",{"href":2038,"dataGaName":2036,"dataGaLocation":2029},"/solutions/code-suggestions/",{"text":1745,"config":2040},{"href":1747,"dataGaName":1745,"dataGaLocation":2029},{"text":2042,"config":2043},"GitLab on AWS",{"href":2044,"dataGaName":2042,"dataGaLocation":2029},"/partners/technology-partners/aws/",{"text":2046,"config":2047},"GitLab on Google Cloud",{"href":2048,"dataGaName":2046,"dataGaLocation":2029},"/partners/technology-partners/google-cloud-platform/",{"text":2050,"config":2051},"Why GitLab?",{"href":1722,"dataGaName":2050,"dataGaLocation":2029},{"freeTrial":2053,"mobileIcon":2058,"desktopIcon":2063,"secondaryButton":2066},{"text":2054,"config":2055},"Start free trial",{"href":2056,"dataGaName":1683,"dataGaLocation":2057},"https://gitlab.com/-/trials/new/","nav",{"altText":2059,"config":2060},"Gitlab Icon",{"src":2061,"dataGaName":2062,"dataGaLocation":2057},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":2059,"config":2064},{"src":2065,"dataGaName":2062,"dataGaLocation":2057},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":2067,"config":2068},"Get Started",{"href":2069,"dataGaName":2070,"dataGaLocation":2057},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":2072,"mobileIcon":2076,"desktopIcon":2078},{"text":2073,"config":2074},"Learn more about GitLab Duo",{"href":1714,"dataGaName":2075,"dataGaLocation":2057},"gitlab duo",{"altText":2059,"config":2077},{"src":2061,"dataGaName":2062,"dataGaLocation":2057},{"altText":2059,"config":2079},{"src":2065,"dataGaName":2062,"dataGaLocation":2057},{"button":2081,"mobileIcon":2086,"desktopIcon":2088},{"text":2082,"config":2083},"/switch",{"href":2084,"dataGaName":2085,"dataGaLocation":2057},"#contact","switch",{"altText":2059,"config":2087},{"src":2061,"dataGaName":2062,"dataGaLocation":2057},{"altText":2059,"config":2089},{"src":2090,"dataGaName":2062,"dataGaLocation":2057},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":2092,"mobileIcon":2097,"desktopIcon":2099},{"text":2093,"config":2094},"Back to pricing",{"href":1827,"dataGaName":2095,"dataGaLocation":2057,"icon":2096},"back to pricing","GoBack",{"altText":2059,"config":2098},{"src":2061,"dataGaName":2062,"dataGaLocation":2057},{"altText":2059,"config":2100},{"src":2065,"dataGaName":2062,"dataGaLocation":2057},{"title":2102,"titleMobile":2103,"button":2104,"config":2109},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":1720,"config":2105},{"href":2106,"dataGaName":2107,"dataGaLocation":2108},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":2110,"disabled":1658},"release",{"data":2112},{"text":2113,"source":2114,"edit":2120,"contribute":2125,"config":2130,"items":2135,"minimal":2344},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":2115,"config":2116},"View page source",{"href":2117,"dataGaName":2118,"dataGaLocation":2119},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":2121,"config":2122},"Edit this page",{"href":2123,"dataGaName":2124,"dataGaLocation":2119},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":2126,"config":2127},"Please contribute",{"href":2128,"dataGaName":2129,"dataGaLocation":2119},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":2131,"facebook":2132,"youtube":2133,"linkedin":2134},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[2136,2183,2236,2280,2312],{"title":1825,"links":2137,"subMenu":2152},[2138,2142,2147],{"text":2139,"config":2140},"View plans",{"href":1827,"dataGaName":2141,"dataGaLocation":2119},"view plans",{"text":2143,"config":2144},"Why Premium?",{"href":2145,"dataGaName":2146,"dataGaLocation":2119},"/pricing/premium/","why premium",{"text":2148,"config":2149},"Why Ultimate?",{"href":2150,"dataGaName":2151,"dataGaLocation":2119},"/pricing/ultimate/","why ultimate",[2153],{"title":2154,"links":2155},"Contact Us",[2156,2159,2161,2163,2168,2173,2178],{"text":2157,"config":2158},"Contact sales",{"href":2009,"dataGaName":1688,"dataGaLocation":2119},{"text":2012,"config":2160},{"href":2014,"dataGaName":2015,"dataGaLocation":2119},{"text":2017,"config":2162},{"href":2019,"dataGaName":2020,"dataGaLocation":2119},{"text":2164,"config":2165},"Status",{"href":2166,"dataGaName":2167,"dataGaLocation":2119},"https://status.gitlab.com/","status",{"text":2169,"config":2170},"Terms of use",{"href":2171,"dataGaName":2172,"dataGaLocation":2119},"/terms/","terms of use",{"text":2174,"config":2175},"Privacy statement",{"href":2176,"dataGaName":2177,"dataGaLocation":2119},"/privacy/","privacy statement",{"text":2179,"config":2180},"Cookie preferences",{"dataGaName":2181,"dataGaLocation":2119,"id":2182,"isOneTrustButton":263},"cookie preferences","ot-sdk-btn",{"title":1725,"links":2184,"subMenu":2193},[2185,2189],{"text":2186,"config":2187},"DevSecOps platform",{"href":1707,"dataGaName":2188,"dataGaLocation":2119},"devsecops platform",{"text":2190,"config":2191},"AI-Assisted Development",{"href":1714,"dataGaName":2192,"dataGaLocation":2119},"ai-assisted development",[2194],{"title":2195,"links":2196},"Topics",[2197,2202,2207,2212,2217,2222,2226,2231],{"text":2198,"config":2199},"CICD",{"href":2200,"dataGaName":2201,"dataGaLocation":2119},"/topics/ci-cd/","cicd",{"text":2203,"config":2204},"GitOps",{"href":2205,"dataGaName":2206,"dataGaLocation":2119},"/topics/gitops/","gitops",{"text":2208,"config":2209},"DevOps",{"href":2210,"dataGaName":2211,"dataGaLocation":2119},"/topics/devops/","devops",{"text":2213,"config":2214},"Version Control",{"href":2215,"dataGaName":2216,"dataGaLocation":2119},"/topics/version-control/","version control",{"text":2218,"config":2219},"DevSecOps",{"href":2220,"dataGaName":2221,"dataGaLocation":2119},"/topics/devsecops/","devsecops",{"text":2223,"config":2224},"Cloud Native",{"href":2225,"dataGaName":1669,"dataGaLocation":2119},"/topics/cloud-native/",{"text":2227,"config":2228},"AI for Coding",{"href":2229,"dataGaName":2230,"dataGaLocation":2119},"/topics/devops/ai-for-coding/","ai for coding",{"text":2232,"config":2233},"Agentic AI",{"href":2234,"dataGaName":2235,"dataGaLocation":2119},"/topics/agentic-ai/","agentic ai",{"title":2237,"links":2238},"Solutions",[2239,2241,2243,2248,2252,2255,2259,2262,2264,2267,2270,2275],{"text":1769,"config":2240},{"href":1764,"dataGaName":1769,"dataGaLocation":2119},{"text":1758,"config":2242},{"href":1741,"dataGaName":1742,"dataGaLocation":2119},{"text":2244,"config":2245},"Agile development",{"href":2246,"dataGaName":2247,"dataGaLocation":2119},"/solutions/agile-delivery/","agile delivery",{"text":2249,"config":2250},"SCM",{"href":1754,"dataGaName":2251,"dataGaLocation":2119},"source code management",{"text":2198,"config":2253},{"href":1747,"dataGaName":2254,"dataGaLocation":2119},"continuous integration & delivery",{"text":2256,"config":2257},"Value stream management",{"href":1797,"dataGaName":2258,"dataGaLocation":2119},"value stream management",{"text":2203,"config":2260},{"href":2261,"dataGaName":2206,"dataGaLocation":2119},"/solutions/gitops/",{"text":1807,"config":2263},{"href":1810,"dataGaName":1811,"dataGaLocation":2119},{"text":2265,"config":2266},"Small business",{"href":1816,"dataGaName":1817,"dataGaLocation":2119},{"text":2268,"config":2269},"Public sector",{"href":1822,"dataGaName":1823,"dataGaLocation":2119},{"text":2271,"config":2272},"Education",{"href":2273,"dataGaName":2274,"dataGaLocation":2119},"/solutions/education/","education",{"text":2276,"config":2277},"Financial services",{"href":2278,"dataGaName":2279,"dataGaLocation":2119},"/solutions/finance/","financial services",{"title":1830,"links":2281},[2282,2284,2286,2288,2291,2293,2296,2298,2300,2302,2304,2306,2308,2310],{"text":1843,"config":2283},{"href":1845,"dataGaName":1846,"dataGaLocation":2119},{"text":1848,"config":2285},{"href":1850,"dataGaName":1851,"dataGaLocation":2119},{"text":1853,"config":2287},{"href":1855,"dataGaName":1856,"dataGaLocation":2119},{"text":1858,"config":2289},{"href":1860,"dataGaName":2290,"dataGaLocation":2119},"docs",{"text":1881,"config":2292},{"href":1883,"dataGaName":1884,"dataGaLocation":2119},{"text":2294,"config":2295},"What's new",{"href":1941,"dataGaName":1942,"dataGaLocation":2119},{"text":1876,"config":2297},{"href":1878,"dataGaName":1879,"dataGaLocation":2119},{"text":1895,"config":2299},{"href":1897,"dataGaName":1898,"dataGaLocation":2119},{"text":1903,"config":2301},{"href":1905,"dataGaName":1906,"dataGaLocation":2119},{"text":1908,"config":2303},{"href":1910,"dataGaName":1911,"dataGaLocation":2119},{"text":1913,"config":2305},{"href":1915,"dataGaName":1916,"dataGaLocation":2119},{"text":1918,"config":2307},{"href":1920,"dataGaName":1921,"dataGaLocation":2119},{"text":1923,"config":2309},{"href":1925,"dataGaName":1926,"dataGaLocation":2119},{"text":1928,"config":2311},{"href":1930,"dataGaName":1931,"dataGaLocation":2119},{"title":1944,"links":2313},[2314,2316,2318,2320,2322,2324,2328,2333,2335,2337,2339],{"text":1952,"config":2315},{"href":1954,"dataGaName":1946,"dataGaLocation":2119},{"text":1957,"config":2317},{"href":1959,"dataGaName":1960,"dataGaLocation":2119},{"text":1965,"config":2319},{"href":1967,"dataGaName":1968,"dataGaLocation":2119},{"text":1970,"config":2321},{"href":1972,"dataGaName":1973,"dataGaLocation":2119},{"text":1975,"config":2323},{"href":1977,"dataGaName":1978,"dataGaLocation":2119},{"text":2325,"config":2326},"Sustainability",{"href":2327,"dataGaName":2325,"dataGaLocation":2119},"/sustainability/",{"text":2329,"config":2330},"Diversity, inclusion and belonging (DIB)",{"href":2331,"dataGaName":2332,"dataGaLocation":2119},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1980,"config":2334},{"href":1982,"dataGaName":1983,"dataGaLocation":2119},{"text":1990,"config":2336},{"href":1992,"dataGaName":1993,"dataGaLocation":2119},{"text":1995,"config":2338},{"href":1997,"dataGaName":1998,"dataGaLocation":2119},{"text":2340,"config":2341},"Modern Slavery Transparency Statement",{"href":2342,"dataGaName":2343,"dataGaLocation":2119},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":2345},[2346,2349,2352],{"text":2347,"config":2348},"Terms",{"href":2171,"dataGaName":2172,"dataGaLocation":2119},{"text":2350,"config":2351},"Cookies",{"dataGaName":2181,"dataGaLocation":2119,"id":2182,"isOneTrustButton":263},{"text":2353,"config":2354},"Privacy",{"href":2176,"dataGaName":2177,"dataGaLocation":2119},[2356],{"id":2357,"title":7,"body":1657,"config":2358,"content":2360,"description":1657,"extension":2364,"meta":2365,"navigation":263,"path":2366,"seo":2367,"stem":2368,"__hash__":2369},"blogAuthors/en-us/blog/authors/regnard-raquedan.yml",{"template":2359},"BlogAuthor",{"name":7,"config":2361},{"headshot":2362,"ctfId":2363},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663118/Blog/Author%20Headshots/regnard_raquedan_headshot.png","rraquedan","yml",{},"/en-us/blog/authors/regnard-raquedan",{},"en-us/blog/authors/regnard-raquedan","1JCF9gTeSA0OaLWrorCsz7_b5_2A2kagAMVhH8r4NcM",[2371,2379,2387],{"title":2372,"description":2373,"heroImage":2374,"category":1653,"date":2375,"authors":2376,"slug":2378,"externalUrl":1657},"How I built a demo generator with GitLab Duo Agent Platform","Demos haven't always looked like this. Looking back over my career, here's how they have evolved. Follow the tutorial to build your own demo and agent.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-08-13",[2377],"Itzik Gan Baruch","agentic-click-through-demo",{"title":2380,"description":2381,"heroImage":2382,"category":1653,"date":2383,"authors":2384,"slug":2386,"externalUrl":1657},"How to govern agentic AI, MCPs, and AI code assistants","AI agents can write, push, and deploy without human review at each step. Learn a practical framework for controlling access, permissions, and audit trails.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1785337625/ifzlc2hyzaxhzmjgyymh.png","2026-07-31",[2385],"Julie Griffin","govern-agentic-ai-mcps-code-assistants",{"title":2388,"description":2389,"heroImage":2390,"category":1653,"date":2391,"authors":2392,"slug":2394,"externalUrl":1657},"Claude Opus 5 on GitLab: Reasoning built for the hard tasks","Anthropic’s Claude Opus 5 is now available on GitLab Duo Agent Platform, delivering deeper reasoning without sacrificing speed.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750099203/Blog/Hero%20Images/Blog/Hero%20Images/blog-image-template-1800x945%20%2820%29_2bJGC5ZP3WheoqzlLT05C5_1750099203484.png","2026-07-27",[2393],"Brittany Lutz","claude-opus-5-on-gitlab-duo-agent-platform",{"promotions":2396},[2397,2410,2422,2434],{"id":2398,"categories":2399,"header":2400,"text":2401,"button":2402,"image":2407},"ai-modernization",[1653],"Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":2403,"config":2404},"Get your AI maturity score",{"href":2405,"dataGaName":2406,"dataGaLocation":1884},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":2408},{"src":2409},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2411,"categories":2412,"header":2414,"text":2401,"button":2415,"image":2419},"devops-modernization",[2413,2221],"product","Are you just managing tools or shipping innovation?",{"text":2416,"config":2417},"Get your DevOps maturity score",{"href":2418,"dataGaName":2406,"dataGaLocation":1884},"/assessments/devops-modernization-assessment/",{"config":2420},{"src":2421},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2423,"categories":2424,"header":2426,"text":2401,"button":2427,"image":2431},"security-modernization",[2425],"security","Are you trading speed for security?",{"text":2428,"config":2429},"Get your security maturity score",{"href":2430,"dataGaName":2406,"dataGaLocation":1884},"/assessments/security-modernization-assessment/",{"config":2432},{"src":2433},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2435,"paths":2436,"header":2439,"text":2440,"button":2441,"image":2446},"github-azure-migration",[2437,2438],"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":2442,"config":2443},"See how GitLab compares to GitHub",{"href":2444,"dataGaName":2445,"dataGaLocation":1884},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2447},{"src":2421},{"header":2449,"blurb":2450,"button":2451,"secondaryButton":2456},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":2452,"config":2453},"Get your free trial",{"href":2454,"dataGaName":1683,"dataGaLocation":2455},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":2157,"config":2457},{"href":2009,"dataGaName":1688,"dataGaLocation":2455},1786803765083]