[{"data":1,"prerenderedAt":1294},["ShallowReactive",2],{"/blog/protecting-manual-jobs":3,"navigation-en-us":509,"banner-en-us":936,"footer-en-us":946,"blog-post-authors-en-us-Thao Yeager":1190,"blog-related-posts-en-us-protecting-manual-jobs":1204,"blog-promotions-en-us":1230,"next-steps-en-us":1284},{"id":4,"title":5,"authors":6,"body":8,"category":486,"date":487,"description":488,"extension":489,"externalUrl":490,"faq":490,"featured":491,"heroImage":492,"meta":493,"navigation":224,"path":494,"seo":495,"slug":499,"stem":500,"tags":501,"template":507,"updatedDate":490,"__hash__":508},"blogPosts/en-us/blog/protecting-manual-jobs.md","How to limit access to manual pipeline gates and deployments using GitLab",[7],"Thao Yeager",{"type":9,"value":10,"toc":481},"minimark",[11,15,23,28,38,53,163,180,184,187,424,440,447,451,454,463,477],[12,13,14],"p",{},"This blog post was originally published on the GitLab Unfiltered blog. It was reviewed and republished on 2020-02-21.",[12,16,17,18,22],{},"In our world of automation, why would anyone want to do something manually? Manual has become almost synonymous with inefficient. But, when it comes to CI/CD pipelines, a properly configured ",[19,20,21],"strong",{},"manual"," job can be a powerful way to control deployments and satisfy compliance requirements. Let’s take a look at how manual jobs can be defined to serve two important use cases: Controlling who can deploy, and setting up manual gates.",[24,25,27],"h2",{"id":26},"limit-access-to-deploy-to-an-environment","Limit access to deploy to an environment",[12,29,30,31,37],{},"Deploying to production is a mission-critical occurence that should be protected. Projects with a Kubernetes cluster could benefit from moving to a continuous deployment (CD) model in which a ",[32,33,36],"a",{"href":34,"rel":35},"https://docs.gitlab.com/topics/autodevops/#auto-deploy",[],"branch or merge request, once merged, is auto-deployed to production",", and the absence of human intervention avoids mishaps. But for projects not yet configured for CD, let's consider this use case: Imagine a pipeline with a manual job to deploy to prod, which can be triggered by any user with access to push code. The risk of a unplanned, unintended production deployment is very real.",[12,39,40,41,46,47,52],{},"Fortunately, it’s possible to use ",[32,42,45],{"href":43,"rel":44},"https://docs.gitlab.com/ci/environments/protected_environments/",[],"protected environments"," to prevent just anyone from deploying to production. When ",[32,48,51],{"href":49,"rel":50},"https://docs.gitlab.com/ci/environments/protected_environments/#protecting-environments",[],"configuring a protected environment",", you can define the roles, groups, or users to whom deploy access is granted. The protected environment can then be defined in a manual job to deploy which limits who can run it. The configuration could look something like this:",[54,55,60],"pre",{"className":56,"code":57,"language":58,"meta":59,"style":59},"language-yaml shiki shiki-themes github-light","deploy_prod:\n  stage: deploy\n  script:\n    - echo \"Deploy to production server\"\n  environment:\n    name: production\n    url: https://example.com\n  when: manual\n  only:\n    - master\n\n","yaml","",[61,62,63,76,89,97,106,114,125,136,147,155],"code",{"__ignoreMap":59},[64,65,68,72],"span",{"class":66,"line":67},"line",1,[64,69,71],{"class":70},"shJU0","deploy_prod",[64,73,75],{"class":74},"sgsFI",":\n",[64,77,79,82,85],{"class":66,"line":78},2,[64,80,81],{"class":70},"  stage",[64,83,84],{"class":74},": ",[64,86,88],{"class":87},"sYBdl","deploy\n",[64,90,92,95],{"class":66,"line":91},3,[64,93,94],{"class":70},"  script",[64,96,75],{"class":74},[64,98,100,103],{"class":66,"line":99},4,[64,101,102],{"class":74},"    - ",[64,104,105],{"class":87},"echo \"Deploy to production server\"\n",[64,107,109,112],{"class":66,"line":108},5,[64,110,111],{"class":70},"  environment",[64,113,75],{"class":74},[64,115,117,120,122],{"class":66,"line":116},6,[64,118,119],{"class":70},"    name",[64,121,84],{"class":74},[64,123,124],{"class":87},"production\n",[64,126,128,131,133],{"class":66,"line":127},7,[64,129,130],{"class":70},"    url",[64,132,84],{"class":74},[64,134,135],{"class":87},"https://example.com\n",[64,137,139,142,144],{"class":66,"line":138},8,[64,140,141],{"class":70},"  when",[64,143,84],{"class":74},[64,145,146],{"class":87},"manual\n",[64,148,150,153],{"class":66,"line":149},9,[64,151,152],{"class":70},"  only",[64,154,75],{"class":74},[64,156,158,160],{"class":66,"line":157},10,[64,159,102],{"class":74},[64,161,162],{"class":87},"master\n",[12,164,165,166,169,170,175,176,179],{},"In the example above, the keyword ",[61,167,168],{},"environment"," is used to reference a protected environment (as ",[32,171,174],{"href":172,"rel":173},"https://docs.gitlab.com/ci/environments/protected_environments/#protecting-environment",[],"configured in project settings",") with a list of users who can run the job, in this case deploy to the named environment. Users without access see a disabled ",[19,177,178],{},"play"," button and are unable to execute the job.",[24,181,183],{"id":182},"add-an-approval-step","Add an approval step",[12,185,186],{},"Compliance rules may specify that approval is required for certain activities in a workflow, even if they aren't technically a deployment step themselves. In this use case, an approval step can also be added in the pipeline that prompts an authorized user to take action to continue. This can be achieved by structuring your pipeline with an \"approve\" stage containing a special manual job – for example, the YAML to insert an approval stage before deployment could look like this:",[54,188,190],{"className":56,"code":189,"language":58,"meta":59,"style":59},"stages:\n  - build\n  - approve\n  - deploy\n\nbuild:\n  stage: build\n  script:\n    - echo Hello!\n\napprove:\n  stage: approve\n  script:\n    - echo Hello!\n  environment:\n    name: production\n    url: https://example.com\n  when: manual\n  allow_failure: false\n  only:\n    - master\n\ndeploy:\n  stage: deploy\n  script:\n    - echo Hello!\n  environment:\n    name: production\n    url: https://example.com\n  only:\n    - master\n\n",[61,191,192,199,207,214,220,226,233,241,247,254,258,266,275,282,289,296,305,314,323,335,342,349,354,362,371,378,385,392,401,410,417],{"__ignoreMap":59},[64,193,194,197],{"class":66,"line":67},[64,195,196],{"class":70},"stages",[64,198,75],{"class":74},[64,200,201,204],{"class":66,"line":78},[64,202,203],{"class":74},"  - ",[64,205,206],{"class":87},"build\n",[64,208,209,211],{"class":66,"line":91},[64,210,203],{"class":74},[64,212,213],{"class":87},"approve\n",[64,215,216,218],{"class":66,"line":99},[64,217,203],{"class":74},[64,219,88],{"class":87},[64,221,222],{"class":66,"line":108},[64,223,225],{"emptyLinePlaceholder":224},true,"\n",[64,227,228,231],{"class":66,"line":116},[64,229,230],{"class":70},"build",[64,232,75],{"class":74},[64,234,235,237,239],{"class":66,"line":127},[64,236,81],{"class":70},[64,238,84],{"class":74},[64,240,206],{"class":87},[64,242,243,245],{"class":66,"line":138},[64,244,94],{"class":70},[64,246,75],{"class":74},[64,248,249,251],{"class":66,"line":149},[64,250,102],{"class":74},[64,252,253],{"class":87},"echo Hello!\n",[64,255,256],{"class":66,"line":157},[64,257,225],{"emptyLinePlaceholder":224},[64,259,261,264],{"class":66,"line":260},11,[64,262,263],{"class":70},"approve",[64,265,75],{"class":74},[64,267,269,271,273],{"class":66,"line":268},12,[64,270,81],{"class":70},[64,272,84],{"class":74},[64,274,213],{"class":87},[64,276,278,280],{"class":66,"line":277},13,[64,279,94],{"class":70},[64,281,75],{"class":74},[64,283,285,287],{"class":66,"line":284},14,[64,286,102],{"class":74},[64,288,253],{"class":87},[64,290,292,294],{"class":66,"line":291},15,[64,293,111],{"class":70},[64,295,75],{"class":74},[64,297,299,301,303],{"class":66,"line":298},16,[64,300,119],{"class":70},[64,302,84],{"class":74},[64,304,124],{"class":87},[64,306,308,310,312],{"class":66,"line":307},17,[64,309,130],{"class":70},[64,311,84],{"class":74},[64,313,135],{"class":87},[64,315,317,319,321],{"class":66,"line":316},18,[64,318,141],{"class":70},[64,320,84],{"class":74},[64,322,146],{"class":87},[64,324,326,329,331],{"class":66,"line":325},19,[64,327,328],{"class":70},"  allow_failure",[64,330,84],{"class":74},[64,332,334],{"class":333},"sYu0t","false\n",[64,336,338,340],{"class":66,"line":337},20,[64,339,152],{"class":70},[64,341,75],{"class":74},[64,343,345,347],{"class":66,"line":344},21,[64,346,102],{"class":74},[64,348,162],{"class":87},[64,350,352],{"class":66,"line":351},22,[64,353,225],{"emptyLinePlaceholder":224},[64,355,357,360],{"class":66,"line":356},23,[64,358,359],{"class":70},"deploy",[64,361,75],{"class":74},[64,363,365,367,369],{"class":66,"line":364},24,[64,366,81],{"class":70},[64,368,84],{"class":74},[64,370,88],{"class":87},[64,372,374,376],{"class":66,"line":373},25,[64,375,94],{"class":70},[64,377,75],{"class":74},[64,379,381,383],{"class":66,"line":380},26,[64,382,102],{"class":74},[64,384,253],{"class":87},[64,386,388,390],{"class":66,"line":387},27,[64,389,111],{"class":70},[64,391,75],{"class":74},[64,393,395,397,399],{"class":66,"line":394},28,[64,396,119],{"class":70},[64,398,84],{"class":74},[64,400,124],{"class":87},[64,402,404,406,408],{"class":66,"line":403},29,[64,405,130],{"class":70},[64,407,84],{"class":74},[64,409,135],{"class":87},[64,411,413,415],{"class":66,"line":412},30,[64,414,152],{"class":70},[64,416,75],{"class":74},[64,418,420,422],{"class":66,"line":419},31,[64,421,102],{"class":74},[64,423,162],{"class":87},[12,425,426,427,430,431,436,437,439],{},"In the YAML above, ",[61,428,429],{},"allow_failure: false"," ",[32,432,435],{"href":433,"rel":434},"https://docs.gitlab.com/ci/yaml/#whenmanual",[],"defines the manual job as \"blocking\"",", which will cause the pipeline to pause until an authorized user gives \"approval\" by clicking on the ",[19,438,178],{}," button to resume. Only the users part of that environment list will be able to perform this action. In this scenario, the UI view of the pipeline in the example CI configuration above would look like this:",[12,441,442],{},[443,444],"img",{"alt":445,"src":446},"Pipeline view of approval stage manual job","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398646/blog/Content%20Images/manual_job_approve_stage_ui.png",[24,448,450],{"id":449},"summary","Summary",[12,452,453],{},"As illustrated in the YAML examples and image above, manual jobs defined with protected environments and blocking attributes are effective tools for handling compliance needs as well as for ensuring there are proper controls over production deployments.",[12,455,456,457,462],{},"Tell us how using protected environments with manual jobs has secured your deployments or whether blocking manual jobs helps you meet compliance and auditing. ",[32,458,461],{"href":459,"rel":460},"https://gitlab.com/gitlab-org/gitlab/issues/new",[],"Create an issue in the GitLab project issue tracker"," to share your feedback with us.",[12,464,465,466,471,472],{},"Cover image by ",[32,467,470],{"href":468,"rel":469},"https://unsplash.com/photos/BNnzmBmnPg4",[],"Diane Walton"," on ",[32,473,476],{"href":474,"rel":475},"https://unsplash.com",[],"Unsplash",[478,479,480],"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);}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}",{"title":59,"searchDepth":78,"depth":78,"links":482},[483,484,485],{"id":26,"depth":78,"text":27},{"id":182,"depth":78,"text":183},{"id":449,"depth":78,"text":450},"engineering","2020-02-20","Let's look at how to use protected environments to set up access controls for production deployments and manual gates.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749681105/Blog/Hero%20Images/protect_manual_jobs.jpg",{},"/en-us/blog/protecting-manual-jobs",{"title":5,"description":488,"ogTitle":5,"ogDescription":488,"noIndex":491,"ogImage":492,"ogUrl":496,"ogSiteName":497,"ogType":498,"canonicalUrls":496},"https://about.gitlab.com/blog/protecting-manual-jobs","https://about.gitlab.com","article","protecting-manual-jobs","en-us/blog/protecting-manual-jobs",[502,503,504,505,506],"CI/CD","demo","workflow","features","DevOps","BlogPost","IEFzy0fj7Y-hfm8vn7bDoEo2EJpBF7kLdYfZVQGhMwc",{"logo":510,"freeTrial":515,"sales":520,"login":525,"items":530,"search":856,"minimal":887,"duo":906,"switchNav":915,"pricingDeployment":926},{"config":511},{"href":512,"dataGaName":513,"dataGaLocation":514},"/","gitlab logo","header",{"text":516,"config":517},"Get free trial",{"href":518,"dataGaName":519,"dataGaLocation":514},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":521,"config":522},"Request a demo",{"href":523,"dataGaName":524,"dataGaLocation":514},"/sales/?contact-topic=request-demo","sales",{"text":526,"config":527},"Sign in",{"href":528,"dataGaName":529,"dataGaLocation":514},"https://gitlab.com/users/sign_in/","sign in",[531,560,659,664,778,834],{"text":532,"config":533,"menu":535},"Platform",{"dataNavLevelOne":534},"platform",{"type":536,"columns":537},"cards",[538,544,552],{"title":532,"description":539,"link":540},"The intelligent orchestration platform for DevSecOps",{"text":541,"config":542},"Explore our Platform",{"href":543,"dataGaName":534,"dataGaLocation":514},"/platform/",{"title":545,"description":546,"link":547},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":548,"config":549},"Meet GitLab Duo",{"href":550,"dataGaName":551,"dataGaLocation":514},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":553,"description":554,"link":555},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":556,"config":557},"Learn more",{"href":558,"dataGaName":559,"dataGaLocation":514},"/why-gitlab/","why gitlab",{"text":561,"left":224,"config":562,"menu":564},"Product",{"dataNavLevelOne":563},"solutions",{"type":565,"link":566,"columns":570,"feature":638},"lists",{"text":567,"config":568},"View all Solutions",{"href":569,"dataGaName":563,"dataGaLocation":514},"/solutions/",[571,594,617],{"title":572,"description":573,"link":574,"items":579},"Automation","CI/CD and automation to accelerate deployment",{"config":575},{"icon":576,"href":577,"dataGaName":578,"dataGaLocation":514},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[580,583,586,590],{"text":502,"config":581},{"href":582,"dataGaLocation":514,"dataGaName":502},"/solutions/continuous-integration/",{"text":545,"config":584},{"href":550,"dataGaLocation":514,"dataGaName":585},"gitlab duo agent platform - product menu",{"text":587,"config":588},"Source Code Management",{"href":589,"dataGaLocation":514,"dataGaName":587},"/solutions/source-code-management/",{"text":591,"config":592},"Automated Software Delivery",{"href":577,"dataGaLocation":514,"dataGaName":593},"Automated software delivery",{"title":595,"description":596,"link":597,"items":602},"Security","Deliver code faster without compromising security",{"config":598},{"href":599,"dataGaName":600,"dataGaLocation":514,"icon":601},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[603,607,612],{"text":604,"config":605},"Application Security Testing",{"href":599,"dataGaName":606,"dataGaLocation":514},"Application security testing",{"text":608,"config":609},"Software Supply Chain Security",{"href":610,"dataGaLocation":514,"dataGaName":611},"/solutions/supply-chain/","Software supply chain security",{"text":613,"config":614},"Software Compliance",{"href":615,"dataGaName":616,"dataGaLocation":514},"/solutions/software-compliance/","software compliance",{"title":618,"link":619,"items":624},"Measurement",{"config":620},{"icon":621,"href":622,"dataGaName":623,"dataGaLocation":514},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[625,629,633],{"text":626,"config":627},"Visibility & Measurement",{"href":622,"dataGaLocation":514,"dataGaName":628},"Visibility and Measurement",{"text":630,"config":631},"Value Stream Management",{"href":632,"dataGaLocation":514,"dataGaName":630},"/solutions/value-stream-management/",{"text":634,"config":635},"Analytics & Insights",{"href":636,"dataGaLocation":514,"dataGaName":637},"/solutions/analytics-and-insights/","Analytics and insights",{"title":639,"type":565,"items":640},"GitLab for",[641,647,653],{"text":642,"config":643},"Enterprise",{"icon":644,"href":645,"dataGaLocation":514,"dataGaName":646},"Building","/enterprise/","enterprise",{"text":648,"config":649},"Small Business",{"icon":650,"href":651,"dataGaLocation":514,"dataGaName":652},"Work","/small-business/","small business",{"text":654,"config":655},"Public Sector",{"icon":656,"href":657,"dataGaLocation":514,"dataGaName":658},"Organization","/solutions/public-sector/","public sector",{"text":660,"config":661},"Pricing",{"href":662,"dataGaName":663,"dataGaLocation":514,"dataNavLevelOne":663},"/pricing/","pricing",{"text":665,"config":666,"menu":668},"Resources",{"dataNavLevelOne":667},"resources",{"type":565,"link":669,"columns":673,"feature":767},{"text":670,"config":671},"View all resources",{"href":672,"dataGaName":667,"dataGaLocation":514},"/resources/",[674,707,734],{"title":675,"items":676},"Getting started",[677,682,687,692,697,702],{"text":678,"config":679},"Install",{"href":680,"dataGaName":681,"dataGaLocation":514},"/install/","install",{"text":683,"config":684},"Quick start guides",{"href":685,"dataGaName":686,"dataGaLocation":514},"/get-started/","quick setup checklists",{"text":688,"config":689},"Learn",{"href":690,"dataGaLocation":514,"dataGaName":691},"https://university.gitlab.com/","learn",{"text":693,"config":694},"Product documentation",{"href":695,"dataGaName":696,"dataGaLocation":514},"https://docs.gitlab.com/","product documentation",{"text":698,"config":699},"Best practice videos",{"href":700,"dataGaName":701,"dataGaLocation":514},"/getting-started-videos/","best practice videos",{"text":703,"config":704},"Integrations",{"href":705,"dataGaName":706,"dataGaLocation":514},"/integrations/","integrations",{"title":708,"items":709},"Discover",[710,715,720,725,729],{"text":711,"config":712},"Customer success stories",{"href":713,"dataGaName":714,"dataGaLocation":514},"/customers/","customer success stories",{"text":716,"config":717},"Blog",{"href":718,"dataGaName":719,"dataGaLocation":514},"/blog/","blog",{"text":721,"config":722},"Demo Hub",{"href":723,"dataGaName":724,"dataGaLocation":514},"/demo-hub/","demo hub",{"text":726,"config":727},"The Source",{"href":728,"dataGaName":719,"dataGaLocation":514},"/the-source/",{"text":730,"config":731},"Remote",{"href":732,"dataGaName":733,"dataGaLocation":514},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":735,"items":736},"Connect",[737,742,747,752,757,762],{"text":738,"config":739},"GitLab Services",{"href":740,"dataGaName":741,"dataGaLocation":514},"/services/","services",{"text":743,"config":744},"Contribute",{"href":745,"dataGaName":746,"dataGaLocation":514},"https://contributors.gitlab.com","contribute",{"text":748,"config":749},"Community",{"href":750,"dataGaName":751,"dataGaLocation":514},"/community/","community",{"text":753,"config":754},"Forum",{"href":755,"dataGaName":756,"dataGaLocation":514},"https://forum.gitlab.com/","forum",{"text":758,"config":759},"Events",{"href":760,"dataGaName":761,"dataGaLocation":514},"/events/","events",{"text":763,"config":764},"Partners",{"href":765,"dataGaName":766,"dataGaLocation":514},"/partners/","partners",{"config":768,"title":771,"text":772,"link":773},{"background":769,"textColor":770},"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":774,"config":775},"Read the latest",{"href":776,"dataGaName":777,"dataGaLocation":514},"/whats-new/","whats new",{"text":779,"config":780,"menu":782},"Company",{"dataNavLevelOne":781},"company",{"type":565,"columns":783},[784],{"items":785},[786,791,797,799,804,809,814,819,824,829],{"text":787,"config":788},"About",{"href":789,"dataGaName":790,"dataGaLocation":514},"/company/","about",{"text":792,"config":793,"footerGa":796},"Jobs",{"href":794,"dataGaName":795,"dataGaLocation":514},"/jobs/","jobs",{"dataGaName":795},{"text":758,"config":798},{"href":760,"dataGaName":761,"dataGaLocation":514},{"text":800,"config":801},"Leadership",{"href":802,"dataGaName":803,"dataGaLocation":514},"/company/team/e-group/","leadership",{"text":805,"config":806},"Handbook",{"href":807,"dataGaName":808,"dataGaLocation":514},"https://handbook.gitlab.com/","handbook",{"text":810,"config":811},"Investor relations",{"href":812,"dataGaName":813,"dataGaLocation":514},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":815,"config":816},"Trust Center",{"href":817,"dataGaName":818,"dataGaLocation":514},"/security/","trust center",{"text":820,"config":821},"AI Transparency Center",{"href":822,"dataGaName":823,"dataGaLocation":514},"/ai-transparency-center/","ai transparency center",{"text":825,"config":826},"Newsletter",{"href":827,"dataGaName":828,"dataGaLocation":514},"/company/contact/#contact-forms","newsletter",{"text":830,"config":831},"Press",{"href":832,"dataGaName":833,"dataGaLocation":514},"/press/","press",{"text":835,"config":836,"menu":837},"Contact us",{"dataNavLevelOne":781},{"type":565,"columns":838},[839],{"items":840},[841,846,851],{"text":842,"config":843},"Talk to sales",{"href":844,"dataGaName":845,"dataGaLocation":514},"/sales/","talk to sales",{"text":847,"config":848},"Support portal",{"href":849,"dataGaName":850,"dataGaLocation":514},"https://support.gitlab.com/hc/en-us","support portal",{"text":852,"config":853},"Customer portal",{"href":854,"dataGaName":855,"dataGaLocation":514},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":857,"login":858,"suggestions":865},"Close",{"text":859,"link":860},"To search repositories and projects, login to",{"text":861,"config":862},"gitlab.com",{"href":528,"dataGaName":863,"dataGaLocation":864},"search login","search",{"text":866,"default":867},"Suggestions",[868,870,874,876,880,884],{"text":545,"config":869},{"href":550,"dataGaName":545,"dataGaLocation":864},{"text":871,"config":872},"Code Suggestions (AI)",{"href":873,"dataGaName":871,"dataGaLocation":864},"/solutions/code-suggestions/",{"text":502,"config":875},{"href":582,"dataGaName":502,"dataGaLocation":864},{"text":877,"config":878},"GitLab on AWS",{"href":879,"dataGaName":877,"dataGaLocation":864},"/partners/technology-partners/aws/",{"text":881,"config":882},"GitLab on Google Cloud",{"href":883,"dataGaName":881,"dataGaLocation":864},"/partners/technology-partners/google-cloud-platform/",{"text":885,"config":886},"Why GitLab?",{"href":558,"dataGaName":885,"dataGaLocation":864},{"freeTrial":888,"mobileIcon":893,"desktopIcon":898,"secondaryButton":901},{"text":889,"config":890},"Start free trial",{"href":891,"dataGaName":519,"dataGaLocation":892},"https://gitlab.com/-/trials/new/","nav",{"altText":894,"config":895},"Gitlab Icon",{"src":896,"dataGaName":897,"dataGaLocation":892},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":894,"config":899},{"src":900,"dataGaName":897,"dataGaLocation":892},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":902,"config":903},"Get Started",{"href":904,"dataGaName":905,"dataGaLocation":892},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":907,"mobileIcon":911,"desktopIcon":913},{"text":908,"config":909},"Learn more about GitLab Duo",{"href":550,"dataGaName":910,"dataGaLocation":892},"gitlab duo",{"altText":894,"config":912},{"src":896,"dataGaName":897,"dataGaLocation":892},{"altText":894,"config":914},{"src":900,"dataGaName":897,"dataGaLocation":892},{"button":916,"mobileIcon":921,"desktopIcon":923},{"text":917,"config":918},"/switch",{"href":919,"dataGaName":920,"dataGaLocation":892},"#contact","switch",{"altText":894,"config":922},{"src":896,"dataGaName":897,"dataGaLocation":892},{"altText":894,"config":924},{"src":925,"dataGaName":897,"dataGaLocation":892},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":927,"mobileIcon":932,"desktopIcon":934},{"text":928,"config":929},"Back to pricing",{"href":662,"dataGaName":930,"dataGaLocation":892,"icon":931},"back to pricing","GoBack",{"altText":894,"config":933},{"src":896,"dataGaName":897,"dataGaLocation":892},{"altText":894,"config":935},{"src":900,"dataGaName":897,"dataGaLocation":892},{"title":937,"titleMobile":938,"button":939,"config":944},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":556,"config":940},{"href":941,"dataGaName":942,"dataGaLocation":943},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":945,"disabled":491},"release",{"data":947},{"text":948,"source":949,"edit":955,"contribute":960,"config":965,"items":970,"minimal":1179},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":950,"config":951},"View page source",{"href":952,"dataGaName":953,"dataGaLocation":954},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":956,"config":957},"Edit this page",{"href":958,"dataGaName":959,"dataGaLocation":954},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":961,"config":962},"Please contribute",{"href":963,"dataGaName":964,"dataGaLocation":954},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":966,"facebook":967,"youtube":968,"linkedin":969},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[971,1018,1071,1115,1147],{"title":660,"links":972,"subMenu":987},[973,977,982],{"text":974,"config":975},"View plans",{"href":662,"dataGaName":976,"dataGaLocation":954},"view plans",{"text":978,"config":979},"Why Premium?",{"href":980,"dataGaName":981,"dataGaLocation":954},"/pricing/premium/","why premium",{"text":983,"config":984},"Why Ultimate?",{"href":985,"dataGaName":986,"dataGaLocation":954},"/pricing/ultimate/","why ultimate",[988],{"title":989,"links":990},"Contact Us",[991,994,996,998,1003,1008,1013],{"text":992,"config":993},"Contact sales",{"href":844,"dataGaName":524,"dataGaLocation":954},{"text":847,"config":995},{"href":849,"dataGaName":850,"dataGaLocation":954},{"text":852,"config":997},{"href":854,"dataGaName":855,"dataGaLocation":954},{"text":999,"config":1000},"Status",{"href":1001,"dataGaName":1002,"dataGaLocation":954},"https://status.gitlab.com/","status",{"text":1004,"config":1005},"Terms of use",{"href":1006,"dataGaName":1007,"dataGaLocation":954},"/terms/","terms of use",{"text":1009,"config":1010},"Privacy statement",{"href":1011,"dataGaName":1012,"dataGaLocation":954},"/privacy/","privacy statement",{"text":1014,"config":1015},"Cookie preferences",{"dataGaName":1016,"dataGaLocation":954,"id":1017,"isOneTrustButton":224},"cookie preferences","ot-sdk-btn",{"title":561,"links":1019,"subMenu":1028},[1020,1024],{"text":1021,"config":1022},"DevSecOps platform",{"href":543,"dataGaName":1023,"dataGaLocation":954},"devsecops platform",{"text":1025,"config":1026},"AI-Assisted Development",{"href":550,"dataGaName":1027,"dataGaLocation":954},"ai-assisted development",[1029],{"title":1030,"links":1031},"Topics",[1032,1037,1042,1046,1051,1056,1061,1066],{"text":1033,"config":1034},"CICD",{"href":1035,"dataGaName":1036,"dataGaLocation":954},"/topics/ci-cd/","cicd",{"text":1038,"config":1039},"GitOps",{"href":1040,"dataGaName":1041,"dataGaLocation":954},"/topics/gitops/","gitops",{"text":506,"config":1043},{"href":1044,"dataGaName":1045,"dataGaLocation":954},"/topics/devops/","devops",{"text":1047,"config":1048},"Version Control",{"href":1049,"dataGaName":1050,"dataGaLocation":954},"/topics/version-control/","version control",{"text":1052,"config":1053},"DevSecOps",{"href":1054,"dataGaName":1055,"dataGaLocation":954},"/topics/devsecops/","devsecops",{"text":1057,"config":1058},"Cloud Native",{"href":1059,"dataGaName":1060,"dataGaLocation":954},"/topics/cloud-native/","cloud native",{"text":1062,"config":1063},"AI for Coding",{"href":1064,"dataGaName":1065,"dataGaLocation":954},"/topics/devops/ai-for-coding/","ai for coding",{"text":1067,"config":1068},"Agentic AI",{"href":1069,"dataGaName":1070,"dataGaLocation":954},"/topics/agentic-ai/","agentic ai",{"title":1072,"links":1073},"Solutions",[1074,1076,1078,1083,1087,1090,1094,1097,1099,1102,1105,1110],{"text":604,"config":1075},{"href":599,"dataGaName":604,"dataGaLocation":954},{"text":593,"config":1077},{"href":577,"dataGaName":578,"dataGaLocation":954},{"text":1079,"config":1080},"Agile development",{"href":1081,"dataGaName":1082,"dataGaLocation":954},"/solutions/agile-delivery/","agile delivery",{"text":1084,"config":1085},"SCM",{"href":589,"dataGaName":1086,"dataGaLocation":954},"source code management",{"text":1033,"config":1088},{"href":582,"dataGaName":1089,"dataGaLocation":954},"continuous integration & delivery",{"text":1091,"config":1092},"Value stream management",{"href":632,"dataGaName":1093,"dataGaLocation":954},"value stream management",{"text":1038,"config":1095},{"href":1096,"dataGaName":1041,"dataGaLocation":954},"/solutions/gitops/",{"text":642,"config":1098},{"href":645,"dataGaName":646,"dataGaLocation":954},{"text":1100,"config":1101},"Small business",{"href":651,"dataGaName":652,"dataGaLocation":954},{"text":1103,"config":1104},"Public sector",{"href":657,"dataGaName":658,"dataGaLocation":954},{"text":1106,"config":1107},"Education",{"href":1108,"dataGaName":1109,"dataGaLocation":954},"/solutions/education/","education",{"text":1111,"config":1112},"Financial services",{"href":1113,"dataGaName":1114,"dataGaLocation":954},"/solutions/finance/","financial services",{"title":665,"links":1116},[1117,1119,1121,1123,1126,1128,1131,1133,1135,1137,1139,1141,1143,1145],{"text":678,"config":1118},{"href":680,"dataGaName":681,"dataGaLocation":954},{"text":683,"config":1120},{"href":685,"dataGaName":686,"dataGaLocation":954},{"text":688,"config":1122},{"href":690,"dataGaName":691,"dataGaLocation":954},{"text":693,"config":1124},{"href":695,"dataGaName":1125,"dataGaLocation":954},"docs",{"text":716,"config":1127},{"href":718,"dataGaName":719,"dataGaLocation":954},{"text":1129,"config":1130},"What's new",{"href":776,"dataGaName":777,"dataGaLocation":954},{"text":711,"config":1132},{"href":713,"dataGaName":714,"dataGaLocation":954},{"text":730,"config":1134},{"href":732,"dataGaName":733,"dataGaLocation":954},{"text":738,"config":1136},{"href":740,"dataGaName":741,"dataGaLocation":954},{"text":743,"config":1138},{"href":745,"dataGaName":746,"dataGaLocation":954},{"text":748,"config":1140},{"href":750,"dataGaName":751,"dataGaLocation":954},{"text":753,"config":1142},{"href":755,"dataGaName":756,"dataGaLocation":954},{"text":758,"config":1144},{"href":760,"dataGaName":761,"dataGaLocation":954},{"text":763,"config":1146},{"href":765,"dataGaName":766,"dataGaLocation":954},{"title":779,"links":1148},[1149,1151,1153,1155,1157,1159,1163,1168,1170,1172,1174],{"text":787,"config":1150},{"href":789,"dataGaName":781,"dataGaLocation":954},{"text":792,"config":1152},{"href":794,"dataGaName":795,"dataGaLocation":954},{"text":800,"config":1154},{"href":802,"dataGaName":803,"dataGaLocation":954},{"text":805,"config":1156},{"href":807,"dataGaName":808,"dataGaLocation":954},{"text":810,"config":1158},{"href":812,"dataGaName":813,"dataGaLocation":954},{"text":1160,"config":1161},"Sustainability",{"href":1162,"dataGaName":1160,"dataGaLocation":954},"/sustainability/",{"text":1164,"config":1165},"Diversity, inclusion and belonging (DIB)",{"href":1166,"dataGaName":1167,"dataGaLocation":954},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":815,"config":1169},{"href":817,"dataGaName":818,"dataGaLocation":954},{"text":825,"config":1171},{"href":827,"dataGaName":828,"dataGaLocation":954},{"text":830,"config":1173},{"href":832,"dataGaName":833,"dataGaLocation":954},{"text":1175,"config":1176},"Modern Slavery Transparency Statement",{"href":1177,"dataGaName":1178,"dataGaLocation":954},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1180},[1181,1184,1187],{"text":1182,"config":1183},"Terms",{"href":1006,"dataGaName":1007,"dataGaLocation":954},{"text":1185,"config":1186},"Cookies",{"dataGaName":1016,"dataGaLocation":954,"id":1017,"isOneTrustButton":224},{"text":1188,"config":1189},"Privacy",{"href":1011,"dataGaName":1012,"dataGaLocation":954},[1191],{"id":1192,"title":7,"body":490,"config":1193,"content":1195,"description":490,"extension":1198,"meta":1199,"navigation":224,"path":1200,"seo":1201,"stem":1202,"__hash__":1203},"blogAuthors/en-us/blog/authors/thao-yeager.yml",{"template":1194},"BlogAuthor",{"name":7,"config":1196},{"headshot":59,"ctfId":1197},"thaoyeager","yml",{},"/en-us/blog/authors/thao-yeager",{},"en-us/blog/authors/thao-yeager","PeGBAmZ7_fEcgK6BbPEZg98zqhQxwKNcFvFPLRzEG-E",[1205,1214,1222],{"title":1206,"description":1207,"heroImage":1208,"category":486,"date":1209,"authors":1210,"slug":1213,"externalUrl":490},"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",[1211,1212],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1215,"description":1216,"heroImage":1217,"category":486,"date":1218,"authors":1219,"slug":1221,"externalUrl":490},"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",[1220],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1223,"description":1224,"heroImage":1225,"category":486,"date":1226,"authors":1227,"slug":1229,"externalUrl":490},"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",[1228],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1231},[1232,1246,1258,1270],{"id":1233,"categories":1234,"header":1236,"text":1237,"button":1238,"image":1243},"ai-modernization",[1235],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1239,"config":1240},"Get your AI maturity score",{"href":1241,"dataGaName":1242,"dataGaLocation":719},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1244},{"src":1245},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1247,"categories":1248,"header":1250,"text":1237,"button":1251,"image":1255},"devops-modernization",[1249,1055],"product","Are you just managing tools or shipping innovation?",{"text":1252,"config":1253},"Get your DevOps maturity score",{"href":1254,"dataGaName":1242,"dataGaLocation":719},"/assessments/devops-modernization-assessment/",{"config":1256},{"src":1257},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1259,"categories":1260,"header":1262,"text":1237,"button":1263,"image":1267},"security-modernization",[1261],"security","Are you trading speed for security?",{"text":1264,"config":1265},"Get your security maturity score",{"href":1266,"dataGaName":1242,"dataGaLocation":719},"/assessments/security-modernization-assessment/",{"config":1268},{"src":1269},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1271,"paths":1272,"header":1275,"text":1276,"button":1277,"image":1282},"github-azure-migration",[1273,1274],"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":1278,"config":1279},"See how GitLab compares to GitHub",{"href":1280,"dataGaName":1281,"dataGaLocation":719},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1283},{"src":1257},{"header":1285,"blurb":1286,"button":1287,"secondaryButton":1292},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1288,"config":1289},"Get your free trial",{"href":1290,"dataGaName":519,"dataGaLocation":1291},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":992,"config":1293},{"href":844,"dataGaName":524,"dataGaLocation":1291},1786803752011]