[{"data":1,"prerenderedAt":1233},["ShallowReactive",2],{"/blog/demystifying-ci-cd-variables":3,"navigation-en-us":446,"banner-en-us":873,"footer-en-us":883,"blog-post-authors-en-us-Veethika Mishra":1128,"blog-related-posts-en-us-demystifying-ci-cd-variables":1143,"blog-promotions-en-us":1169,"next-steps-en-us":1223},{"id":4,"title":5,"authors":6,"body":8,"category":421,"date":422,"description":423,"extension":424,"externalUrl":425,"faq":425,"featured":426,"heroImage":427,"meta":428,"navigation":429,"path":430,"seo":431,"slug":435,"stem":436,"tags":437,"template":443,"updatedDate":444,"__hash__":445},"blogPosts/en-us/blog/demystifying-ci-cd-variables.md","GitLab environment variables demystified",[7],"Veethika Mishra",{"type":9,"value":10,"toc":405},"minimark",[11,27,44,58,65,70,79,82,91,95,101,108,114,118,133,137,146,150,156,159,222,229,244,248,257,261,267,270,279,285,291,294,310,334,338,341,357,366,370,379,383,392,401],[12,13,14,15,21,22,26],"p",{},"There is a lot of flexibility when it comes to defining and using variables for ",[16,17,20],"a",{"href":18,"rel":19},"https://about.gitlab.com/topics/ci-cd/",[],"CI/CD",". Variables are extremely useful for controlling jobs and pipelines, and they help you avoid hard-coding values in your ",[23,24,25],"code",{},".gitlab-ci.yml"," configuration file. The information in this post should weave a larger picture by bringing together all (or most) of the information around defining and handling variables, making it easier to understand the scope and capabilities. Relevant documentation is linked throughout the post.",[12,28,29,30,35,36,40,41,43],{},"In ",[16,31,34],{"href":32,"rel":33},"https://docs.gitlab.com/ci/",[],"GitLab CI/CD",", variables can be used to customize jobs by defining and storing values. When using variables there is no need to hard code values. In GitLab, CI/CD variables can be defined by going to ",[37,38,39],"strong",{},"Settings >> CI/CD >> Variables",", or by simply defining them in the ",[23,42,25],{}," file.",[12,45,46,47,50,51,50,54,57],{},"Variables are useful for configuring third-party services for different deployment environments, such as ",[23,48,49],{},"testing",", ",[23,52,53],{},"staging",[23,55,56],{},"production",", etc. Modify the services attached to those environments by simply changing the variable that points to the API endpoint the services need to use. Also use variables to configure jobs and then make them available as environment variables within the jobs when they run.",[12,59,60],{},[61,62],"img",{"alt":63,"src":64},"GitLab reads the .gitlab-ci.yml file to scan the referenced variable and sends the information to the GitLab Runner. The variables are exposed on and output by the runner.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398147/blog/Content%20Images/demystifying-ci-cd-variables/variables_processing.jpg",[66,67,69],"h2",{"id":68},"the-relationship-between-variables-and-environments","The relationship between variables and environments",[12,71,72,73,78],{},"Software development as a process includes stages to test a product before rolling it out to users. ",[16,74,77],{"href":75,"rel":76},"https://docs.gitlab.com/ci/environments/",[],"Environments"," are used to define what those stages look like and it may differ between teams and organizations.",[12,80,81],{},"On the other hand, variables are data values that are likely to change as a result of user interaction with a product. For example, their age, preference, or any input you could possibly think of that might determine their next step in the product task-flow.",[12,83,84,85,90],{},"We often hear the term ",[16,86,89],{"href":87,"rel":88},"https://docs.gitlab.com/administration/environment_variables/",[],"environment variable",". These are variables that are defined in a given environment, but outside the application. GitLab CI/CD variables provide developers with the ability to configure values in their code. Using variables is helpful because it ensures that the code is flexible. GitLab CI/CD variables allow users to modify an application deployed to a certain environment without making any change to code. It is simple to run tests or even integrate third-party services by changing a configuration environment variable outside the application.",[66,92,94],{"id":93},"the-scope-of-variables-for-cicd","The scope of variables for CI/CD",[12,96,97],{},[61,98],{"alt":99,"src":100},"Order of precedence for CI/CD variables: 1) Manual pipeline run, trigger and schedule pipeline variables, 2) Project level, group level, instance level protected variables, 3) Inherited CI/CD variables, 4) Job level, global yml defined variables, 5) Deployment variables, 6) Pre-defined CI/CD variables","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398146/blog/Content%20Images/demystifying-ci-cd-variables/variables_precedence.jpg",[102,103,105,107],"h3",{"id":104},"gitlab-ciyml-defined-variables",[23,106,25],{}," defined variables",[12,109,110,111,113],{},"Variables that need to be available in the job environment can be added to GitLab. These CI/CD variables are meant to store non-sensitive project configuration, like the database URL in the ",[23,112,25],{}," file. Reuse this variable in multiple jobs or scripts, wherever the value is needed. If the value changes, you only need to update the variable once, and the change is reflected everywhere the variable is used.",[102,115,117],{"id":116},"project-cicd-variables","Project CI/CD variables",[12,119,120,121,126,127,129,130,132],{},"Moving a step above the repository-specific requirements, you can define CI/CD variables in ",[16,122,125],{"href":123,"rel":124},"https://docs.gitlab.com/ci/variables/#for-a-project",[],"project settings",", which makes them available to CI/CD pipelines. These are stored out of the repository (not in the ",[23,128,25],{}," file), but are still available to use in the CI/CD configuration and scripts. Storing the variables outside the ",[23,131,25],{}," file keeps these values limited to a project-only scope, and not saved in plain text in the project.",[102,134,136],{"id":135},"group-and-instance-cicd-variables","Group and instance CI/CD variables",[12,138,139,140,145],{},"Some variables are relevant at the group level, or even instance level, and could be useful to all projects in a group or instance. Define the variables in the ",[16,141,144],{"href":142,"rel":143},"https://docs.gitlab.com/ci/variables/#for-a-group",[],"group or instance settings"," so all projects within those scopes can use the variables without actually needing to know the value  or having to create the variables for the lower scope. For example, a common value that needs to be updated in multiple projects can be easily managed if it stays up-to-date in a single place. Alternatively, multiple projects could use a specific password without actually needing to know the value of the password itself.",[66,147,149],{"id":148},"jobs-and-pipelines-as-environments","Jobs and pipelines as environments",[12,151,152,153,155],{},"GitLab CI/CD variables, besides being used as environment variables, also work in the scope of the ",[23,154,25],{}," configuration file to configure pipeline behavior, unrelated to any environment. The variables can be stored in the project/group/instance settings and be made available to jobs in pipelines.",[12,157,158],{},"For example:",[160,161,166],"pre",{"className":162,"code":163,"language":164,"meta":165,"style":165},"language-yaml shiki shiki-themes github-light","job:\n  rules:\n    - if: $CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n  script:\n  - echo \"This job ran on the $CI_COMMIT_BRANCH branch.\"\n\n","yaml","",[23,167,168,181,189,205,213],{"__ignoreMap":165},[169,170,173,177],"span",{"class":171,"line":172},"line",1,[169,174,176],{"class":175},"shJU0","job",[169,178,180],{"class":179},"sgsFI",":\n",[169,182,184,187],{"class":171,"line":183},2,[169,185,186],{"class":175},"  rules",[169,188,180],{"class":179},[169,190,192,195,198,201],{"class":171,"line":191},3,[169,193,194],{"class":179},"    - ",[169,196,197],{"class":175},"if",[169,199,200],{"class":179},": ",[169,202,204],{"class":203},"sYBdl","$CI_COMMIT_BRANCH == $CI_DEFAULT_BRANCH\n",[169,206,208,211],{"class":171,"line":207},4,[169,209,210],{"class":175},"  script",[169,212,180],{"class":179},[169,214,216,219],{"class":171,"line":215},5,[169,217,218],{"class":179},"  - ",[169,220,221],{"class":203},"echo \"This job ran on the $CI_COMMIT_BRANCH branch.\"\n",[12,223,224,225,228],{},"The variable ",[23,226,227],{},"($CI_COMMIT_BRANCH)"," in the script section runs in the scope of the job in which it was defined. This scope is the \"job environment\" – meaning, when the job starts, the GitLab runner starts up a Docker container and runs the job in that environment. The runner will make that variable (and all other predefined or custom variables) available to the job, and it can display their value in the log output if needed.",[12,230,231,232,235,236,239,240,243],{},"But the variable is ",[37,233,234],{},"also"," used in the ",[23,237,238],{},"if:"," section to determine when the job should run. That in itself is not an environment, which is why we call these CI/CD variables. They can be used to dynamically configure your CI/CD jobs, ",[37,241,242],{},"as well"," as be used as environment variables when the job is running.",[66,245,247],{"id":246},"predefined-variables","Predefined variables",[12,249,250,251,256],{},"A number of variables are ",[16,252,255],{"href":253,"rel":254},"https://docs.gitlab.com/ci/variables/predefined_variables/",[],"predefined"," when a GitLab CI/CD pipeline starts. A user can immediately access values for things like commit, project, or pipeline details without needing to define the variables themselves.",[66,258,260],{"id":259},"custom-cicd-variables","Custom CI/CD variables",[12,262,263],{},[61,264],{"alt":265,"src":266},"Runners can create two kinds of custom CI/CD variables: Type and File.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398145/blog/Content%20Images/demystifying-ci-cd-variables/variable_types.jpg",[12,268,269],{},"When creating a CI/CD variable in the settings, GitLab gives the user more configuration options for the variable. Use these extra configuration options for stricter control over more sensitive variables:",[12,271,272,275,276,278],{},[37,273,274],{},"Environment scope:"," If a variable only ever needs to be used in one specific environment, set it to only ever be available in that environment. For example, you can set a deploy token to only be available in the ",[23,277,56],{}," environment.",[12,280,281,284],{},[37,282,283],{},"Protected variables:"," Similar to the environment scope, you can set a variable to be available only when the pipeline runs on a protected branch, like your default branch.",[12,286,287,290],{},[37,288,289],{},"Variable type:"," A few applications require configuration to be passed to it in the form of a file. If a user has an application that requires this configuration, just set the type of variable as a \"File\". Configuring the CI/CD variable this way means that when the runner makes the variable available in the environment, it actually writes it out to a temporary file, and stores the path to the file as the value. Next, a user can pass the path to the file to any applications that need it.",[12,292,293],{},"Along with the listed ways of defining and using variables, GitLab introduced a feature that generates pre-filled variables when there's a need to run a pipeline manually. Prefilled variables reduce the chances of running into an error and makes running the pipeline easier.",[12,295,296,299,300,305,306,309],{},[37,297,298],{},"Masked variables:"," ",[16,301,304],{"href":302,"rel":303},"https://docs.gitlab.com/ci/variables/#mask-a-cicd-variable",[],"Masked variables"," are CI variables that have been ",[37,307,308],{},"hidden in job logs"," to prevent the variable’s value from being displayed.",[12,311,312,315,316,50,321,326,327,299,330,333],{},[37,313,314],{},"Masked and hidden variables:"," Introduced in ",[16,317,320],{"href":318,"rel":319},"https://docs.gitlab.com/releases/17/gitlab-17-4-released/#hide-cicd-variable-values-in-the-ui",[],"GitLab 17.4",[16,322,325],{"href":323,"rel":324},"https://docs.gitlab.com/ci/variables/#hide-a-cicd-variable",[],"Masked and hidden"," variables provide the same masking feature from job logs and ",[37,328,329],{},"keep the value hidden",[37,331,332],{},"in the Settings UI",". We do not recommend using either of these variables for sensitive data (e.g. secrets) as they can be inadvertently exposed.",[66,335,337],{"id":336},"secrets","Secrets",[12,339,340],{},"A secret is a sensitive credential that should be kept confidential. Examples of a secret include:",[342,343,344,348,351,354],"ul",{},[345,346,347],"li",{},"Passwords",[345,349,350],{},"SSH keys",[345,352,353],{},"Access tokens",[345,355,356],{},"Any other types of credentials where exposure would be harmful to an organization",[12,358,359,360,365],{},"GitLab currently enables its users to ",[16,361,364],{"href":362,"rel":363},"https://docs.gitlab.com/ci/secrets/",[],"use external secrets in CI",", by leveraging HashiCorp Vault, Google Cloud Secret Manager, and Azure Key Vault to securely manage keys, tokens, and other secrets at the project level. This allows users to separate these secrets from other CI/CD variables for security reasons.",[102,367,369],{"id":368},"gitlab-secrets-manager","GitLab Secrets Manager",[12,371,372,373,378],{},"Besides providing support for external secrets in CI, GitLab is also working on introducing a ",[16,374,377],{"href":375,"rel":376},"https://gitlab.com/groups/gitlab-org/-/epics/10108",[],"native solution to secrets management"," to securely and conveniently store secrets within GitLab. This solution will also help customers use the stored secrets in GitLab specific components and environments, and easily manage access at namespace groups and projects level.",[66,380,382],{"id":381},"read-more","Read more",[342,384,385],{},[345,386,387],{},[16,388,391],{"href":389,"rel":390},"https://about.gitlab.com/blog/gitlab-native-secrets-manager-to-give-software-supply-chain-security-a-boost/",[],"GitLab native secrets manager to give software supply chain security a boost",[12,393,394],{},[395,396,397,400],"em",{},[37,398,399],{},"Disclaimer:"," This blog contains information related to upcoming products, features, and functionality. It is important to note that the information in this blog post is for informational purposes only. Please do not rely on this information for purchasing or planning purposes. As with all projects, the items mentioned in this blog and linked pages are subject to change or delay. The development, release, and timing of any products, features, or functionality remain at the sole discretion of GitLab.",[402,403,404],"style",{},"html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .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);}",{"title":165,"searchDepth":183,"depth":183,"links":406},[407,408,414,415,416,417,420],{"id":68,"depth":183,"text":69},{"id":93,"depth":183,"text":94,"children":409},[410,412,413],{"id":104,"depth":191,"text":411},".gitlab-ci.yml defined variables",{"id":116,"depth":191,"text":117},{"id":135,"depth":191,"text":136},{"id":148,"depth":183,"text":149},{"id":246,"depth":183,"text":247},{"id":259,"depth":183,"text":260},{"id":336,"depth":183,"text":337,"children":418},[419],{"id":368,"depth":191,"text":369},{"id":381,"depth":183,"text":382},"engineering","2021-04-09","CI/CD variables are useful (and flexible) tools to control jobs and pipelines. We unpack everything you need to know about GitLab environment variables.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664679/Blog/Hero%20Images/blog-image-template-1800x945__24_.png",{},true,"/en-us/blog/demystifying-ci-cd-variables",{"title":5,"description":423,"ogTitle":5,"ogDescription":423,"noIndex":426,"ogImage":427,"ogUrl":432,"ogSiteName":433,"ogType":434,"canonicalUrls":432},"https://about.gitlab.com/blog/demystifying-ci-cd-variables","https://about.gitlab.com","article","demystifying-ci-cd-variables","en-us/blog/demystifying-ci-cd-variables",[438,439,440,441,20,442],"CD","features","inside GitLab","CI","tutorial","BlogPost","2025-01-13","H6mpxREgnDYli6icd2Kb64DhLHsbJyYPb4vbsq2oWF4",{"logo":447,"freeTrial":452,"sales":457,"login":462,"items":467,"search":793,"minimal":824,"duo":843,"switchNav":852,"pricingDeployment":863},{"config":448},{"href":449,"dataGaName":450,"dataGaLocation":451},"/","gitlab logo","header",{"text":453,"config":454},"Get free trial",{"href":455,"dataGaName":456,"dataGaLocation":451},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":458,"config":459},"Request a demo",{"href":460,"dataGaName":461,"dataGaLocation":451},"/sales/?contact-topic=request-demo","sales",{"text":463,"config":464},"Sign in",{"href":465,"dataGaName":466,"dataGaLocation":451},"https://gitlab.com/users/sign_in/","sign in",[468,497,596,601,715,771],{"text":469,"config":470,"menu":472},"Platform",{"dataNavLevelOne":471},"platform",{"type":473,"columns":474},"cards",[475,481,489],{"title":469,"description":476,"link":477},"The intelligent orchestration platform for DevSecOps",{"text":478,"config":479},"Explore our Platform",{"href":480,"dataGaName":471,"dataGaLocation":451},"/platform/",{"title":482,"description":483,"link":484},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":485,"config":486},"Meet GitLab Duo",{"href":487,"dataGaName":488,"dataGaLocation":451},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":490,"description":491,"link":492},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":493,"config":494},"Learn more",{"href":495,"dataGaName":496,"dataGaLocation":451},"/why-gitlab/","why gitlab",{"text":498,"left":429,"config":499,"menu":501},"Product",{"dataNavLevelOne":500},"solutions",{"type":502,"link":503,"columns":507,"feature":575},"lists",{"text":504,"config":505},"View all Solutions",{"href":506,"dataGaName":500,"dataGaLocation":451},"/solutions/",[508,531,554],{"title":509,"description":510,"link":511,"items":516},"Automation","CI/CD and automation to accelerate deployment",{"config":512},{"icon":513,"href":514,"dataGaName":515,"dataGaLocation":451},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[517,520,523,527],{"text":20,"config":518},{"href":519,"dataGaLocation":451,"dataGaName":20},"/solutions/continuous-integration/",{"text":482,"config":521},{"href":487,"dataGaLocation":451,"dataGaName":522},"gitlab duo agent platform - product menu",{"text":524,"config":525},"Source Code Management",{"href":526,"dataGaLocation":451,"dataGaName":524},"/solutions/source-code-management/",{"text":528,"config":529},"Automated Software Delivery",{"href":514,"dataGaLocation":451,"dataGaName":530},"Automated software delivery",{"title":532,"description":533,"link":534,"items":539},"Security","Deliver code faster without compromising security",{"config":535},{"href":536,"dataGaName":537,"dataGaLocation":451,"icon":538},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[540,544,549],{"text":541,"config":542},"Application Security Testing",{"href":536,"dataGaName":543,"dataGaLocation":451},"Application security testing",{"text":545,"config":546},"Software Supply Chain Security",{"href":547,"dataGaLocation":451,"dataGaName":548},"/solutions/supply-chain/","Software supply chain security",{"text":550,"config":551},"Software Compliance",{"href":552,"dataGaName":553,"dataGaLocation":451},"/solutions/software-compliance/","software compliance",{"title":555,"link":556,"items":561},"Measurement",{"config":557},{"icon":558,"href":559,"dataGaName":560,"dataGaLocation":451},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[562,566,570],{"text":563,"config":564},"Visibility & Measurement",{"href":559,"dataGaLocation":451,"dataGaName":565},"Visibility and Measurement",{"text":567,"config":568},"Value Stream Management",{"href":569,"dataGaLocation":451,"dataGaName":567},"/solutions/value-stream-management/",{"text":571,"config":572},"Analytics & Insights",{"href":573,"dataGaLocation":451,"dataGaName":574},"/solutions/analytics-and-insights/","Analytics and insights",{"title":576,"type":502,"items":577},"GitLab for",[578,584,590],{"text":579,"config":580},"Enterprise",{"icon":581,"href":582,"dataGaLocation":451,"dataGaName":583},"Building","/enterprise/","enterprise",{"text":585,"config":586},"Small Business",{"icon":587,"href":588,"dataGaLocation":451,"dataGaName":589},"Work","/small-business/","small business",{"text":591,"config":592},"Public Sector",{"icon":593,"href":594,"dataGaLocation":451,"dataGaName":595},"Organization","/solutions/public-sector/","public sector",{"text":597,"config":598},"Pricing",{"href":599,"dataGaName":600,"dataGaLocation":451,"dataNavLevelOne":600},"/pricing/","pricing",{"text":602,"config":603,"menu":605},"Resources",{"dataNavLevelOne":604},"resources",{"type":502,"link":606,"columns":610,"feature":704},{"text":607,"config":608},"View all resources",{"href":609,"dataGaName":604,"dataGaLocation":451},"/resources/",[611,644,671],{"title":612,"items":613},"Getting started",[614,619,624,629,634,639],{"text":615,"config":616},"Install",{"href":617,"dataGaName":618,"dataGaLocation":451},"/install/","install",{"text":620,"config":621},"Quick start guides",{"href":622,"dataGaName":623,"dataGaLocation":451},"/get-started/","quick setup checklists",{"text":625,"config":626},"Learn",{"href":627,"dataGaLocation":451,"dataGaName":628},"https://university.gitlab.com/","learn",{"text":630,"config":631},"Product documentation",{"href":632,"dataGaName":633,"dataGaLocation":451},"https://docs.gitlab.com/","product documentation",{"text":635,"config":636},"Best practice videos",{"href":637,"dataGaName":638,"dataGaLocation":451},"/getting-started-videos/","best practice videos",{"text":640,"config":641},"Integrations",{"href":642,"dataGaName":643,"dataGaLocation":451},"/integrations/","integrations",{"title":645,"items":646},"Discover",[647,652,657,662,666],{"text":648,"config":649},"Customer success stories",{"href":650,"dataGaName":651,"dataGaLocation":451},"/customers/","customer success stories",{"text":653,"config":654},"Blog",{"href":655,"dataGaName":656,"dataGaLocation":451},"/blog/","blog",{"text":658,"config":659},"Demo Hub",{"href":660,"dataGaName":661,"dataGaLocation":451},"/demo-hub/","demo hub",{"text":663,"config":664},"The Source",{"href":665,"dataGaName":656,"dataGaLocation":451},"/the-source/",{"text":667,"config":668},"Remote",{"href":669,"dataGaName":670,"dataGaLocation":451},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":672,"items":673},"Connect",[674,679,684,689,694,699],{"text":675,"config":676},"GitLab Services",{"href":677,"dataGaName":678,"dataGaLocation":451},"/services/","services",{"text":680,"config":681},"Contribute",{"href":682,"dataGaName":683,"dataGaLocation":451},"https://contributors.gitlab.com","contribute",{"text":685,"config":686},"Community",{"href":687,"dataGaName":688,"dataGaLocation":451},"/community/","community",{"text":690,"config":691},"Forum",{"href":692,"dataGaName":693,"dataGaLocation":451},"https://forum.gitlab.com/","forum",{"text":695,"config":696},"Events",{"href":697,"dataGaName":698,"dataGaLocation":451},"/events/","events",{"text":700,"config":701},"Partners",{"href":702,"dataGaName":703,"dataGaLocation":451},"/partners/","partners",{"config":705,"title":708,"text":709,"link":710},{"background":706,"textColor":707},"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":711,"config":712},"Read the latest",{"href":713,"dataGaName":714,"dataGaLocation":451},"/whats-new/","whats new",{"text":716,"config":717,"menu":719},"Company",{"dataNavLevelOne":718},"company",{"type":502,"columns":720},[721],{"items":722},[723,728,734,736,741,746,751,756,761,766],{"text":724,"config":725},"About",{"href":726,"dataGaName":727,"dataGaLocation":451},"/company/","about",{"text":729,"config":730,"footerGa":733},"Jobs",{"href":731,"dataGaName":732,"dataGaLocation":451},"/jobs/","jobs",{"dataGaName":732},{"text":695,"config":735},{"href":697,"dataGaName":698,"dataGaLocation":451},{"text":737,"config":738},"Leadership",{"href":739,"dataGaName":740,"dataGaLocation":451},"/company/team/e-group/","leadership",{"text":742,"config":743},"Handbook",{"href":744,"dataGaName":745,"dataGaLocation":451},"https://handbook.gitlab.com/","handbook",{"text":747,"config":748},"Investor relations",{"href":749,"dataGaName":750,"dataGaLocation":451},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":752,"config":753},"Trust Center",{"href":754,"dataGaName":755,"dataGaLocation":451},"/security/","trust center",{"text":757,"config":758},"AI Transparency Center",{"href":759,"dataGaName":760,"dataGaLocation":451},"/ai-transparency-center/","ai transparency center",{"text":762,"config":763},"Newsletter",{"href":764,"dataGaName":765,"dataGaLocation":451},"/company/contact/#contact-forms","newsletter",{"text":767,"config":768},"Press",{"href":769,"dataGaName":770,"dataGaLocation":451},"/press/","press",{"text":772,"config":773,"menu":774},"Contact us",{"dataNavLevelOne":718},{"type":502,"columns":775},[776],{"items":777},[778,783,788],{"text":779,"config":780},"Talk to sales",{"href":781,"dataGaName":782,"dataGaLocation":451},"/sales/","talk to sales",{"text":784,"config":785},"Support portal",{"href":786,"dataGaName":787,"dataGaLocation":451},"https://support.gitlab.com/hc/en-us","support portal",{"text":789,"config":790},"Customer portal",{"href":791,"dataGaName":792,"dataGaLocation":451},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":794,"login":795,"suggestions":802},"Close",{"text":796,"link":797},"To search repositories and projects, login to",{"text":798,"config":799},"gitlab.com",{"href":465,"dataGaName":800,"dataGaLocation":801},"search login","search",{"text":803,"default":804},"Suggestions",[805,807,811,813,817,821],{"text":482,"config":806},{"href":487,"dataGaName":482,"dataGaLocation":801},{"text":808,"config":809},"Code Suggestions (AI)",{"href":810,"dataGaName":808,"dataGaLocation":801},"/solutions/code-suggestions/",{"text":20,"config":812},{"href":519,"dataGaName":20,"dataGaLocation":801},{"text":814,"config":815},"GitLab on AWS",{"href":816,"dataGaName":814,"dataGaLocation":801},"/partners/technology-partners/aws/",{"text":818,"config":819},"GitLab on Google Cloud",{"href":820,"dataGaName":818,"dataGaLocation":801},"/partners/technology-partners/google-cloud-platform/",{"text":822,"config":823},"Why GitLab?",{"href":495,"dataGaName":822,"dataGaLocation":801},{"freeTrial":825,"mobileIcon":830,"desktopIcon":835,"secondaryButton":838},{"text":826,"config":827},"Start free trial",{"href":828,"dataGaName":456,"dataGaLocation":829},"https://gitlab.com/-/trials/new/","nav",{"altText":831,"config":832},"Gitlab Icon",{"src":833,"dataGaName":834,"dataGaLocation":829},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":831,"config":836},{"src":837,"dataGaName":834,"dataGaLocation":829},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":839,"config":840},"Get Started",{"href":841,"dataGaName":842,"dataGaLocation":829},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":844,"mobileIcon":848,"desktopIcon":850},{"text":845,"config":846},"Learn more about GitLab Duo",{"href":487,"dataGaName":847,"dataGaLocation":829},"gitlab duo",{"altText":831,"config":849},{"src":833,"dataGaName":834,"dataGaLocation":829},{"altText":831,"config":851},{"src":837,"dataGaName":834,"dataGaLocation":829},{"button":853,"mobileIcon":858,"desktopIcon":860},{"text":854,"config":855},"/switch",{"href":856,"dataGaName":857,"dataGaLocation":829},"#contact","switch",{"altText":831,"config":859},{"src":833,"dataGaName":834,"dataGaLocation":829},{"altText":831,"config":861},{"src":862,"dataGaName":834,"dataGaLocation":829},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":864,"mobileIcon":869,"desktopIcon":871},{"text":865,"config":866},"Back to pricing",{"href":599,"dataGaName":867,"dataGaLocation":829,"icon":868},"back to pricing","GoBack",{"altText":831,"config":870},{"src":833,"dataGaName":834,"dataGaLocation":829},{"altText":831,"config":872},{"src":837,"dataGaName":834,"dataGaLocation":829},{"title":874,"titleMobile":875,"button":876,"config":881},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":493,"config":877},{"href":878,"dataGaName":879,"dataGaLocation":880},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":882,"disabled":426},"release",{"data":884},{"text":885,"source":886,"edit":892,"contribute":897,"config":902,"items":907,"minimal":1117},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":887,"config":888},"View page source",{"href":889,"dataGaName":890,"dataGaLocation":891},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":893,"config":894},"Edit this page",{"href":895,"dataGaName":896,"dataGaLocation":891},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":898,"config":899},"Please contribute",{"href":900,"dataGaName":901,"dataGaLocation":891},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":903,"facebook":904,"youtube":905,"linkedin":906},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[908,955,1009,1053,1085],{"title":597,"links":909,"subMenu":924},[910,914,919],{"text":911,"config":912},"View plans",{"href":599,"dataGaName":913,"dataGaLocation":891},"view plans",{"text":915,"config":916},"Why Premium?",{"href":917,"dataGaName":918,"dataGaLocation":891},"/pricing/premium/","why premium",{"text":920,"config":921},"Why Ultimate?",{"href":922,"dataGaName":923,"dataGaLocation":891},"/pricing/ultimate/","why ultimate",[925],{"title":926,"links":927},"Contact Us",[928,931,933,935,940,945,950],{"text":929,"config":930},"Contact sales",{"href":781,"dataGaName":461,"dataGaLocation":891},{"text":784,"config":932},{"href":786,"dataGaName":787,"dataGaLocation":891},{"text":789,"config":934},{"href":791,"dataGaName":792,"dataGaLocation":891},{"text":936,"config":937},"Status",{"href":938,"dataGaName":939,"dataGaLocation":891},"https://status.gitlab.com/","status",{"text":941,"config":942},"Terms of use",{"href":943,"dataGaName":944,"dataGaLocation":891},"/terms/","terms of use",{"text":946,"config":947},"Privacy statement",{"href":948,"dataGaName":949,"dataGaLocation":891},"/privacy/","privacy statement",{"text":951,"config":952},"Cookie preferences",{"dataGaName":953,"dataGaLocation":891,"id":954,"isOneTrustButton":429},"cookie preferences","ot-sdk-btn",{"title":498,"links":956,"subMenu":965},[957,961],{"text":958,"config":959},"DevSecOps platform",{"href":480,"dataGaName":960,"dataGaLocation":891},"devsecops platform",{"text":962,"config":963},"AI-Assisted Development",{"href":487,"dataGaName":964,"dataGaLocation":891},"ai-assisted development",[966],{"title":967,"links":968},"Topics",[969,974,979,984,989,994,999,1004],{"text":970,"config":971},"CICD",{"href":972,"dataGaName":973,"dataGaLocation":891},"/topics/ci-cd/","cicd",{"text":975,"config":976},"GitOps",{"href":977,"dataGaName":978,"dataGaLocation":891},"/topics/gitops/","gitops",{"text":980,"config":981},"DevOps",{"href":982,"dataGaName":983,"dataGaLocation":891},"/topics/devops/","devops",{"text":985,"config":986},"Version Control",{"href":987,"dataGaName":988,"dataGaLocation":891},"/topics/version-control/","version control",{"text":990,"config":991},"DevSecOps",{"href":992,"dataGaName":993,"dataGaLocation":891},"/topics/devsecops/","devsecops",{"text":995,"config":996},"Cloud Native",{"href":997,"dataGaName":998,"dataGaLocation":891},"/topics/cloud-native/","cloud native",{"text":1000,"config":1001},"AI for Coding",{"href":1002,"dataGaName":1003,"dataGaLocation":891},"/topics/devops/ai-for-coding/","ai for coding",{"text":1005,"config":1006},"Agentic AI",{"href":1007,"dataGaName":1008,"dataGaLocation":891},"/topics/agentic-ai/","agentic ai",{"title":1010,"links":1011},"Solutions",[1012,1014,1016,1021,1025,1028,1032,1035,1037,1040,1043,1048],{"text":541,"config":1013},{"href":536,"dataGaName":541,"dataGaLocation":891},{"text":530,"config":1015},{"href":514,"dataGaName":515,"dataGaLocation":891},{"text":1017,"config":1018},"Agile development",{"href":1019,"dataGaName":1020,"dataGaLocation":891},"/solutions/agile-delivery/","agile delivery",{"text":1022,"config":1023},"SCM",{"href":526,"dataGaName":1024,"dataGaLocation":891},"source code management",{"text":970,"config":1026},{"href":519,"dataGaName":1027,"dataGaLocation":891},"continuous integration & delivery",{"text":1029,"config":1030},"Value stream management",{"href":569,"dataGaName":1031,"dataGaLocation":891},"value stream management",{"text":975,"config":1033},{"href":1034,"dataGaName":978,"dataGaLocation":891},"/solutions/gitops/",{"text":579,"config":1036},{"href":582,"dataGaName":583,"dataGaLocation":891},{"text":1038,"config":1039},"Small business",{"href":588,"dataGaName":589,"dataGaLocation":891},{"text":1041,"config":1042},"Public sector",{"href":594,"dataGaName":595,"dataGaLocation":891},{"text":1044,"config":1045},"Education",{"href":1046,"dataGaName":1047,"dataGaLocation":891},"/solutions/education/","education",{"text":1049,"config":1050},"Financial services",{"href":1051,"dataGaName":1052,"dataGaLocation":891},"/solutions/finance/","financial services",{"title":602,"links":1054},[1055,1057,1059,1061,1064,1066,1069,1071,1073,1075,1077,1079,1081,1083],{"text":615,"config":1056},{"href":617,"dataGaName":618,"dataGaLocation":891},{"text":620,"config":1058},{"href":622,"dataGaName":623,"dataGaLocation":891},{"text":625,"config":1060},{"href":627,"dataGaName":628,"dataGaLocation":891},{"text":630,"config":1062},{"href":632,"dataGaName":1063,"dataGaLocation":891},"docs",{"text":653,"config":1065},{"href":655,"dataGaName":656,"dataGaLocation":891},{"text":1067,"config":1068},"What's new",{"href":713,"dataGaName":714,"dataGaLocation":891},{"text":648,"config":1070},{"href":650,"dataGaName":651,"dataGaLocation":891},{"text":667,"config":1072},{"href":669,"dataGaName":670,"dataGaLocation":891},{"text":675,"config":1074},{"href":677,"dataGaName":678,"dataGaLocation":891},{"text":680,"config":1076},{"href":682,"dataGaName":683,"dataGaLocation":891},{"text":685,"config":1078},{"href":687,"dataGaName":688,"dataGaLocation":891},{"text":690,"config":1080},{"href":692,"dataGaName":693,"dataGaLocation":891},{"text":695,"config":1082},{"href":697,"dataGaName":698,"dataGaLocation":891},{"text":700,"config":1084},{"href":702,"dataGaName":703,"dataGaLocation":891},{"title":716,"links":1086},[1087,1089,1091,1093,1095,1097,1101,1106,1108,1110,1112],{"text":724,"config":1088},{"href":726,"dataGaName":718,"dataGaLocation":891},{"text":729,"config":1090},{"href":731,"dataGaName":732,"dataGaLocation":891},{"text":737,"config":1092},{"href":739,"dataGaName":740,"dataGaLocation":891},{"text":742,"config":1094},{"href":744,"dataGaName":745,"dataGaLocation":891},{"text":747,"config":1096},{"href":749,"dataGaName":750,"dataGaLocation":891},{"text":1098,"config":1099},"Sustainability",{"href":1100,"dataGaName":1098,"dataGaLocation":891},"/sustainability/",{"text":1102,"config":1103},"Diversity, inclusion and belonging (DIB)",{"href":1104,"dataGaName":1105,"dataGaLocation":891},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":752,"config":1107},{"href":754,"dataGaName":755,"dataGaLocation":891},{"text":762,"config":1109},{"href":764,"dataGaName":765,"dataGaLocation":891},{"text":767,"config":1111},{"href":769,"dataGaName":770,"dataGaLocation":891},{"text":1113,"config":1114},"Modern Slavery Transparency Statement",{"href":1115,"dataGaName":1116,"dataGaLocation":891},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1118},[1119,1122,1125],{"text":1120,"config":1121},"Terms",{"href":943,"dataGaName":944,"dataGaLocation":891},{"text":1123,"config":1124},"Cookies",{"dataGaName":953,"dataGaLocation":891,"id":954,"isOneTrustButton":429},{"text":1126,"config":1127},"Privacy",{"href":948,"dataGaName":949,"dataGaLocation":891},[1129],{"id":1130,"title":7,"body":425,"config":1131,"content":1133,"description":425,"extension":1137,"meta":1138,"navigation":429,"path":1139,"seo":1140,"stem":1141,"__hash__":1142},"blogAuthors/en-us/blog/authors/veethika-mishra.yml",{"template":1132},"BlogAuthor",{"name":7,"config":1134},{"headshot":1135,"ctfId":1136},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664676/Blog/Author%20Headshots/veethika-headshot.jpg","veethika","yml",{},"/en-us/blog/authors/veethika-mishra",{},"en-us/blog/authors/veethika-mishra","avkx2hzdTVpCmkhh26RGfXRkuPdPQWwSTuPDuHtSjSQ",[1144,1153,1161],{"title":1145,"description":1146,"heroImage":1147,"category":421,"date":1148,"authors":1149,"slug":1152,"externalUrl":425},"Confidential AI for GitLab Self-Hosted","Give developers AI coding agents in GitLab Duo without source code leaving a hardware-encrypted boundary — no GPUs needed.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png","2026-08-06",[1150,1151],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1154,"description":1155,"heroImage":1156,"category":421,"date":1157,"authors":1158,"slug":1160,"externalUrl":425},"Green DevOps: Why carbon measurement belongs in your CI/CD pipeline","CI/CD pipelines have a hidden carbon cost. Here's why measuring it matters, and how you can get started with Eco CI and Carmen in GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-07-09",[1159],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1162,"description":1163,"heroImage":1164,"category":421,"date":1165,"authors":1166,"slug":1168,"externalUrl":425},"How to build CI/CD observability at scale","This practical guide to GitLab pipeline analytics helps self-managed users gain operational insights using Prometheus and Grafana.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-04-28",[1167],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1170},[1171,1185,1197,1209],{"id":1172,"categories":1173,"header":1175,"text":1176,"button":1177,"image":1182},"ai-modernization",[1174],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1178,"config":1179},"Get your AI maturity score",{"href":1180,"dataGaName":1181,"dataGaLocation":656},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1183},{"src":1184},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1186,"categories":1187,"header":1189,"text":1176,"button":1190,"image":1194},"devops-modernization",[1188,993],"product","Are you just managing tools or shipping innovation?",{"text":1191,"config":1192},"Get your DevOps maturity score",{"href":1193,"dataGaName":1181,"dataGaLocation":656},"/assessments/devops-modernization-assessment/",{"config":1195},{"src":1196},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1198,"categories":1199,"header":1201,"text":1176,"button":1202,"image":1206},"security-modernization",[1200],"security","Are you trading speed for security?",{"text":1203,"config":1204},"Get your security maturity score",{"href":1205,"dataGaName":1181,"dataGaLocation":656},"/assessments/security-modernization-assessment/",{"config":1207},{"src":1208},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1210,"paths":1211,"header":1214,"text":1215,"button":1216,"image":1221},"github-azure-migration",[1212,1213],"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":1217,"config":1218},"See how GitLab compares to GitHub",{"href":1219,"dataGaName":1220,"dataGaLocation":656},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1222},{"src":1196},{"header":1224,"blurb":1225,"button":1226,"secondaryButton":1231},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1227,"config":1228},"Get your free trial",{"href":1229,"dataGaName":456,"dataGaLocation":1230},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":929,"config":1232},{"href":781,"dataGaName":461,"dataGaLocation":1230},1786803748396]