[{"data":1,"prerenderedAt":1768},["ShallowReactive",2],{"/blog/fast-and-secure-ai-agent-deployment-to-google-cloud-with-gitlab":3,"navigation-en-us":983,"banner-en-us":1411,"footer-en-us":1421,"blog-post-authors-en-us-Regnard Raquedan":1665,"blog-related-posts-en-us-fast-and-secure-ai-agent-deployment-to-google-cloud-with-gitlab":1680,"blog-promotions-en-us":1705,"next-steps-en-us":1758},{"id":4,"title":5,"authors":6,"body":8,"category":965,"date":966,"description":967,"extension":968,"externalUrl":969,"faq":969,"featured":970,"heroImage":971,"meta":972,"navigation":318,"path":973,"seo":974,"slug":975,"stem":976,"tags":977,"template":981,"updatedDate":969,"__hash__":982},"blogPosts/en-us/blog/fast-and-secure-ai-agent-deployment-to-google-cloud-with-gitlab.md","Fast and secure AI agent deployment to Google Cloud with GitLab",[7],"Regnard Raquedan",{"type":9,"value":10,"toc":958},"minimark",[11,39,44,47,50,54,57,60,87,90,97,101,104,126,132,141,144,182,185,190,193,224,230,233,236,254,257,457,462,465,472,818,821,847,855,860,863,880,883,897,901,904,930,934,937,954],[12,13,14,20,21,26,27,32,33,38],"p",{},[15,16,19],"a",{"href":17,"rel":18},"https://about.gitlab.com/topics/agentic-ai/",[],"Agentic AI"," is transforming how we build intelligent applications, but deploying AI agents securely and efficiently can be challenging. In this tutorial, you'll learn how to deploy an AI agent built with Google's Agent Development Kit (",[15,22,25],{"href":23,"rel":24},"https://cloud.google.com/vertex-ai/generative-ai/docs/agent-development-kit/quickstart",[],"ADK",") to Cloud Run using ",[15,28,31],{"href":29,"rel":30},"https://cloud.google.com/blog/topics/partners/understand-the-google-cloud-gitlab-integration",[],"GitLab's native integrations"," and ",[15,34,37],{"href":35,"rel":36},"https://docs.gitlab.com/ci/components/",[],"CI/CD components",".",[40,41,43],"h2",{"id":42},"what-are-ai-agents-and-why-do-they-matter","What are AI agents and why do they matter?",[12,45,46],{},"Agentic AI represents a significant evolution in artificial intelligence. Unlike traditional generative AI tools that require constant human direction, AI agents leverage advanced language models and natural language processing to take independent action. These systems can understand requests, make decisions, and execute multistep plans to achieve goals autonomously.",[12,48,49],{},"This tutorial uses Google's ADK, a flexible and modular framework for developing and deploying AI agents. While optimized for Gemini and the Google ecosystem, ADK is model-agnostic, deployment-agnostic, and built for compatibility with other frameworks.",[40,51,53],{"id":52},"our-demo-application-canada-city-advisor","Our demo application: Canada City Advisor",[12,55,56],{},"To demonstrate the deployment process, we'll work with a practical example: the Canada City Advisor. This AI agent helps users find their ideal Canadian city based on their preferences and constraints.",[12,58,59],{},"Here's how it works:",[61,62,63,67,84],"ul",{},[64,65,66],"li",{},"Users input their budget requirements and lifestyle preferences.",[64,68,69,70],{},"The root agent coordinates two sub-agents:",[61,71,72,75],{},[64,73,74],{},"A budget analyzer agent that evaluates financial constraints. This draws data obtained from the Canada Mortgage and Housing Corporation.",[64,76,77,78,83],{},"A lifestyle preferences agent that matches cities to user needs. This includes a weather service that uses ",[15,79,82],{"href":80,"rel":81},"https://open-meteo.com/",[],"Open-Meteo"," to get the proper city information.",[64,85,86],{},"The system generates personalized city recommendations",[12,88,89],{},"This multi-agent architecture showcases the power of agentic AI - different specialized agents working together to solve a complex problem. The sub-agents are only invoked when the root agent determines that budget and lifestyle analysis are needed.",[12,91,92],{},[93,94],"img",{"alt":95,"src":96},"Multi-agent architecture to develop demo application with agentic AI","https://res.cloudinary.com/about-gitlab-com/image/upload/v1751576568/obgxpxvlnxtzifddrrz1.png",[40,98,100],{"id":99},"prerequisites","Prerequisites",[12,102,103],{},"Before we begin, ensure you have:",[61,105,106,120,123],{},[64,107,108,109],{},"A Google Cloud project with the following APIs enabled:",[61,110,111,114,117],{},[64,112,113],{},"Cloud Run API",[64,115,116],{},"Artifact Registry API",[64,118,119],{},"Vertex AI API",[64,121,122],{},"A GitLab project for your source code",[64,124,125],{},"Appropriate permissions in both GitLab and Google Cloud",[12,127,128],{},[129,130,131],"strong",{},"Step 1: Set up IAM integration with Workload Identity Federation",[12,133,134,135,140],{},"The first step establishes secure, keyless authentication between GitLab and Google Cloud using ",[15,136,139],{"href":137,"rel":138},"https://cloud.google.com/iam/docs/workload-identity-federation",[],"Workload Identity Federation",". This eliminates the need for service account keys and improves security.",[12,142,143],{},"In your GitLab project:",[145,146,147,153],"ol",{},[64,148,149,150],{},"Navigate to ",[129,151,152],{},"Settings > Integrations > Google Cloud IAM.",[64,154,155,156],{},"Provide the following information:",[61,157,158,164,170,176],{},[64,159,160,163],{},[129,161,162],{},"Project ID",": Your Google Cloud project ID",[64,165,166,169],{},[129,167,168],{},"Project Number",": Found in your Google Cloud console",[64,171,172,175],{},[129,173,174],{},"Pool ID",": A unique identifier for your workload identity pool",[64,177,178,181],{},[129,179,180],{},"Provider ID",": A unique identifier for your identity provider",[12,183,184],{},"GitLab will generate a script for you. Copy this script and run it in your Google Cloud Shell to create the Workload Identity Federation.",[12,186,187],{},[129,188,189],{},"Step 2: Configure Google Artifact Registry integration",[12,191,192],{},"Next, we'll set up the connection to Google Artifact Registry where our container images will be stored.",[145,194,195,201],{},[64,196,197,198],{},"In GitLab, go to ",[129,199,200],{},"Settings > Integrations > Google Artifact Registry.",[64,202,203,204],{},"Enter:",[61,205,206,212,218],{},[64,207,208,211],{},[129,209,210],{},"Google Cloud Project ID",": Same as in Step 1",[64,213,214,217],{},[129,215,216],{},"Repository Name",": Name of an existing Artifact Registry repository",[64,219,220,223],{},[129,221,222],{},"Location",": The region where your repository is located",[12,225,226,229],{},[129,227,228],{},"Important",": The repository must already exist in Artifact Registry. GitLab won't create a new one for you in this context.",[12,231,232],{},"GitLab will generate commands to set up the necessary permissions. Run these in Google Cloud Shell.",[12,234,235],{},"Additionally, add these roles to your service principal for Cloud Run deployment:",[61,237,238,244,249],{},[64,239,240],{},[241,242,243],"code",{},"roles/run.admin",[64,245,246],{},[241,247,248],{},"roles/iam.serviceAccountUser",[64,250,251],{},[241,252,253],{},"roles/cloudbuild.builds.editor",[12,255,256],{},"You can add these roles using the following gcloud commands:",[258,259,264],"pre",{"className":260,"code":261,"language":262,"meta":263,"style":263},"language-shell shiki shiki-themes github-light","GCP_PROJECT_ID=\"\u003Cyour-project-id>\" #replace\nGCP_PROJECT_NUMBER=\"\u003Cyour-project-number>\" #replace\nGCP_WORKLOAD_IDENTITY_POOL=\"\u003Cyour-pool-id>\" #replace\n\ngcloud projects add-iam-policy-binding ${GCP_PROJECT_ID} \\\n  --member=\"principalSet://iam.googleapis.com/projects/${GCP_PROJECT_NUMBER}/locations/global/workloadIdentityPools/${GCP_WORKLOAD_IDENTITY_POOL}/attribute.developer_access/true\" \\\n  --role='roles/run.admin'\n\ngcloud projects add-iam-policy-binding ${GCP_PROJECT_ID} \\\n  --member=\"principalSet://iam.googleapis.com/projects/${GCP_PROJECT_NUMBER}/locations/global/workloadIdentityPools/${GCP_WORKLOAD_IDENTITY_POOL}/attribute.developer_access/true\" \\\n  --role='roles/iam.serviceAccountUser'\n\ngcloud projects add-iam-policy-binding ${GCP_PROJECT_ID} \\\n  --member=\"principalSet://iam.googleapis.com/projects/${GCP_PROJECT_NUMBER}/locations/global/workloadIdentityPools/${GCP_WORKLOAD_IDENTITY_POOL}/attribute.developer_access/true\" \\\n  --role='roles/cloudbuild.builds.editor'\n\n","shell","",[241,265,266,287,300,313,320,340,362,371,376,389,406,414,419,432,449],{"__ignoreMap":263},[267,268,271,275,279,283],"span",{"class":269,"line":270},"line",1,[267,272,274],{"class":273},"sgsFI","GCP_PROJECT_ID",[267,276,278],{"class":277},"sD7c4","=",[267,280,282],{"class":281},"sYBdl","\"\u003Cyour-project-id>\"",[267,284,286],{"class":285},"sAwPA"," #replace\n",[267,288,290,293,295,298],{"class":269,"line":289},2,[267,291,292],{"class":273},"GCP_PROJECT_NUMBER",[267,294,278],{"class":277},[267,296,297],{"class":281},"\"\u003Cyour-project-number>\"",[267,299,286],{"class":285},[267,301,303,306,308,311],{"class":269,"line":302},3,[267,304,305],{"class":273},"GCP_WORKLOAD_IDENTITY_POOL",[267,307,278],{"class":277},[267,309,310],{"class":281},"\"\u003Cyour-pool-id>\"",[267,312,286],{"class":285},[267,314,316],{"class":269,"line":315},4,[267,317,319],{"emptyLinePlaceholder":318},true,"\n",[267,321,323,327,330,333,336],{"class":269,"line":322},5,[267,324,326],{"class":325},"s7eDp","gcloud",[267,328,329],{"class":281}," projects",[267,331,332],{"class":281}," add-iam-policy-binding",[267,334,335],{"class":273}," ${GCP_PROJECT_ID} ",[267,337,339],{"class":338},"sYu0t","\\\n",[267,341,343,346,349,351,354,356,359],{"class":269,"line":342},6,[267,344,345],{"class":338},"  --member=",[267,347,348],{"class":281},"\"principalSet://iam.googleapis.com/projects/${",[267,350,292],{"class":273},[267,352,353],{"class":281},"}/locations/global/workloadIdentityPools/${",[267,355,305],{"class":273},[267,357,358],{"class":281},"}/attribute.developer_access/true\"",[267,360,361],{"class":338}," \\\n",[267,363,365,368],{"class":269,"line":364},7,[267,366,367],{"class":338},"  --role=",[267,369,370],{"class":281},"'roles/run.admin'\n",[267,372,374],{"class":269,"line":373},8,[267,375,319],{"emptyLinePlaceholder":318},[267,377,379,381,383,385,387],{"class":269,"line":378},9,[267,380,326],{"class":325},[267,382,329],{"class":281},[267,384,332],{"class":281},[267,386,335],{"class":273},[267,388,339],{"class":338},[267,390,392,394,396,398,400,402,404],{"class":269,"line":391},10,[267,393,345],{"class":338},[267,395,348],{"class":281},[267,397,292],{"class":273},[267,399,353],{"class":281},[267,401,305],{"class":273},[267,403,358],{"class":281},[267,405,361],{"class":338},[267,407,409,411],{"class":269,"line":408},11,[267,410,367],{"class":338},[267,412,413],{"class":281},"'roles/iam.serviceAccountUser'\n",[267,415,417],{"class":269,"line":416},12,[267,418,319],{"emptyLinePlaceholder":318},[267,420,422,424,426,428,430],{"class":269,"line":421},13,[267,423,326],{"class":325},[267,425,329],{"class":281},[267,427,332],{"class":281},[267,429,335],{"class":273},[267,431,339],{"class":338},[267,433,435,437,439,441,443,445,447],{"class":269,"line":434},14,[267,436,345],{"class":338},[267,438,348],{"class":281},[267,440,292],{"class":273},[267,442,353],{"class":281},[267,444,305],{"class":273},[267,446,358],{"class":281},[267,448,361],{"class":338},[267,450,452,454],{"class":269,"line":451},15,[267,453,367],{"class":338},[267,455,456],{"class":281},"'roles/cloudbuild.builds.editor'\n",[12,458,459],{},[129,460,461],{},"Step 3: Create the CI/CD pipeline",[12,463,464],{},"Now for the exciting part – let's build our deployment pipeline! GitLab's CI/CD components make this remarkably simple.",[12,466,467,468,471],{},"Create a ",[241,469,470],{},".gitlab-ci.yml"," file in your project root:",[258,473,477],{"className":474,"code":475,"language":476,"meta":263,"style":263},"language-yaml shiki shiki-themes github-light","stages:\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\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  # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Jobs/Dependency-Scanning.gitlab-ci.yml\n  - template: Jobs/SAST.gitlab-ci.yml  # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml\n  - template: Jobs/Secret-Detection.gitlab-ci.yml  # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/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  - component: gitlab.com/google-gitlab-components/cloud-run/deploy-cloud-run@main\n    inputs:\n      stage: deploy\n      project_id: \"\u003Cyour-project-id>\" #replace\n      service: \"canadian-city\"\n      region: \"us-central1\"\n      image: $AR_IMAGE\n\n","yaml",[241,478,479,488,496,503,510,517,521,528,539,549,553,560,570,579,586,594,602,610,618,626,634,639,647,663,678,693,706,714,724,735,746,758,765,774,786,797,808],{"__ignoreMap":263},[267,480,481,485],{"class":269,"line":270},[267,482,484],{"class":483},"shJU0","stages",[267,486,487],{"class":273},":\n",[267,489,490,493],{"class":269,"line":289},[267,491,492],{"class":273},"  - ",[267,494,495],{"class":281},"build\n",[267,497,498,500],{"class":269,"line":302},[267,499,492],{"class":273},[267,501,502],{"class":281},"test\n",[267,504,505,507],{"class":269,"line":315},[267,506,492],{"class":273},[267,508,509],{"class":281},"upload\n",[267,511,512,514],{"class":269,"line":322},[267,513,492],{"class":273},[267,515,516],{"class":281},"deploy\n",[267,518,519],{"class":269,"line":342},[267,520,319],{"emptyLinePlaceholder":318},[267,522,523,526],{"class":269,"line":364},[267,524,525],{"class":483},"variables",[267,527,487],{"class":273},[267,529,530,533,536],{"class":269,"line":373},[267,531,532],{"class":483},"  GITLAB_IMAGE",[267,534,535],{"class":273},": ",[267,537,538],{"class":281},"$CI_REGISTRY_IMAGE/main:$CI_COMMIT_SHORT_SHA\n",[267,540,541,544,546],{"class":269,"line":378},[267,542,543],{"class":483},"  AR_IMAGE",[267,545,535],{"class":273},[267,547,548],{"class":281},"$GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_LOCATION-docker.pkg.dev/$GOOGLE_ARTIFACT_REGISTRY_PROJECT_ID/$GOOGLE_ARTIFACT_REGISTRY_REPOSITORY_NAME/main:$CI_COMMIT_SHORT_SHA\n",[267,550,551],{"class":269,"line":391},[267,552,319],{"emptyLinePlaceholder":318},[267,554,555,558],{"class":269,"line":408},[267,556,557],{"class":483},"build",[267,559,487],{"class":273},[267,561,562,565,567],{"class":269,"line":416},[267,563,564],{"class":483},"  image",[267,566,535],{"class":273},[267,568,569],{"class":281},"docker:24.0.5\n",[267,571,572,575,577],{"class":269,"line":421},[267,573,574],{"class":483},"  stage",[267,576,535],{"class":273},[267,578,495],{"class":281},[267,580,581,584],{"class":269,"line":434},[267,582,583],{"class":483},"  services",[267,585,487],{"class":273},[267,587,588,591],{"class":269,"line":451},[267,589,590],{"class":273},"    - ",[267,592,593],{"class":281},"docker:24.0.5-dind\n",[267,595,597,600],{"class":269,"line":596},16,[267,598,599],{"class":483},"  before_script",[267,601,487],{"class":273},[267,603,605,607],{"class":269,"line":604},17,[267,606,590],{"class":273},[267,608,609],{"class":281},"docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n",[267,611,613,616],{"class":269,"line":612},18,[267,614,615],{"class":483},"  script",[267,617,487],{"class":273},[267,619,621,623],{"class":269,"line":620},19,[267,622,590],{"class":273},[267,624,625],{"class":281},"docker build -t $GITLAB_IMAGE .\n",[267,627,629,631],{"class":269,"line":628},20,[267,630,590],{"class":273},[267,632,633],{"class":281},"docker push $GITLAB_IMAGE\n",[267,635,637],{"class":269,"line":636},21,[267,638,319],{"emptyLinePlaceholder":318},[267,640,642,645],{"class":269,"line":641},22,[267,643,644],{"class":483},"include",[267,646,487],{"class":273},[267,648,650,652,655,657,660],{"class":269,"line":649},23,[267,651,492],{"class":273},[267,653,654],{"class":483},"template",[267,656,535],{"class":273},[267,658,659],{"class":281},"Jobs/Dependency-Scanning.gitlab-ci.yml",[267,661,662],{"class":285},"  # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Jobs/Dependency-Scanning.gitlab-ci.yml\n",[267,664,666,668,670,672,675],{"class":269,"line":665},24,[267,667,492],{"class":273},[267,669,654],{"class":483},[267,671,535],{"class":273},[267,673,674],{"class":281},"Jobs/SAST.gitlab-ci.yml",[267,676,677],{"class":285},"  # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Jobs/SAST.gitlab-ci.yml\n",[267,679,681,683,685,687,690],{"class":269,"line":680},25,[267,682,492],{"class":273},[267,684,654],{"class":483},[267,686,535],{"class":273},[267,688,689],{"class":281},"Jobs/Secret-Detection.gitlab-ci.yml",[267,691,692],{"class":285},"  # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Jobs/Secret-Detection.gitlab-ci.yml\n",[267,694,696,698,701,703],{"class":269,"line":695},26,[267,697,492],{"class":273},[267,699,700],{"class":483},"component",[267,702,535],{"class":273},[267,704,705],{"class":281},"gitlab.com/google-gitlab-components/artifact-registry/upload-artifact-registry@main\n",[267,707,709,712],{"class":269,"line":708},27,[267,710,711],{"class":483},"    inputs",[267,713,487],{"class":273},[267,715,717,720,722],{"class":269,"line":716},28,[267,718,719],{"class":483},"      stage",[267,721,535],{"class":273},[267,723,509],{"class":281},[267,725,727,730,732],{"class":269,"line":726},29,[267,728,729],{"class":483},"      source",[267,731,535],{"class":273},[267,733,734],{"class":281},"$GITLAB_IMAGE\n",[267,736,738,741,743],{"class":269,"line":737},30,[267,739,740],{"class":483},"      target",[267,742,535],{"class":273},[267,744,745],{"class":281},"$AR_IMAGE\n",[267,747,749,751,753,755],{"class":269,"line":748},31,[267,750,492],{"class":273},[267,752,700],{"class":483},[267,754,535],{"class":273},[267,756,757],{"class":281},"gitlab.com/google-gitlab-components/cloud-run/deploy-cloud-run@main\n",[267,759,761,763],{"class":269,"line":760},32,[267,762,711],{"class":483},[267,764,487],{"class":273},[267,766,768,770,772],{"class":269,"line":767},33,[267,769,719],{"class":483},[267,771,535],{"class":273},[267,773,516],{"class":281},[267,775,777,780,782,784],{"class":269,"line":776},34,[267,778,779],{"class":483},"      project_id",[267,781,535],{"class":273},[267,783,282],{"class":281},[267,785,286],{"class":285},[267,787,789,792,794],{"class":269,"line":788},35,[267,790,791],{"class":483},"      service",[267,793,535],{"class":273},[267,795,796],{"class":281},"\"canadian-city\"\n",[267,798,800,803,805],{"class":269,"line":799},36,[267,801,802],{"class":483},"      region",[267,804,535],{"class":273},[267,806,807],{"class":281},"\"us-central1\"\n",[267,809,811,814,816],{"class":269,"line":810},37,[267,812,813],{"class":483},"      image",[267,815,535],{"class":273},[267,817,745],{"class":281},[12,819,820],{},"The pipeline consists of four stages:",[145,822,823,829,835,841],{},[64,824,825,828],{},[129,826,827],{},"Build",": Creates the Docker container with your AI agent",[64,830,831,834],{},[129,832,833],{},"Test",": Runs security scans (container scanning, dependency scanning, SAST)",[64,836,837,840],{},[129,838,839],{},"Upload",": Pushes the container to Artifact Registry",[64,842,843,846],{},[129,844,845],{},"Deploy",": Deploys to Cloud Run",[12,848,849,850,854],{},"The great thing about using ",[15,851,853],{"href":35,"rel":852},[],"GitLab's CI/CD components"," is that you only need to provide a few parameters - the components handle all the complex authentication and deployment logic.",[12,856,857],{},[129,858,859],{},"Step 4: Deploy and test",[12,861,862],{},"With everything configured, it's time to deploy:",[145,864,865,871,874,877],{},[64,866,867,868,870],{},"Commit your code and ",[241,869,470],{}," to your GitLab repository.",[64,872,873],{},"The pipeline will automatically trigger.",[64,875,876],{},"Monitor the pipeline progress in GitLab's CI/CD interface.",[64,878,879],{},"Once complete, find your Cloud Run URL in the Google Cloud Console.",[12,881,882],{},"You'll see each stage execute:",[61,884,885,888,891,894],{},[64,886,887],{},"Build stage creates your container.",[64,889,890],{},"Test stage runs comprehensive security scans.",[64,892,893],{},"Upload stage pushes to Artifact Registry.",[64,895,896],{},"Deploy stage creates or updates your Cloud Run service.",[40,898,900],{"id":899},"security-benefits","Security benefits",[12,902,903],{},"This approach provides several security advantages:",[61,905,906,912,918,924],{},[64,907,908,911],{},[129,909,910],{},"No long-lived credentials:"," Workload Identity Federation eliminates service account keys.",[64,913,914,917],{},[129,915,916],{},"Automated security scanning:"," Every deployment is scanned for vulnerabilities.",[64,919,920,923],{},[129,921,922],{},"Audit trail:"," Complete visibility of who deployed what and when.",[64,925,926,929],{},[129,927,928],{},"Principle of least privilege:"," Fine-grained IAM roles limit access.",[40,931,933],{"id":932},"summary","Summary",[12,935,936],{},"By combining GitLab's security features with Google Cloud's powerful AI and serverless platforms, you can deploy AI agents that are both secure and scalable. The integration between GitLab and Google Cloud eliminates much of the complexity traditionally associated with such deployments.",[938,939,940],"blockquote",{},[12,941,942,943,948,949,38],{},"Use this tutorial's ",[15,944,947],{"href":945,"rel":946},"https://gitlab.com/gitlab-partners-public/google-cloud/demos/ai-agent-deployment",[],"complete code example"," to get started now. Not a GitLab customer yet? Explore the DevSecOps platform with ",[15,950,953],{"href":951,"rel":952},"https://about.gitlab.com/free-trial/",[],"a free trial",[955,956,957],"style",{},"html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}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}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}",{"title":263,"searchDepth":289,"depth":289,"links":959},[960,961,962,963,964],{"id":42,"depth":289,"text":43},{"id":52,"depth":289,"text":53},{"id":99,"depth":289,"text":100},{"id":899,"depth":289,"text":900},{"id":932,"depth":289,"text":933},"ai","2025-07-07","Follow this step-by-step guide, complete with a demo application, to learn how to use agentic AI, along with GitLab's native integrations and CI/CD components.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749670563/Blog/Hero%20Images/cloudcomputing.jpg",{},"/en-us/blog/fast-and-secure-ai-agent-deployment-to-google-cloud-with-gitlab",{"noIndex":970,"title":5,"description":967},"fast-and-secure-ai-agent-deployment-to-google-cloud-with-gitlab","en-us/blog/fast-and-secure-ai-agent-deployment-to-google-cloud-with-gitlab",[978,979,980],"AI","google","tutorial","BlogPost","1ET029qwrOXvl0QK9LFcaLsmnG3sCpCtH1yhJ48mqAw",{"logo":984,"freeTrial":989,"sales":994,"login":999,"items":1004,"search":1331,"minimal":1362,"duo":1381,"switchNav":1390,"pricingDeployment":1401},{"config":985},{"href":986,"dataGaName":987,"dataGaLocation":988},"/","gitlab logo","header",{"text":990,"config":991},"Get free trial",{"href":992,"dataGaName":993,"dataGaLocation":988},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":995,"config":996},"Request a demo",{"href":997,"dataGaName":998,"dataGaLocation":988},"/sales/?contact-topic=request-demo","sales",{"text":1000,"config":1001},"Sign in",{"href":1002,"dataGaName":1003,"dataGaLocation":988},"https://gitlab.com/users/sign_in/","sign in",[1005,1034,1134,1139,1253,1309],{"text":1006,"config":1007,"menu":1009},"Platform",{"dataNavLevelOne":1008},"platform",{"type":1010,"columns":1011},"cards",[1012,1018,1026],{"title":1006,"description":1013,"link":1014},"The intelligent orchestration platform for DevSecOps",{"text":1015,"config":1016},"Explore our Platform",{"href":1017,"dataGaName":1008,"dataGaLocation":988},"/platform/",{"title":1019,"description":1020,"link":1021},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":1022,"config":1023},"Meet GitLab Duo",{"href":1024,"dataGaName":1025,"dataGaLocation":988},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1027,"description":1028,"link":1029},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":1030,"config":1031},"Learn more",{"href":1032,"dataGaName":1033,"dataGaLocation":988},"/why-gitlab/","why gitlab",{"text":1035,"left":318,"config":1036,"menu":1038},"Product",{"dataNavLevelOne":1037},"solutions",{"type":1039,"link":1040,"columns":1044,"feature":1113},"lists",{"text":1041,"config":1042},"View all Solutions",{"href":1043,"dataGaName":1037,"dataGaLocation":988},"/solutions/",[1045,1069,1092],{"title":1046,"description":1047,"link":1048,"items":1053},"Automation","CI/CD and automation to accelerate deployment",{"config":1049},{"icon":1050,"href":1051,"dataGaName":1052,"dataGaLocation":988},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[1054,1058,1061,1065],{"text":1055,"config":1056},"CI/CD",{"href":1057,"dataGaLocation":988,"dataGaName":1055},"/solutions/continuous-integration/",{"text":1019,"config":1059},{"href":1024,"dataGaLocation":988,"dataGaName":1060},"gitlab duo agent platform - product menu",{"text":1062,"config":1063},"Source Code Management",{"href":1064,"dataGaLocation":988,"dataGaName":1062},"/solutions/source-code-management/",{"text":1066,"config":1067},"Automated Software Delivery",{"href":1051,"dataGaLocation":988,"dataGaName":1068},"Automated software delivery",{"title":1070,"description":1071,"link":1072,"items":1077},"Security","Deliver code faster without compromising security",{"config":1073},{"href":1074,"dataGaName":1075,"dataGaLocation":988,"icon":1076},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1078,1082,1087],{"text":1079,"config":1080},"Application Security Testing",{"href":1074,"dataGaName":1081,"dataGaLocation":988},"Application security testing",{"text":1083,"config":1084},"Software Supply Chain Security",{"href":1085,"dataGaLocation":988,"dataGaName":1086},"/solutions/supply-chain/","Software supply chain security",{"text":1088,"config":1089},"Software Compliance",{"href":1090,"dataGaName":1091,"dataGaLocation":988},"/solutions/software-compliance/","software compliance",{"title":1093,"link":1094,"items":1099},"Measurement",{"config":1095},{"icon":1096,"href":1097,"dataGaName":1098,"dataGaLocation":988},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[1100,1104,1108],{"text":1101,"config":1102},"Visibility & Measurement",{"href":1097,"dataGaLocation":988,"dataGaName":1103},"Visibility and Measurement",{"text":1105,"config":1106},"Value Stream Management",{"href":1107,"dataGaLocation":988,"dataGaName":1105},"/solutions/value-stream-management/",{"text":1109,"config":1110},"Analytics & Insights",{"href":1111,"dataGaLocation":988,"dataGaName":1112},"/solutions/analytics-and-insights/","Analytics and insights",{"title":1114,"type":1039,"items":1115},"GitLab for",[1116,1122,1128],{"text":1117,"config":1118},"Enterprise",{"icon":1119,"href":1120,"dataGaLocation":988,"dataGaName":1121},"Building","/enterprise/","enterprise",{"text":1123,"config":1124},"Small Business",{"icon":1125,"href":1126,"dataGaLocation":988,"dataGaName":1127},"Work","/small-business/","small business",{"text":1129,"config":1130},"Public Sector",{"icon":1131,"href":1132,"dataGaLocation":988,"dataGaName":1133},"Organization","/solutions/public-sector/","public sector",{"text":1135,"config":1136},"Pricing",{"href":1137,"dataGaName":1138,"dataGaLocation":988,"dataNavLevelOne":1138},"/pricing/","pricing",{"text":1140,"config":1141,"menu":1143},"Resources",{"dataNavLevelOne":1142},"resources",{"type":1039,"link":1144,"columns":1148,"feature":1242},{"text":1145,"config":1146},"View all resources",{"href":1147,"dataGaName":1142,"dataGaLocation":988},"/resources/",[1149,1182,1209],{"title":1150,"items":1151},"Getting started",[1152,1157,1162,1167,1172,1177],{"text":1153,"config":1154},"Install",{"href":1155,"dataGaName":1156,"dataGaLocation":988},"/install/","install",{"text":1158,"config":1159},"Quick start guides",{"href":1160,"dataGaName":1161,"dataGaLocation":988},"/get-started/","quick setup checklists",{"text":1163,"config":1164},"Learn",{"href":1165,"dataGaLocation":988,"dataGaName":1166},"https://university.gitlab.com/","learn",{"text":1168,"config":1169},"Product documentation",{"href":1170,"dataGaName":1171,"dataGaLocation":988},"https://docs.gitlab.com/","product documentation",{"text":1173,"config":1174},"Best practice videos",{"href":1175,"dataGaName":1176,"dataGaLocation":988},"/getting-started-videos/","best practice videos",{"text":1178,"config":1179},"Integrations",{"href":1180,"dataGaName":1181,"dataGaLocation":988},"/integrations/","integrations",{"title":1183,"items":1184},"Discover",[1185,1190,1195,1200,1204],{"text":1186,"config":1187},"Customer success stories",{"href":1188,"dataGaName":1189,"dataGaLocation":988},"/customers/","customer success stories",{"text":1191,"config":1192},"Blog",{"href":1193,"dataGaName":1194,"dataGaLocation":988},"/blog/","blog",{"text":1196,"config":1197},"Demo Hub",{"href":1198,"dataGaName":1199,"dataGaLocation":988},"/demo-hub/","demo hub",{"text":1201,"config":1202},"The Source",{"href":1203,"dataGaName":1194,"dataGaLocation":988},"/the-source/",{"text":1205,"config":1206},"Remote",{"href":1207,"dataGaName":1208,"dataGaLocation":988},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1210,"items":1211},"Connect",[1212,1217,1222,1227,1232,1237],{"text":1213,"config":1214},"GitLab Services",{"href":1215,"dataGaName":1216,"dataGaLocation":988},"/services/","services",{"text":1218,"config":1219},"Contribute",{"href":1220,"dataGaName":1221,"dataGaLocation":988},"https://contributors.gitlab.com","contribute",{"text":1223,"config":1224},"Community",{"href":1225,"dataGaName":1226,"dataGaLocation":988},"/community/","community",{"text":1228,"config":1229},"Forum",{"href":1230,"dataGaName":1231,"dataGaLocation":988},"https://forum.gitlab.com/","forum",{"text":1233,"config":1234},"Events",{"href":1235,"dataGaName":1236,"dataGaLocation":988},"/events/","events",{"text":1238,"config":1239},"Partners",{"href":1240,"dataGaName":1241,"dataGaLocation":988},"/partners/","partners",{"config":1243,"title":1246,"text":1247,"link":1248},{"background":1244,"textColor":1245},"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":1249,"config":1250},"Read the latest",{"href":1251,"dataGaName":1252,"dataGaLocation":988},"/whats-new/","whats new",{"text":1254,"config":1255,"menu":1257},"Company",{"dataNavLevelOne":1256},"company",{"type":1039,"columns":1258},[1259],{"items":1260},[1261,1266,1272,1274,1279,1284,1289,1294,1299,1304],{"text":1262,"config":1263},"About",{"href":1264,"dataGaName":1265,"dataGaLocation":988},"/company/","about",{"text":1267,"config":1268,"footerGa":1271},"Jobs",{"href":1269,"dataGaName":1270,"dataGaLocation":988},"/jobs/","jobs",{"dataGaName":1270},{"text":1233,"config":1273},{"href":1235,"dataGaName":1236,"dataGaLocation":988},{"text":1275,"config":1276},"Leadership",{"href":1277,"dataGaName":1278,"dataGaLocation":988},"/company/team/e-group/","leadership",{"text":1280,"config":1281},"Handbook",{"href":1282,"dataGaName":1283,"dataGaLocation":988},"https://handbook.gitlab.com/","handbook",{"text":1285,"config":1286},"Investor relations",{"href":1287,"dataGaName":1288,"dataGaLocation":988},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1290,"config":1291},"Trust Center",{"href":1292,"dataGaName":1293,"dataGaLocation":988},"/security/","trust center",{"text":1295,"config":1296},"AI Transparency Center",{"href":1297,"dataGaName":1298,"dataGaLocation":988},"/ai-transparency-center/","ai transparency center",{"text":1300,"config":1301},"Newsletter",{"href":1302,"dataGaName":1303,"dataGaLocation":988},"/company/contact/#contact-forms","newsletter",{"text":1305,"config":1306},"Press",{"href":1307,"dataGaName":1308,"dataGaLocation":988},"/press/","press",{"text":1310,"config":1311,"menu":1312},"Contact us",{"dataNavLevelOne":1256},{"type":1039,"columns":1313},[1314],{"items":1315},[1316,1321,1326],{"text":1317,"config":1318},"Talk to sales",{"href":1319,"dataGaName":1320,"dataGaLocation":988},"/sales/","talk to sales",{"text":1322,"config":1323},"Support portal",{"href":1324,"dataGaName":1325,"dataGaLocation":988},"https://support.gitlab.com/hc/en-us","support portal",{"text":1327,"config":1328},"Customer portal",{"href":1329,"dataGaName":1330,"dataGaLocation":988},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1332,"login":1333,"suggestions":1340},"Close",{"text":1334,"link":1335},"To search repositories and projects, login to",{"text":1336,"config":1337},"gitlab.com",{"href":1002,"dataGaName":1338,"dataGaLocation":1339},"search login","search",{"text":1341,"default":1342},"Suggestions",[1343,1345,1349,1351,1355,1359],{"text":1019,"config":1344},{"href":1024,"dataGaName":1019,"dataGaLocation":1339},{"text":1346,"config":1347},"Code Suggestions (AI)",{"href":1348,"dataGaName":1346,"dataGaLocation":1339},"/solutions/code-suggestions/",{"text":1055,"config":1350},{"href":1057,"dataGaName":1055,"dataGaLocation":1339},{"text":1352,"config":1353},"GitLab on AWS",{"href":1354,"dataGaName":1352,"dataGaLocation":1339},"/partners/technology-partners/aws/",{"text":1356,"config":1357},"GitLab on Google Cloud",{"href":1358,"dataGaName":1356,"dataGaLocation":1339},"/partners/technology-partners/google-cloud-platform/",{"text":1360,"config":1361},"Why GitLab?",{"href":1032,"dataGaName":1360,"dataGaLocation":1339},{"freeTrial":1363,"mobileIcon":1368,"desktopIcon":1373,"secondaryButton":1376},{"text":1364,"config":1365},"Start free trial",{"href":1366,"dataGaName":993,"dataGaLocation":1367},"https://gitlab.com/-/trials/new/","nav",{"altText":1369,"config":1370},"Gitlab Icon",{"src":1371,"dataGaName":1372,"dataGaLocation":1367},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1369,"config":1374},{"src":1375,"dataGaName":1372,"dataGaLocation":1367},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1377,"config":1378},"Get Started",{"href":1379,"dataGaName":1380,"dataGaLocation":1367},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1382,"mobileIcon":1386,"desktopIcon":1388},{"text":1383,"config":1384},"Learn more about GitLab Duo",{"href":1024,"dataGaName":1385,"dataGaLocation":1367},"gitlab duo",{"altText":1369,"config":1387},{"src":1371,"dataGaName":1372,"dataGaLocation":1367},{"altText":1369,"config":1389},{"src":1375,"dataGaName":1372,"dataGaLocation":1367},{"button":1391,"mobileIcon":1396,"desktopIcon":1398},{"text":1392,"config":1393},"/switch",{"href":1394,"dataGaName":1395,"dataGaLocation":1367},"#contact","switch",{"altText":1369,"config":1397},{"src":1371,"dataGaName":1372,"dataGaLocation":1367},{"altText":1369,"config":1399},{"src":1400,"dataGaName":1372,"dataGaLocation":1367},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1402,"mobileIcon":1407,"desktopIcon":1409},{"text":1403,"config":1404},"Back to pricing",{"href":1137,"dataGaName":1405,"dataGaLocation":1367,"icon":1406},"back to pricing","GoBack",{"altText":1369,"config":1408},{"src":1371,"dataGaName":1372,"dataGaLocation":1367},{"altText":1369,"config":1410},{"src":1375,"dataGaName":1372,"dataGaLocation":1367},{"title":1412,"titleMobile":1413,"button":1414,"config":1419},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":1030,"config":1415},{"href":1416,"dataGaName":1417,"dataGaLocation":1418},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1420,"disabled":970},"release",{"data":1422},{"text":1423,"source":1424,"edit":1430,"contribute":1435,"config":1440,"items":1445,"minimal":1654},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1425,"config":1426},"View page source",{"href":1427,"dataGaName":1428,"dataGaLocation":1429},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1431,"config":1432},"Edit this page",{"href":1433,"dataGaName":1434,"dataGaLocation":1429},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1436,"config":1437},"Please contribute",{"href":1438,"dataGaName":1439,"dataGaLocation":1429},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1441,"facebook":1442,"youtube":1443,"linkedin":1444},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1446,1493,1546,1590,1622],{"title":1135,"links":1447,"subMenu":1462},[1448,1452,1457],{"text":1449,"config":1450},"View plans",{"href":1137,"dataGaName":1451,"dataGaLocation":1429},"view plans",{"text":1453,"config":1454},"Why Premium?",{"href":1455,"dataGaName":1456,"dataGaLocation":1429},"/pricing/premium/","why premium",{"text":1458,"config":1459},"Why Ultimate?",{"href":1460,"dataGaName":1461,"dataGaLocation":1429},"/pricing/ultimate/","why ultimate",[1463],{"title":1464,"links":1465},"Contact Us",[1466,1469,1471,1473,1478,1483,1488],{"text":1467,"config":1468},"Contact sales",{"href":1319,"dataGaName":998,"dataGaLocation":1429},{"text":1322,"config":1470},{"href":1324,"dataGaName":1325,"dataGaLocation":1429},{"text":1327,"config":1472},{"href":1329,"dataGaName":1330,"dataGaLocation":1429},{"text":1474,"config":1475},"Status",{"href":1476,"dataGaName":1477,"dataGaLocation":1429},"https://status.gitlab.com/","status",{"text":1479,"config":1480},"Terms of use",{"href":1481,"dataGaName":1482,"dataGaLocation":1429},"/terms/","terms of use",{"text":1484,"config":1485},"Privacy statement",{"href":1486,"dataGaName":1487,"dataGaLocation":1429},"/privacy/","privacy statement",{"text":1489,"config":1490},"Cookie preferences",{"dataGaName":1491,"dataGaLocation":1429,"id":1492,"isOneTrustButton":318},"cookie preferences","ot-sdk-btn",{"title":1035,"links":1494,"subMenu":1503},[1495,1499],{"text":1496,"config":1497},"DevSecOps platform",{"href":1017,"dataGaName":1498,"dataGaLocation":1429},"devsecops platform",{"text":1500,"config":1501},"AI-Assisted Development",{"href":1024,"dataGaName":1502,"dataGaLocation":1429},"ai-assisted development",[1504],{"title":1505,"links":1506},"Topics",[1507,1512,1517,1522,1527,1532,1537,1542],{"text":1508,"config":1509},"CICD",{"href":1510,"dataGaName":1511,"dataGaLocation":1429},"/topics/ci-cd/","cicd",{"text":1513,"config":1514},"GitOps",{"href":1515,"dataGaName":1516,"dataGaLocation":1429},"/topics/gitops/","gitops",{"text":1518,"config":1519},"DevOps",{"href":1520,"dataGaName":1521,"dataGaLocation":1429},"/topics/devops/","devops",{"text":1523,"config":1524},"Version Control",{"href":1525,"dataGaName":1526,"dataGaLocation":1429},"/topics/version-control/","version control",{"text":1528,"config":1529},"DevSecOps",{"href":1530,"dataGaName":1531,"dataGaLocation":1429},"/topics/devsecops/","devsecops",{"text":1533,"config":1534},"Cloud Native",{"href":1535,"dataGaName":1536,"dataGaLocation":1429},"/topics/cloud-native/","cloud native",{"text":1538,"config":1539},"AI for Coding",{"href":1540,"dataGaName":1541,"dataGaLocation":1429},"/topics/devops/ai-for-coding/","ai for coding",{"text":19,"config":1543},{"href":1544,"dataGaName":1545,"dataGaLocation":1429},"/topics/agentic-ai/","agentic ai",{"title":1547,"links":1548},"Solutions",[1549,1551,1553,1558,1562,1565,1569,1572,1574,1577,1580,1585],{"text":1079,"config":1550},{"href":1074,"dataGaName":1079,"dataGaLocation":1429},{"text":1068,"config":1552},{"href":1051,"dataGaName":1052,"dataGaLocation":1429},{"text":1554,"config":1555},"Agile development",{"href":1556,"dataGaName":1557,"dataGaLocation":1429},"/solutions/agile-delivery/","agile delivery",{"text":1559,"config":1560},"SCM",{"href":1064,"dataGaName":1561,"dataGaLocation":1429},"source code management",{"text":1508,"config":1563},{"href":1057,"dataGaName":1564,"dataGaLocation":1429},"continuous integration & delivery",{"text":1566,"config":1567},"Value stream management",{"href":1107,"dataGaName":1568,"dataGaLocation":1429},"value stream management",{"text":1513,"config":1570},{"href":1571,"dataGaName":1516,"dataGaLocation":1429},"/solutions/gitops/",{"text":1117,"config":1573},{"href":1120,"dataGaName":1121,"dataGaLocation":1429},{"text":1575,"config":1576},"Small business",{"href":1126,"dataGaName":1127,"dataGaLocation":1429},{"text":1578,"config":1579},"Public sector",{"href":1132,"dataGaName":1133,"dataGaLocation":1429},{"text":1581,"config":1582},"Education",{"href":1583,"dataGaName":1584,"dataGaLocation":1429},"/solutions/education/","education",{"text":1586,"config":1587},"Financial services",{"href":1588,"dataGaName":1589,"dataGaLocation":1429},"/solutions/finance/","financial services",{"title":1140,"links":1591},[1592,1594,1596,1598,1601,1603,1606,1608,1610,1612,1614,1616,1618,1620],{"text":1153,"config":1593},{"href":1155,"dataGaName":1156,"dataGaLocation":1429},{"text":1158,"config":1595},{"href":1160,"dataGaName":1161,"dataGaLocation":1429},{"text":1163,"config":1597},{"href":1165,"dataGaName":1166,"dataGaLocation":1429},{"text":1168,"config":1599},{"href":1170,"dataGaName":1600,"dataGaLocation":1429},"docs",{"text":1191,"config":1602},{"href":1193,"dataGaName":1194,"dataGaLocation":1429},{"text":1604,"config":1605},"What's new",{"href":1251,"dataGaName":1252,"dataGaLocation":1429},{"text":1186,"config":1607},{"href":1188,"dataGaName":1189,"dataGaLocation":1429},{"text":1205,"config":1609},{"href":1207,"dataGaName":1208,"dataGaLocation":1429},{"text":1213,"config":1611},{"href":1215,"dataGaName":1216,"dataGaLocation":1429},{"text":1218,"config":1613},{"href":1220,"dataGaName":1221,"dataGaLocation":1429},{"text":1223,"config":1615},{"href":1225,"dataGaName":1226,"dataGaLocation":1429},{"text":1228,"config":1617},{"href":1230,"dataGaName":1231,"dataGaLocation":1429},{"text":1233,"config":1619},{"href":1235,"dataGaName":1236,"dataGaLocation":1429},{"text":1238,"config":1621},{"href":1240,"dataGaName":1241,"dataGaLocation":1429},{"title":1254,"links":1623},[1624,1626,1628,1630,1632,1634,1638,1643,1645,1647,1649],{"text":1262,"config":1625},{"href":1264,"dataGaName":1256,"dataGaLocation":1429},{"text":1267,"config":1627},{"href":1269,"dataGaName":1270,"dataGaLocation":1429},{"text":1275,"config":1629},{"href":1277,"dataGaName":1278,"dataGaLocation":1429},{"text":1280,"config":1631},{"href":1282,"dataGaName":1283,"dataGaLocation":1429},{"text":1285,"config":1633},{"href":1287,"dataGaName":1288,"dataGaLocation":1429},{"text":1635,"config":1636},"Sustainability",{"href":1637,"dataGaName":1635,"dataGaLocation":1429},"/sustainability/",{"text":1639,"config":1640},"Diversity, inclusion and belonging (DIB)",{"href":1641,"dataGaName":1642,"dataGaLocation":1429},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1290,"config":1644},{"href":1292,"dataGaName":1293,"dataGaLocation":1429},{"text":1300,"config":1646},{"href":1302,"dataGaName":1303,"dataGaLocation":1429},{"text":1305,"config":1648},{"href":1307,"dataGaName":1308,"dataGaLocation":1429},{"text":1650,"config":1651},"Modern Slavery Transparency Statement",{"href":1652,"dataGaName":1653,"dataGaLocation":1429},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1655},[1656,1659,1662],{"text":1657,"config":1658},"Terms",{"href":1481,"dataGaName":1482,"dataGaLocation":1429},{"text":1660,"config":1661},"Cookies",{"dataGaName":1491,"dataGaLocation":1429,"id":1492,"isOneTrustButton":318},{"text":1663,"config":1664},"Privacy",{"href":1486,"dataGaName":1487,"dataGaLocation":1429},[1666],{"id":1667,"title":7,"body":969,"config":1668,"content":1670,"description":969,"extension":1674,"meta":1675,"navigation":318,"path":1676,"seo":1677,"stem":1678,"__hash__":1679},"blogAuthors/en-us/blog/authors/regnard-raquedan.yml",{"template":1669},"BlogAuthor",{"name":7,"config":1671},{"headshot":1672,"ctfId":1673},"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",[1681,1689,1697],{"title":1682,"description":1683,"heroImage":1684,"category":965,"date":1685,"authors":1686,"slug":1688,"externalUrl":969},"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",[1687],"Itzik Gan Baruch","agentic-click-through-demo",{"title":1690,"description":1691,"heroImage":1692,"category":965,"date":1693,"authors":1694,"slug":1696,"externalUrl":969},"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",[1695],"Julie Griffin","govern-agentic-ai-mcps-code-assistants",{"title":1698,"description":1699,"heroImage":1700,"category":965,"date":1701,"authors":1702,"slug":1704,"externalUrl":969},"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",[1703],"Brittany Lutz","claude-opus-5-on-gitlab-duo-agent-platform",{"promotions":1706},[1707,1720,1732,1744],{"id":1708,"categories":1709,"header":1710,"text":1711,"button":1712,"image":1717},"ai-modernization",[965],"Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1713,"config":1714},"Get your AI maturity score",{"href":1715,"dataGaName":1716,"dataGaLocation":1194},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1718},{"src":1719},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1721,"categories":1722,"header":1724,"text":1711,"button":1725,"image":1729},"devops-modernization",[1723,1531],"product","Are you just managing tools or shipping innovation?",{"text":1726,"config":1727},"Get your DevOps maturity score",{"href":1728,"dataGaName":1716,"dataGaLocation":1194},"/assessments/devops-modernization-assessment/",{"config":1730},{"src":1731},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1733,"categories":1734,"header":1736,"text":1711,"button":1737,"image":1741},"security-modernization",[1735],"security","Are you trading speed for security?",{"text":1738,"config":1739},"Get your security maturity score",{"href":1740,"dataGaName":1716,"dataGaLocation":1194},"/assessments/security-modernization-assessment/",{"config":1742},{"src":1743},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1745,"paths":1746,"header":1749,"text":1750,"button":1751,"image":1756},"github-azure-migration",[1747,1748],"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":1752,"config":1753},"See how GitLab compares to GitHub",{"href":1754,"dataGaName":1755,"dataGaLocation":1194},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1757},{"src":1731},{"header":1759,"blurb":1760,"button":1761,"secondaryButton":1766},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1762,"config":1763},"Get your free trial",{"href":1764,"dataGaName":993,"dataGaLocation":1765},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1467,"config":1767},{"href":1319,"dataGaName":998,"dataGaLocation":1765},1786803747001]