[{"data":1,"prerenderedAt":1440},["ShallowReactive",2],{"/blog/introduction-of-oidc-modules-for-integration-between-google-cloud-and-gitlab-ci":3,"navigation-en-us":645,"banner-en-us":1071,"footer-en-us":1081,"blog-post-authors-en-us-Hiroki Suezawa|Dhruv Jain":1325,"blog-related-posts-en-us-introduction-of-oidc-modules-for-integration-between-google-cloud-and-gitlab-ci":1352,"blog-promotions-en-us":1377,"next-steps-en-us":1430},{"id":4,"title":5,"authors":6,"body":9,"category":623,"date":624,"description":625,"extension":626,"externalUrl":627,"faq":627,"featured":628,"heroImage":629,"meta":630,"navigation":389,"path":631,"seo":632,"slug":637,"stem":638,"tags":639,"template":643,"updatedDate":627,"__hash__":644},"blogPosts/en-us/blog/introduction-of-oidc-modules-for-integration-between-google-cloud-and-gitlab-ci.md","How OIDC can simplify authentication of GitLab CI/CD pipelines with Google Cloud",[7,8],"Hiroki Suezawa","Dhruv Jain",{"type":10,"value":11,"toc":613},"minimark",[12,29,50,53,62,67,70,80,83,103,107,110,127,134,137,140,144,147,158,161,302,311,314,322,329,333,347,350,499,504,512,519,529,536,540,543,557,564,573,576,580,609],[13,14,15,16,22,23,28],"p",{},"In recent years, the ",[17,18,21],"a",{"href":19,"rel":20},"https://about.gitlab.com/blog/the-ultimate-guide-to-gitops-with-gitlab/",[],"integration of cloud services and GitLab through GitOps"," has become very common. Applications are now continuously tested and deployed through ",[17,24,27],{"href":25,"rel":26},"https://about.gitlab.com/topics/ci-cd/",[],"continuous integration and delivery (CI/CD)","; cloud environments are managed in code through Infrastructure as Code (IaC) using tools like Terraform; and GitLab CI is used as a core tool to perform these GitOps processes.",[13,30,31,32,37,38,43,44,49],{},"At the same time, ",[17,33,36],{"href":34,"rel":35},"https://about.gitlab.com/blog/the-ultimate-guide-to-software-supply-chain-security/",[],"software supply chain attacks"," have increased. To reduce the risk of an attack, the use of OpenID Connect (",[17,39,42],{"href":40,"rel":41},"https://docs.gitlab.com/integration/openid_connect_provider/#introduction-to-openid-connect",[],"OIDC",") auth is recommended, and GitLab 15.7 introduced ",[17,45,48],{"href":46,"rel":47},"https://docs.gitlab.com/ci/secrets/id_token_authentication/",[],"ID tokens",", a mechanism for secure OIDC integration.",[13,51,52],{},"However, OIDC integration can be complex for beginners and can be difficult to configure properly. Therefore, GitLab's Infrastructure Security Team has created a Terraform module for configuring Google Cloud and a CI template for GitLab CI so GitLab CI and Google Cloud can be securely integrated.",[13,54,55,56,61],{},"This tutorial explains how to use ",[17,57,60],{"href":58,"rel":59},"https://gitlab.com/gitlab-com/gl-security/security-operations/infrastructure-security-public/oidc-modules",[],"these OIDC modules",".",[63,64,66],"h2",{"id":65},"why-oidc","Why OIDC?",[13,68,69],{},"The integration between Google Cloud and GitLab CI has often been done by adding a static key of the service account in Google Cloud to the environment variables of CI. However, this method has the following problems:",[71,72,73,77],"ul",{},[74,75,76],"li",{},"The risk of compromise is high because the same key can be used to manipulate the cloud environment over time.",[74,78,79],{},"Because static keys are portable, there is no link between the key and the environment in which it is used, making it difficult to identify where the key is being used.",[13,81,82],{},"OIDC authentication can solve the above problems by providing the following benefits:",[71,84,85,93,96],{},[74,86,87,88],{},"No need to issue static keys, eliminating the need for long-term key management.\n",[71,89,90],{},[74,91,92],{},"It also eliminates the compliance need of rotating the secrets every few months.",[74,94,95],{},"Low risk of leakage due to temporary tokens issued.",[74,97,98,99,61],{},"Because the CI used is tied to the Google Cloud environment, it is possible to properly manage where the service account is used.\nIn addition, other settings such as CI and CD isolation can be configured using ",[17,100,102],{"href":46,"rel":101},[],"the claims provided by GitLab CI",[63,104,106],{"id":105},"oidc-authentication-with-google-cloud","OIDC authentication with Google Cloud",[13,108,109],{},"The OIDC integration between Google Cloud and GitLab CI works as follows:",[71,111,112],{},[74,113,114,115],{},"Preparation (areas to configure in Terraform in OIDC models)\n",[116,117,118,121,124],"ol",{},[74,119,120],{},"Create a service account in Google Cloud for CI integration and set up the appropriate roles.",[74,122,123],{},"Create a Google Cloud Workload Identity pool and provider, and configure integration with GitLab CI.",[74,125,126],{},"Assign the Workload Identity User role to the service account.",[13,128,129],{},[130,131],"img",{"alt":132,"src":133},"Simplified diagram","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782397795/blog/Content%20Images/2023-06-30-introduction-of-oidc-modules-for-integration-between-google-cloud-and-gitlab-ci/oidc-auth-diagram.png",[13,135,136],{},"GitLab CI in action (simplified by the GitLab CI template in OIDC modules)",[13,138,139],{},"Google Cloud authenticates using an ID token issued on GitLab CI, so there is no need to issue a Google Cloud service account key.",[63,141,143],{"id":142},"how-to-use-a-terraform-module","How to use a Terraform module",[13,145,146],{},"The process of configuring a Terraform module to establish a connection between Google Cloud and GitLab using OIDC is fairly simple. This module takes care of the following steps:",[116,148,149,152,155],{},[74,150,151],{},"Create the Google Cloud Workload Identity Pool.",[74,153,154],{},"Create a Workload Identity Provider.",[74,156,157],{},"Grant permissions for service account impersonation.",[13,159,160],{},"Note: Your account must have at least the Workload Identity Pool Admin permission on the Google Cloud project.",[162,163,168],"pre",{"className":164,"code":165,"language":166,"meta":167,"style":167},"language-terraform shiki shiki-themes github-light","# terraform\nmodule \"gl_oidc\" {\n source = \"gitlab.com/gitlab-com/gcp-oidc/google\"\n version = \"3.0.0\"\n google_project_id = GOOGLE_PROJECT_ID\n gitlab_project_id = GITLAB_PROJECT_ID\n oidc_service_account = {\n   \"sa\" = {\n     sa_email  = \"SERVICE_ACCOUNT_EMAIL\"\n     attribute = \"attribute.project_id/GITLAB_PROJECT_ID\"\n   }\n }\n}\n","terraform","",[169,170,171,180,195,209,220,231,242,252,261,273,284,290,296],"code",{"__ignoreMap":167},[172,173,176],"span",{"class":174,"line":175},"line",1,[172,177,179],{"class":178},"sAwPA","# terraform\n",[172,181,183,187,191],{"class":174,"line":182},2,[172,184,186],{"class":185},"s7eDp","module",[172,188,190],{"class":189},"sYu0t"," \"gl_oidc\"",[172,192,194],{"class":193},"sgsFI"," {\n",[172,196,198,201,205],{"class":174,"line":197},3,[172,199,200],{"class":193}," source",[172,202,204],{"class":203},"sD7c4"," =",[172,206,208],{"class":207},"sYBdl"," \"gitlab.com/gitlab-com/gcp-oidc/google\"\n",[172,210,212,215,217],{"class":174,"line":211},4,[172,213,214],{"class":193}," version",[172,216,204],{"class":203},[172,218,219],{"class":207}," \"3.0.0\"\n",[172,221,223,226,228],{"class":174,"line":222},5,[172,224,225],{"class":193}," google_project_id",[172,227,204],{"class":203},[172,229,230],{"class":193}," GOOGLE_PROJECT_ID\n",[172,232,234,237,239],{"class":174,"line":233},6,[172,235,236],{"class":193}," gitlab_project_id",[172,238,204],{"class":203},[172,240,241],{"class":193}," GITLAB_PROJECT_ID\n",[172,243,245,248,250],{"class":174,"line":244},7,[172,246,247],{"class":193}," oidc_service_account",[172,249,204],{"class":203},[172,251,194],{"class":193},[172,253,255,258],{"class":174,"line":254},8,[172,256,257],{"class":207},"   \"sa\"",[172,259,260],{"class":193}," = {\n",[172,262,264,267,270],{"class":174,"line":263},9,[172,265,266],{"class":193},"     sa_email  ",[172,268,269],{"class":203},"=",[172,271,272],{"class":207}," \"SERVICE_ACCOUNT_EMAIL\"\n",[172,274,276,279,281],{"class":174,"line":275},10,[172,277,278],{"class":193},"     attribute ",[172,280,269],{"class":203},[172,282,283],{"class":207}," \"attribute.project_id/GITLAB_PROJECT_ID\"\n",[172,285,287],{"class":174,"line":286},11,[172,288,289],{"class":193},"   }\n",[172,291,293],{"class":174,"line":292},12,[172,294,295],{"class":193}," }\n",[172,297,299],{"class":174,"line":298},13,[172,300,301],{"class":193},"}\n",[13,303,304,305,310],{},"The above sample module can be used to configure OIDC. There are some additional parameters that can be used to configure this module further (a detailed list and description of those parameters can be found ",[17,306,309],{"href":307,"rel":308},"https://gitlab.com/gitlab-com/gl-security/security-operations/infrastructure-security-public/oidc-modules/-/tree/main/#configure-gitlab-for-oidc-integration-using-terraform-module",[],"here",").\nBy default, all branches of the project are authenticated to Google Cloud, but you can specify more granular conditions, such as the branch name of the commit that triggered the CI, or authenticating only with a specific tag.",[13,312,313],{},"Further settings can be made by changing the following attribute settings in accordance with the ID token claim:",[162,315,320],{"className":316,"code":318,"language":319,"meta":167},[317],"language-text","\n  oidc_service_account = {\n    \"sa\" = {\n      sa_email  = \"SERVICE_ACCOUNT_EMAIL\"\n      attribute = \"attribute.project_id/GITLAB_PROJECT_ID\"\n    }\n\n","text",[169,321,318],{"__ignoreMap":167},[13,323,324,325,61],{},"Code files for this module are available ",[17,326,309],{"href":327,"rel":328},"https://gitlab.com/gitlab-com/gl-security/security-operations/infrastructure-security-public/oidc-modules/-/tree/main/terraform-modules/gcp-oidc",[],[63,330,332],{"id":331},"how-to-use-the-ci-template","How to use the CI template",[13,334,335,340,341,346],{},[17,336,339],{"href":337,"rel":338},"https://gitlab.com/gitlab-com/gl-security/security-operations/infrastructure-security-public/oidc-modules/-/blob/main/templates/gcp_auth.yaml",[],"The CI template"," makes GitLab CI very easy for Google Cloud OIDC authentication. This CI template supports ",[17,342,345],{"href":343,"rel":344},"https://cloud.google.com/docs/authentication/application-default-credentials",[],"Application Default Credentials"," and can be used from IaC such as Terraform, CLI such as gcloud, and SDKs in Python and Go.",[13,348,349],{},"For example, if you want to use the CI template for Terraform, you can write:",[162,351,355],{"className":352,"code":353,"language":354,"meta":167,"style":167},"language-yaml shiki shiki-themes github-light","# You should upgrade to the latest version. You can find the latest version at https://gitlab.com/gitlab-com/gl-security/security-operations/infrastructure-security-public/oidc-modules/-/releases\ninclude:\n  - remote: 'https://gitlab.com/gitlab-com/gl-security/security-operations/infrastructure-security-public/oidc-modules/-/raw/3.0.0/templates/gcp_auth.yaml'\n\nterraform:\n  image:\n    name: hashicorp/terraform:1.5.3\n    entrypoint:\n      - /usr/bin/env\n      - \"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"\n  extends: .google-oidc:auth\n  variables:\n    WI_POOL_PROVIDER: //iam.googleapis.com/projects/GOOGLE_PROJECT_ID/locations/global/workloadIdentityPools/WORKLOAD_IDENTITY_POOL/providers/WORKLOAD_IDENTITY_POOL_PROVIDER\n    SERVICE_ACCOUNT: SERVICE_ACCOUNT_EMAIL\n  script:\n    - terraform init\n    - terraform plan\n\n","yaml",[169,356,357,362,371,385,391,397,404,414,421,429,436,446,453,463,474,482,491],{"__ignoreMap":167},[172,358,359],{"class":174,"line":175},[172,360,361],{"class":178},"# You should upgrade to the latest version. You can find the latest version at https://gitlab.com/gitlab-com/gl-security/security-operations/infrastructure-security-public/oidc-modules/-/releases\n",[172,363,364,368],{"class":174,"line":182},[172,365,367],{"class":366},"shJU0","include",[172,369,370],{"class":193},":\n",[172,372,373,376,379,382],{"class":174,"line":197},[172,374,375],{"class":193},"  - ",[172,377,378],{"class":366},"remote",[172,380,381],{"class":193},": ",[172,383,384],{"class":207},"'https://gitlab.com/gitlab-com/gl-security/security-operations/infrastructure-security-public/oidc-modules/-/raw/3.0.0/templates/gcp_auth.yaml'\n",[172,386,387],{"class":174,"line":211},[172,388,390],{"emptyLinePlaceholder":389},true,"\n",[172,392,393,395],{"class":174,"line":222},[172,394,166],{"class":366},[172,396,370],{"class":193},[172,398,399,402],{"class":174,"line":233},[172,400,401],{"class":366},"  image",[172,403,370],{"class":193},[172,405,406,409,411],{"class":174,"line":244},[172,407,408],{"class":366},"    name",[172,410,381],{"class":193},[172,412,413],{"class":207},"hashicorp/terraform:1.5.3\n",[172,415,416,419],{"class":174,"line":254},[172,417,418],{"class":366},"    entrypoint",[172,420,370],{"class":193},[172,422,423,426],{"class":174,"line":263},[172,424,425],{"class":193},"      - ",[172,427,428],{"class":207},"/usr/bin/env\n",[172,430,431,433],{"class":174,"line":275},[172,432,425],{"class":193},[172,434,435],{"class":207},"\"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\"\n",[172,437,438,441,443],{"class":174,"line":286},[172,439,440],{"class":366},"  extends",[172,442,381],{"class":193},[172,444,445],{"class":207},".google-oidc:auth\n",[172,447,448,451],{"class":174,"line":292},[172,449,450],{"class":366},"  variables",[172,452,370],{"class":193},[172,454,455,458,460],{"class":174,"line":298},[172,456,457],{"class":366},"    WI_POOL_PROVIDER",[172,459,381],{"class":193},[172,461,462],{"class":207},"//iam.googleapis.com/projects/GOOGLE_PROJECT_ID/locations/global/workloadIdentityPools/WORKLOAD_IDENTITY_POOL/providers/WORKLOAD_IDENTITY_POOL_PROVIDER\n",[172,464,466,469,471],{"class":174,"line":465},14,[172,467,468],{"class":366},"    SERVICE_ACCOUNT",[172,470,381],{"class":193},[172,472,473],{"class":207},"SERVICE_ACCOUNT_EMAIL\n",[172,475,477,480],{"class":174,"line":476},15,[172,478,479],{"class":366},"  script",[172,481,370],{"class":193},[172,483,485,488],{"class":174,"line":484},16,[172,486,487],{"class":193},"    - ",[172,489,490],{"class":207},"terraform init\n",[172,492,494,496],{"class":174,"line":493},17,[172,495,487],{"class":193},[172,497,498],{"class":207},"terraform plan\n",[500,501,503],"h3",{"id":502},"required-variables","Required variables",[71,505,506,509],{},[74,507,508],{},"WI_POOL_PROVIDER(under .google-oidc:) - Full canonical resource name of the workload identity pool provider. This value must be written under .google-oidc: like this.",[74,510,511],{},"SERVICE_ACCOUNT - Service Account email address",[13,513,514,515,61],{},"A detailed list and description of those parameters can be found ",[17,516,309],{"href":517,"rel":518},"https://gitlab.com/gitlab-com/gl-security/security-operations/infrastructure-security-public/oidc-modules/-/blob/main/README.md#using-oidc-in-pipelines",[],[13,520,521,522,525,526,528],{},"As a note, you cannot use ",[169,523,524],{},"before_script"," in the job that uses this template because the way GitLab CI works will result in OIDC code being overwritten. CI template uses ",[169,527,524],{}," to perform the initial configuration of OIDC.",[13,530,531,532,61],{},"Code samples for this module are available ",[17,533,309],{"href":534,"rel":535},"https://gitlab.com/gitlab-com/gl-security/security-operations/infrastructure-security-public/oidc-modules/-/tree/main/samples/ci/gcp",[],[63,537,539],{"id":538},"next-steps","Next steps",[13,541,542],{},"This article has introduced OIDC modules for OIDC integration and secure authentication between Google Cloud and GitLab CI. In short, we are doing the following steps:",[116,544,545,548,551,554],{},[74,546,547],{},"Setting up a service account",[74,549,550],{},"Granting permissions to the service account",[74,552,553],{},"Running the Terraform module",[74,555,556],{},"Setting up CI pipeline",[13,558,559,560,61],{},"You can find the relevant sample for the above steps ",[17,561,309],{"href":562,"rel":563},"https://gitlab.com/gitlab-com/gl-security/security-operations/infrastructure-security-public/oidc-modules/-/tree/main/samples",[],[13,565,566,567,572],{},"Also, GitLab is currently developing a ",[17,568,571],{"href":569,"rel":570},"https://about.gitlab.com/blog/use-inputs-in-includable-files/",[],"CI Catalog and CI Components",". We plan to support them.",[13,574,575],{},"The GitLab Infrastructure Security Team will continue to improve the modules as we receive feedback, and we hope to consider and release components that maintain a high level of security and usability for both internal and external use.",[63,577,579],{"id":578},"read-more","Read more",[71,581,582,589,596,603],{},[74,583,584],{},[17,585,588],{"href":586,"rel":587},"https://docs.gitlab.com/ci/cloud_services/google_cloud/",[],"Configure OIDC with GCP Workload Identity Federation",[74,590,591],{},[17,592,595],{"href":593,"rel":594},"https://cloud.google.com/iam/docs/workload-identity-federation",[],"Workload Identity Federation on Google Cloud",[74,597,598],{},[17,599,602],{"href":600,"rel":601},"https://registry.terraform.io/providers/hashicorp/google/latest/docs/resources/iam_workload_identity_pool_provider",[],"Terraform for google_iam_workload_identity_pool_provider",[74,604,605],{},[17,606,608],{"href":46,"rel":607},[],"OIDC Authentication using ID tokens",[610,611,612],"style",{},"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 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 .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":167,"searchDepth":182,"depth":182,"links":614},[615,616,617,618,621,622],{"id":65,"depth":182,"text":66},{"id":105,"depth":182,"text":106},{"id":142,"depth":182,"text":143},{"id":331,"depth":182,"text":332,"children":619},[620],{"id":502,"depth":197,"text":503},{"id":538,"depth":182,"text":539},{"id":578,"depth":182,"text":579},"security","2023-06-28","OpenID Connect can sometimes be complex, but it's the safer and recommended way to authenticate your GitLab pipeline with Google Cloud. This tutorial shows you how.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749669863/Blog/Hero%20Images/security-pipelines.jpg",{},"/en-us/blog/introduction-of-oidc-modules-for-integration-between-google-cloud-and-gitlab-ci",{"title":633,"description":625,"ogTitle":633,"ogDescription":625,"noIndex":628,"ogImage":629,"ogUrl":634,"ogSiteName":635,"ogType":636,"canonicalUrls":634},"OIDC simplifies GitLab CI/CD authentication with Google Cloud","https://about.gitlab.com/blog/introduction-of-oidc-modules-for-integration-between-google-cloud-and-gitlab-ci","https://about.gitlab.com","article","introduction-of-oidc-modules-for-integration-between-google-cloud-and-gitlab-ci","en-us/blog/introduction-of-oidc-modules-for-integration-between-google-cloud-and-gitlab-ci",[640,641,623,642],"tutorial","CI/CD","cloud native","BlogPost","Q2hK1musYgdtmKKkre9tmMapf5KWnVGIGKkjrwRnJC4",{"logo":646,"freeTrial":651,"sales":656,"login":661,"items":666,"search":991,"minimal":1022,"duo":1041,"switchNav":1050,"pricingDeployment":1061},{"config":647},{"href":648,"dataGaName":649,"dataGaLocation":650},"/","gitlab logo","header",{"text":652,"config":653},"Get free trial",{"href":654,"dataGaName":655,"dataGaLocation":650},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":657,"config":658},"Request a demo",{"href":659,"dataGaName":660,"dataGaLocation":650},"/sales/?contact-topic=request-demo","sales",{"text":662,"config":663},"Sign in",{"href":664,"dataGaName":665,"dataGaLocation":650},"https://gitlab.com/users/sign_in/","sign in",[667,696,795,800,913,969],{"text":668,"config":669,"menu":671},"Platform",{"dataNavLevelOne":670},"platform",{"type":672,"columns":673},"cards",[674,680,688],{"title":668,"description":675,"link":676},"The intelligent orchestration platform for DevSecOps",{"text":677,"config":678},"Explore our Platform",{"href":679,"dataGaName":670,"dataGaLocation":650},"/platform/",{"title":681,"description":682,"link":683},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":684,"config":685},"Meet GitLab Duo",{"href":686,"dataGaName":687,"dataGaLocation":650},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":689,"description":690,"link":691},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":692,"config":693},"Learn more",{"href":694,"dataGaName":695,"dataGaLocation":650},"/why-gitlab/","why gitlab",{"text":697,"left":389,"config":698,"menu":700},"Product",{"dataNavLevelOne":699},"solutions",{"type":701,"link":702,"columns":706,"feature":774},"lists",{"text":703,"config":704},"View all Solutions",{"href":705,"dataGaName":699,"dataGaLocation":650},"/solutions/",[707,730,753],{"title":708,"description":709,"link":710,"items":715},"Automation","CI/CD and automation to accelerate deployment",{"config":711},{"icon":712,"href":713,"dataGaName":714,"dataGaLocation":650},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[716,719,722,726],{"text":641,"config":717},{"href":718,"dataGaLocation":650,"dataGaName":641},"/solutions/continuous-integration/",{"text":681,"config":720},{"href":686,"dataGaLocation":650,"dataGaName":721},"gitlab duo agent platform - product menu",{"text":723,"config":724},"Source Code Management",{"href":725,"dataGaLocation":650,"dataGaName":723},"/solutions/source-code-management/",{"text":727,"config":728},"Automated Software Delivery",{"href":713,"dataGaLocation":650,"dataGaName":729},"Automated software delivery",{"title":731,"description":732,"link":733,"items":738},"Security","Deliver code faster without compromising security",{"config":734},{"href":735,"dataGaName":736,"dataGaLocation":650,"icon":737},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[739,743,748],{"text":740,"config":741},"Application Security Testing",{"href":735,"dataGaName":742,"dataGaLocation":650},"Application security testing",{"text":744,"config":745},"Software Supply Chain Security",{"href":746,"dataGaLocation":650,"dataGaName":747},"/solutions/supply-chain/","Software supply chain security",{"text":749,"config":750},"Software Compliance",{"href":751,"dataGaName":752,"dataGaLocation":650},"/solutions/software-compliance/","software compliance",{"title":754,"link":755,"items":760},"Measurement",{"config":756},{"icon":757,"href":758,"dataGaName":759,"dataGaLocation":650},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[761,765,769],{"text":762,"config":763},"Visibility & Measurement",{"href":758,"dataGaLocation":650,"dataGaName":764},"Visibility and Measurement",{"text":766,"config":767},"Value Stream Management",{"href":768,"dataGaLocation":650,"dataGaName":766},"/solutions/value-stream-management/",{"text":770,"config":771},"Analytics & Insights",{"href":772,"dataGaLocation":650,"dataGaName":773},"/solutions/analytics-and-insights/","Analytics and insights",{"title":775,"type":701,"items":776},"GitLab for",[777,783,789],{"text":778,"config":779},"Enterprise",{"icon":780,"href":781,"dataGaLocation":650,"dataGaName":782},"Building","/enterprise/","enterprise",{"text":784,"config":785},"Small Business",{"icon":786,"href":787,"dataGaLocation":650,"dataGaName":788},"Work","/small-business/","small business",{"text":790,"config":791},"Public Sector",{"icon":792,"href":793,"dataGaLocation":650,"dataGaName":794},"Organization","/solutions/public-sector/","public sector",{"text":796,"config":797},"Pricing",{"href":798,"dataGaName":799,"dataGaLocation":650,"dataNavLevelOne":799},"/pricing/","pricing",{"text":801,"config":802,"menu":804},"Resources",{"dataNavLevelOne":803},"resources",{"type":701,"link":805,"columns":809,"feature":902},{"text":806,"config":807},"View all resources",{"href":808,"dataGaName":803,"dataGaLocation":650},"/resources/",[810,843,869],{"title":811,"items":812},"Getting started",[813,818,823,828,833,838],{"text":814,"config":815},"Install",{"href":816,"dataGaName":817,"dataGaLocation":650},"/install/","install",{"text":819,"config":820},"Quick start guides",{"href":821,"dataGaName":822,"dataGaLocation":650},"/get-started/","quick setup checklists",{"text":824,"config":825},"Learn",{"href":826,"dataGaLocation":650,"dataGaName":827},"https://university.gitlab.com/","learn",{"text":829,"config":830},"Product documentation",{"href":831,"dataGaName":832,"dataGaLocation":650},"https://docs.gitlab.com/","product documentation",{"text":834,"config":835},"Best practice videos",{"href":836,"dataGaName":837,"dataGaLocation":650},"/getting-started-videos/","best practice videos",{"text":839,"config":840},"Integrations",{"href":841,"dataGaName":842,"dataGaLocation":650},"/integrations/","integrations",{"title":844,"items":845},"Discover",[846,851,856,861,865],{"text":847,"config":848},"Customer success stories",{"href":849,"dataGaName":850,"dataGaLocation":650},"/customers/","customer success stories",{"text":852,"config":853},"Blog",{"href":854,"dataGaName":855,"dataGaLocation":650},"/blog/","blog",{"text":857,"config":858},"Demo Hub",{"href":859,"dataGaName":860,"dataGaLocation":650},"/demo-hub/","demo hub",{"text":862,"config":863},"The Source",{"href":864,"dataGaName":855,"dataGaLocation":650},"/the-source/",{"text":866,"config":867},"Remote",{"href":868,"dataGaName":378,"dataGaLocation":650},"https://handbook.gitlab.com/handbook/company/culture/all-remote/",{"title":870,"items":871},"Connect",[872,877,882,887,892,897],{"text":873,"config":874},"GitLab Services",{"href":875,"dataGaName":876,"dataGaLocation":650},"/services/","services",{"text":878,"config":879},"Contribute",{"href":880,"dataGaName":881,"dataGaLocation":650},"https://contributors.gitlab.com","contribute",{"text":883,"config":884},"Community",{"href":885,"dataGaName":886,"dataGaLocation":650},"/community/","community",{"text":888,"config":889},"Forum",{"href":890,"dataGaName":891,"dataGaLocation":650},"https://forum.gitlab.com/","forum",{"text":893,"config":894},"Events",{"href":895,"dataGaName":896,"dataGaLocation":650},"/events/","events",{"text":898,"config":899},"Partners",{"href":900,"dataGaName":901,"dataGaLocation":650},"/partners/","partners",{"config":903,"title":906,"text":907,"link":908},{"background":904,"textColor":905},"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":909,"config":910},"Read the latest",{"href":911,"dataGaName":912,"dataGaLocation":650},"/whats-new/","whats new",{"text":914,"config":915,"menu":917},"Company",{"dataNavLevelOne":916},"company",{"type":701,"columns":918},[919],{"items":920},[921,926,932,934,939,944,949,954,959,964],{"text":922,"config":923},"About",{"href":924,"dataGaName":925,"dataGaLocation":650},"/company/","about",{"text":927,"config":928,"footerGa":931},"Jobs",{"href":929,"dataGaName":930,"dataGaLocation":650},"/jobs/","jobs",{"dataGaName":930},{"text":893,"config":933},{"href":895,"dataGaName":896,"dataGaLocation":650},{"text":935,"config":936},"Leadership",{"href":937,"dataGaName":938,"dataGaLocation":650},"/company/team/e-group/","leadership",{"text":940,"config":941},"Handbook",{"href":942,"dataGaName":943,"dataGaLocation":650},"https://handbook.gitlab.com/","handbook",{"text":945,"config":946},"Investor relations",{"href":947,"dataGaName":948,"dataGaLocation":650},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":950,"config":951},"Trust Center",{"href":952,"dataGaName":953,"dataGaLocation":650},"/security/","trust center",{"text":955,"config":956},"AI Transparency Center",{"href":957,"dataGaName":958,"dataGaLocation":650},"/ai-transparency-center/","ai transparency center",{"text":960,"config":961},"Newsletter",{"href":962,"dataGaName":963,"dataGaLocation":650},"/company/contact/#contact-forms","newsletter",{"text":965,"config":966},"Press",{"href":967,"dataGaName":968,"dataGaLocation":650},"/press/","press",{"text":970,"config":971,"menu":972},"Contact us",{"dataNavLevelOne":916},{"type":701,"columns":973},[974],{"items":975},[976,981,986],{"text":977,"config":978},"Talk to sales",{"href":979,"dataGaName":980,"dataGaLocation":650},"/sales/","talk to sales",{"text":982,"config":983},"Support portal",{"href":984,"dataGaName":985,"dataGaLocation":650},"https://support.gitlab.com/hc/en-us","support portal",{"text":987,"config":988},"Customer portal",{"href":989,"dataGaName":990,"dataGaLocation":650},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":992,"login":993,"suggestions":1000},"Close",{"text":994,"link":995},"To search repositories and projects, login to",{"text":996,"config":997},"gitlab.com",{"href":664,"dataGaName":998,"dataGaLocation":999},"search login","search",{"text":1001,"default":1002},"Suggestions",[1003,1005,1009,1011,1015,1019],{"text":681,"config":1004},{"href":686,"dataGaName":681,"dataGaLocation":999},{"text":1006,"config":1007},"Code Suggestions (AI)",{"href":1008,"dataGaName":1006,"dataGaLocation":999},"/solutions/code-suggestions/",{"text":641,"config":1010},{"href":718,"dataGaName":641,"dataGaLocation":999},{"text":1012,"config":1013},"GitLab on AWS",{"href":1014,"dataGaName":1012,"dataGaLocation":999},"/partners/technology-partners/aws/",{"text":1016,"config":1017},"GitLab on Google Cloud",{"href":1018,"dataGaName":1016,"dataGaLocation":999},"/partners/technology-partners/google-cloud-platform/",{"text":1020,"config":1021},"Why GitLab?",{"href":694,"dataGaName":1020,"dataGaLocation":999},{"freeTrial":1023,"mobileIcon":1028,"desktopIcon":1033,"secondaryButton":1036},{"text":1024,"config":1025},"Start free trial",{"href":1026,"dataGaName":655,"dataGaLocation":1027},"https://gitlab.com/-/trials/new/","nav",{"altText":1029,"config":1030},"Gitlab Icon",{"src":1031,"dataGaName":1032,"dataGaLocation":1027},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1029,"config":1034},{"src":1035,"dataGaName":1032,"dataGaLocation":1027},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1037,"config":1038},"Get Started",{"href":1039,"dataGaName":1040,"dataGaLocation":1027},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1042,"mobileIcon":1046,"desktopIcon":1048},{"text":1043,"config":1044},"Learn more about GitLab Duo",{"href":686,"dataGaName":1045,"dataGaLocation":1027},"gitlab duo",{"altText":1029,"config":1047},{"src":1031,"dataGaName":1032,"dataGaLocation":1027},{"altText":1029,"config":1049},{"src":1035,"dataGaName":1032,"dataGaLocation":1027},{"button":1051,"mobileIcon":1056,"desktopIcon":1058},{"text":1052,"config":1053},"/switch",{"href":1054,"dataGaName":1055,"dataGaLocation":1027},"#contact","switch",{"altText":1029,"config":1057},{"src":1031,"dataGaName":1032,"dataGaLocation":1027},{"altText":1029,"config":1059},{"src":1060,"dataGaName":1032,"dataGaLocation":1027},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1062,"mobileIcon":1067,"desktopIcon":1069},{"text":1063,"config":1064},"Back to pricing",{"href":798,"dataGaName":1065,"dataGaLocation":1027,"icon":1066},"back to pricing","GoBack",{"altText":1029,"config":1068},{"src":1031,"dataGaName":1032,"dataGaLocation":1027},{"altText":1029,"config":1070},{"src":1035,"dataGaName":1032,"dataGaLocation":1027},{"title":1072,"titleMobile":1073,"button":1074,"config":1079},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":692,"config":1075},{"href":1076,"dataGaName":1077,"dataGaLocation":1078},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1080,"disabled":628},"release",{"data":1082},{"text":1083,"source":1084,"edit":1090,"contribute":1095,"config":1100,"items":1105,"minimal":1314},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1085,"config":1086},"View page source",{"href":1087,"dataGaName":1088,"dataGaLocation":1089},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1091,"config":1092},"Edit this page",{"href":1093,"dataGaName":1094,"dataGaLocation":1089},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1096,"config":1097},"Please contribute",{"href":1098,"dataGaName":1099,"dataGaLocation":1089},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1101,"facebook":1102,"youtube":1103,"linkedin":1104},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1106,1153,1206,1250,1282],{"title":796,"links":1107,"subMenu":1122},[1108,1112,1117],{"text":1109,"config":1110},"View plans",{"href":798,"dataGaName":1111,"dataGaLocation":1089},"view plans",{"text":1113,"config":1114},"Why Premium?",{"href":1115,"dataGaName":1116,"dataGaLocation":1089},"/pricing/premium/","why premium",{"text":1118,"config":1119},"Why Ultimate?",{"href":1120,"dataGaName":1121,"dataGaLocation":1089},"/pricing/ultimate/","why ultimate",[1123],{"title":1124,"links":1125},"Contact Us",[1126,1129,1131,1133,1138,1143,1148],{"text":1127,"config":1128},"Contact sales",{"href":979,"dataGaName":660,"dataGaLocation":1089},{"text":982,"config":1130},{"href":984,"dataGaName":985,"dataGaLocation":1089},{"text":987,"config":1132},{"href":989,"dataGaName":990,"dataGaLocation":1089},{"text":1134,"config":1135},"Status",{"href":1136,"dataGaName":1137,"dataGaLocation":1089},"https://status.gitlab.com/","status",{"text":1139,"config":1140},"Terms of use",{"href":1141,"dataGaName":1142,"dataGaLocation":1089},"/terms/","terms of use",{"text":1144,"config":1145},"Privacy statement",{"href":1146,"dataGaName":1147,"dataGaLocation":1089},"/privacy/","privacy statement",{"text":1149,"config":1150},"Cookie preferences",{"dataGaName":1151,"dataGaLocation":1089,"id":1152,"isOneTrustButton":389},"cookie preferences","ot-sdk-btn",{"title":697,"links":1154,"subMenu":1163},[1155,1159],{"text":1156,"config":1157},"DevSecOps platform",{"href":679,"dataGaName":1158,"dataGaLocation":1089},"devsecops platform",{"text":1160,"config":1161},"AI-Assisted Development",{"href":686,"dataGaName":1162,"dataGaLocation":1089},"ai-assisted development",[1164],{"title":1165,"links":1166},"Topics",[1167,1172,1177,1182,1187,1192,1196,1201],{"text":1168,"config":1169},"CICD",{"href":1170,"dataGaName":1171,"dataGaLocation":1089},"/topics/ci-cd/","cicd",{"text":1173,"config":1174},"GitOps",{"href":1175,"dataGaName":1176,"dataGaLocation":1089},"/topics/gitops/","gitops",{"text":1178,"config":1179},"DevOps",{"href":1180,"dataGaName":1181,"dataGaLocation":1089},"/topics/devops/","devops",{"text":1183,"config":1184},"Version Control",{"href":1185,"dataGaName":1186,"dataGaLocation":1089},"/topics/version-control/","version control",{"text":1188,"config":1189},"DevSecOps",{"href":1190,"dataGaName":1191,"dataGaLocation":1089},"/topics/devsecops/","devsecops",{"text":1193,"config":1194},"Cloud Native",{"href":1195,"dataGaName":642,"dataGaLocation":1089},"/topics/cloud-native/",{"text":1197,"config":1198},"AI for Coding",{"href":1199,"dataGaName":1200,"dataGaLocation":1089},"/topics/devops/ai-for-coding/","ai for coding",{"text":1202,"config":1203},"Agentic AI",{"href":1204,"dataGaName":1205,"dataGaLocation":1089},"/topics/agentic-ai/","agentic ai",{"title":1207,"links":1208},"Solutions",[1209,1211,1213,1218,1222,1225,1229,1232,1234,1237,1240,1245],{"text":740,"config":1210},{"href":735,"dataGaName":740,"dataGaLocation":1089},{"text":729,"config":1212},{"href":713,"dataGaName":714,"dataGaLocation":1089},{"text":1214,"config":1215},"Agile development",{"href":1216,"dataGaName":1217,"dataGaLocation":1089},"/solutions/agile-delivery/","agile delivery",{"text":1219,"config":1220},"SCM",{"href":725,"dataGaName":1221,"dataGaLocation":1089},"source code management",{"text":1168,"config":1223},{"href":718,"dataGaName":1224,"dataGaLocation":1089},"continuous integration & delivery",{"text":1226,"config":1227},"Value stream management",{"href":768,"dataGaName":1228,"dataGaLocation":1089},"value stream management",{"text":1173,"config":1230},{"href":1231,"dataGaName":1176,"dataGaLocation":1089},"/solutions/gitops/",{"text":778,"config":1233},{"href":781,"dataGaName":782,"dataGaLocation":1089},{"text":1235,"config":1236},"Small business",{"href":787,"dataGaName":788,"dataGaLocation":1089},{"text":1238,"config":1239},"Public sector",{"href":793,"dataGaName":794,"dataGaLocation":1089},{"text":1241,"config":1242},"Education",{"href":1243,"dataGaName":1244,"dataGaLocation":1089},"/solutions/education/","education",{"text":1246,"config":1247},"Financial services",{"href":1248,"dataGaName":1249,"dataGaLocation":1089},"/solutions/finance/","financial services",{"title":801,"links":1251},[1252,1254,1256,1258,1261,1263,1266,1268,1270,1272,1274,1276,1278,1280],{"text":814,"config":1253},{"href":816,"dataGaName":817,"dataGaLocation":1089},{"text":819,"config":1255},{"href":821,"dataGaName":822,"dataGaLocation":1089},{"text":824,"config":1257},{"href":826,"dataGaName":827,"dataGaLocation":1089},{"text":829,"config":1259},{"href":831,"dataGaName":1260,"dataGaLocation":1089},"docs",{"text":852,"config":1262},{"href":854,"dataGaName":855,"dataGaLocation":1089},{"text":1264,"config":1265},"What's new",{"href":911,"dataGaName":912,"dataGaLocation":1089},{"text":847,"config":1267},{"href":849,"dataGaName":850,"dataGaLocation":1089},{"text":866,"config":1269},{"href":868,"dataGaName":378,"dataGaLocation":1089},{"text":873,"config":1271},{"href":875,"dataGaName":876,"dataGaLocation":1089},{"text":878,"config":1273},{"href":880,"dataGaName":881,"dataGaLocation":1089},{"text":883,"config":1275},{"href":885,"dataGaName":886,"dataGaLocation":1089},{"text":888,"config":1277},{"href":890,"dataGaName":891,"dataGaLocation":1089},{"text":893,"config":1279},{"href":895,"dataGaName":896,"dataGaLocation":1089},{"text":898,"config":1281},{"href":900,"dataGaName":901,"dataGaLocation":1089},{"title":914,"links":1283},[1284,1286,1288,1290,1292,1294,1298,1303,1305,1307,1309],{"text":922,"config":1285},{"href":924,"dataGaName":916,"dataGaLocation":1089},{"text":927,"config":1287},{"href":929,"dataGaName":930,"dataGaLocation":1089},{"text":935,"config":1289},{"href":937,"dataGaName":938,"dataGaLocation":1089},{"text":940,"config":1291},{"href":942,"dataGaName":943,"dataGaLocation":1089},{"text":945,"config":1293},{"href":947,"dataGaName":948,"dataGaLocation":1089},{"text":1295,"config":1296},"Sustainability",{"href":1297,"dataGaName":1295,"dataGaLocation":1089},"/sustainability/",{"text":1299,"config":1300},"Diversity, inclusion and belonging (DIB)",{"href":1301,"dataGaName":1302,"dataGaLocation":1089},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":950,"config":1304},{"href":952,"dataGaName":953,"dataGaLocation":1089},{"text":960,"config":1306},{"href":962,"dataGaName":963,"dataGaLocation":1089},{"text":965,"config":1308},{"href":967,"dataGaName":968,"dataGaLocation":1089},{"text":1310,"config":1311},"Modern Slavery Transparency Statement",{"href":1312,"dataGaName":1313,"dataGaLocation":1089},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1315},[1316,1319,1322],{"text":1317,"config":1318},"Terms",{"href":1141,"dataGaName":1142,"dataGaLocation":1089},{"text":1320,"config":1321},"Cookies",{"dataGaName":1151,"dataGaLocation":1089,"id":1152,"isOneTrustButton":389},{"text":1323,"config":1324},"Privacy",{"href":1146,"dataGaName":1147,"dataGaLocation":1089},[1326,1340],{"id":1327,"title":7,"body":627,"config":1328,"content":1330,"description":627,"extension":1334,"meta":1335,"navigation":389,"path":1336,"seo":1337,"stem":1338,"__hash__":1339},"blogAuthors/en-us/blog/authors/hiroki-suezawa.yml",{"template":1329},"BlogAuthor",{"name":7,"config":1331},{"headshot":1332,"ctfId":1333},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749662370/Blog/Author%20Headshots/hiroki_suezawa.png","cw6ZIj0yjr1uw2LAFr23h","yml",{},"/en-us/blog/authors/hiroki-suezawa",{},"en-us/blog/authors/hiroki-suezawa","5SalhkDKL3j3O2JyjOofwTFjgEeNhoGH8nLQDeI7N7c",{"id":1341,"title":8,"body":627,"config":1342,"content":1343,"description":627,"extension":1334,"meta":1347,"navigation":389,"path":1348,"seo":1349,"stem":1350,"__hash__":1351},"blogAuthors/en-us/blog/authors/dhruv-jain.yml",{"template":1329},{"name":8,"config":1344},{"headshot":1345,"ctfId":1346},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","2wyibk9HBKn6PjgaEuzXuZ",{},"/en-us/blog/authors/dhruv-jain",{},"en-us/blog/authors/dhruv-jain","OJoNUuloiZ5Yl0HQ9dknA-I9Q2q9lxcriznH3fAeeUY",[1353,1361,1369],{"title":1354,"description":1355,"heroImage":1356,"category":623,"date":1357,"authors":1358,"slug":1360,"externalUrl":627},"How GitLab tracks vulnerabilities through refactors and reformatting","Learn how GitLab's improved Scope+Offset fingerprinting keeps vulnerability tracking stable across comments, blank lines, and reformatting.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1759320418/xjmqcozxzt4frx0hori3.png","2026-08-12",[1359],"Julian Thome","improved-scope-offset-fingerprinting",{"title":1362,"description":1363,"heroImage":1356,"category":623,"date":1364,"authors":1365,"slug":1368,"externalUrl":627},"GitLab Secrets Manager adds ESO, Terraform, API support","Simplify credential management across your stack. GitLab Secrets Manager provides secure retrieval in Kubernetes, Terraform, and external workflows.","2026-08-06",[1366,1367],"Erick Bajao","Joe Randazzo","gitlab-secrets-manager-add-eso-terraform-api-support",{"title":1370,"description":1371,"heroImage":1372,"category":623,"date":1373,"authors":1374,"slug":1376,"externalUrl":627},"Secure every commit to production with Claude and GitLab","Claude Security catches vulnerabilities inside a coding session. GitLab picks up from there, scanning, enforcing policy, and producing audit evidence for the software lifecycle. ","https://res.cloudinary.com/about-gitlab-com/image/upload/v1756122536/akivvcnafog9c4dhhzkp.png","2026-08-03",[1375],"Alisa Ho","claude-security-and-gitlab",{"promotions":1378},[1379,1393,1405,1416],{"id":1380,"categories":1381,"header":1383,"text":1384,"button":1385,"image":1390},"ai-modernization",[1382],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1386,"config":1387},"Get your AI maturity score",{"href":1388,"dataGaName":1389,"dataGaLocation":855},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1391},{"src":1392},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1394,"categories":1395,"header":1397,"text":1384,"button":1398,"image":1402},"devops-modernization",[1396,1191],"product","Are you just managing tools or shipping innovation?",{"text":1399,"config":1400},"Get your DevOps maturity score",{"href":1401,"dataGaName":1389,"dataGaLocation":855},"/assessments/devops-modernization-assessment/",{"config":1403},{"src":1404},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1406,"categories":1407,"header":1408,"text":1384,"button":1409,"image":1413},"security-modernization",[623],"Are you trading speed for security?",{"text":1410,"config":1411},"Get your security maturity score",{"href":1412,"dataGaName":1389,"dataGaLocation":855},"/assessments/security-modernization-assessment/",{"config":1414},{"src":1415},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1417,"paths":1418,"header":1421,"text":1422,"button":1423,"image":1428},"github-azure-migration",[1419,1420],"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":1424,"config":1425},"See how GitLab compares to GitHub",{"href":1426,"dataGaName":1427,"dataGaLocation":855},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1429},{"src":1404},{"header":1431,"blurb":1432,"button":1433,"secondaryButton":1438},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1434,"config":1435},"Get your free trial",{"href":1436,"dataGaName":655,"dataGaLocation":1437},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1127,"config":1439},{"href":979,"dataGaName":660,"dataGaLocation":1437},1786803735695]