[{"data":1,"prerenderedAt":1289},["ShallowReactive",2],{"/blog/how-to-status-checks":3,"navigation-en-us":503,"banner-en-us":930,"footer-en-us":940,"blog-post-authors-en-us-Cesar Saavedra":1184,"blog-related-posts-en-us-how-to-status-checks":1199,"blog-promotions-en-us":1225,"next-steps-en-us":1279},{"id":4,"title":5,"authors":6,"body":8,"category":481,"date":482,"description":483,"extension":484,"externalUrl":485,"faq":485,"featured":486,"heroImage":487,"meta":488,"navigation":489,"path":490,"seo":491,"slug":495,"stem":496,"tags":497,"template":501,"updatedDate":485,"__hash__":502},"blogPosts/en-us/blog/how-to-status-checks.md","How to use external status checks for merge requests",[7],"Cesar Saavedra",{"type":9,"value":10,"toc":471},"minimark",[11,22,27,30,34,42,47,68,73,81,90,108,111,122,132,139,143,146,170,173,176,187,194,198,201,211,218,221,230,237,246,249,256,263,270,283,287,293,296,310,317,326,333,339,346,350,359,364,379,382,395,398,409,415,429,432,442,448,452,455,458],[12,13,14,15,21],"p",{},"The ",[16,17,20],"a",{"href":18,"rel":19},"https://docs.gitlab.com/releases/#external-status-checks-for-merge-requests",[],"external status checks for merge requests capability"," was recently introduced in GitLab and it allows the integration of third-party systems and applications with GitLab merge requests.",[23,24,26],"h2",{"id":25},"what-are-external-status-checks-for-merge-requests","What are \"external status checks for merge requests\"?",[12,28,29],{},"External status checks are API calls to systems or applications that sit outside GitLab. These API calls are invoked during merge requests, which display a widget with the status of each external check. With external status checks, you can integrate GitLab with third-party systems, e.g. Salesforce, PeopleSoft, Microsoft Dynamics, etc., that require manual approval for merge requests. This makes it easy to see that merge requests have met external requirements before being merged, adding an extra method to ensure compliance and audit requirements are met.",[23,31,33],{"id":32},"steps-to-enable-and-use-external-status-checks-for-merge-requests","Steps to enable and use external status checks for merge requests",[12,35,36,37,41],{},"In this example, I have a sample project called ",[38,39,40],"strong",{},"my-proj",", for which I'd like to add and exercise a single external status check, which will hypothetically do some kind of validation for the merge request.",[43,44,46],"h3",{"id":45},"adding-an-external-status-check-to-your-project","Adding an external status check to your project",[12,48,49,50,53,54,57,58,60,61,64,65,67],{},"External status checks are added to merge requests by heading to your project’s ",[38,51,52],{},"Settings > General"," and then expanding the ",[38,55,56],{},"Merge requests"," section. Towards the bottom of the ",[38,59,56],{}," section, you will see an ",[38,62,63],{},"Add status check"," button, which you will need to click to to display the ",[38,66,63],{}," pop-up dialog:",[69,70],"img",{"src":71,"width":72,"height":72},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398514/blog/Content%20Images/how-to-status-checks/1-add-status-check-dialog.png","50%",[12,74,75,76,80],{},"In the dialog above, the external service name is being given the name ",[77,78,79],"em",{},"compliance-check",". The external API that will be called is:",[82,83,84],"blockquote",{},[12,85,86],{},[16,87,88],{"href":88,"rel":89},"https://tech-marketing-sandbox-cd-compvalidator.compliance.gitlabworkshops.io/validate",[],[82,91,92],{},[12,93,94,97,98,101,102,107],{},[38,95,96],{},"NOTE:"," the ",[77,99,100],{},"validate"," service above was ",[16,103,106],{"href":104,"rel":105},"https://gitlab.com/tech-marketing/sandbox/cd/compvalidator",[],"a simple Java service that I set up"," ahead of time to mimic a third-party external service. It returned an HTTP 200 success message when invoked. In a real life scenario, this external API call would be a SaaS service or an on-premises ERP system, for example.",[12,109,110],{},"The API above is a call - invoked from any merge requests created under this project - to an external system that will run a compliance check and validate modifications to this application.",[12,112,113,114,117,118,121],{},"As the target branch, the default ",[77,115,116],{},"Any branch"," has been selected. Another option could have been the ",[77,119,120],{},"main"," branch.",[12,123,124,125,127,128,131],{},"When you click the ",[38,126,63],{}," button, an entry will be created in the ",[38,129,130],{},"Status checks"," table, as shown below:",[12,133,134,138],{},[69,135],{"alt":136,"src":137},"status check table","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398515/blog/Content%20Images/how-to-status-checks/2-status-checks-table.png","\nStatus checks table",[43,140,142],{"id":141},"external-status-check-in-action","External status check in action",[12,144,145],{},"To exercise the external status check for merge requests, we need to create a merge request. But before that, let's create an issue.",[147,148,149,157,164],"ol",{},[150,151,152,153,156],"li",{},"Create an issue by clicking on ",[38,154,155],{},"Issues > List"," from the left vertical navigation menu to get to the Issues screen.",[150,158,159,160,163],{},"Then click on the ",[38,161,162],{},"New Issue"," button",[150,165,166,167,169],{},"On the ",[38,168,162],{}," window:",[12,171,172],{},"3.1. In the Title field, enter \"External status check demo\"",[12,174,175],{},"3.2. In the Description field, enter \"Issue to demonstrate an external status check\"",[12,177,178,179,182,183,186],{},"3.3. Click on ",[38,180,181],{},"Assign to me"," next to the ",[38,184,185],{},"Assignees"," field",[12,188,189,190,193],{},"3.4. Click on the ",[38,191,192],{},"Create issue"," button at the bottom of the window",[69,195],{"src":196,"width":197,"height":197},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398516/blog/Content%20Images/how-to-status-checks/3-issue-create-window.png","75%",[12,199,200],{},"Once the issue is created, you will be in the detail issue window.",[147,202,204],{"start":203},4,[150,205,206,207,210],{},"Click on the ",[38,208,209],{},"Create merge request"," button on the right hand side of the detailed issue window.",[12,212,213,217],{},[69,214],{"alt":215,"src":216},"create a merge request","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398516/blog/Content%20Images/how-to-status-checks/4-create-merge-req.png","\nCreating a merge request",[12,219,220],{},"Once the merge request is created, you will be in the detail merge request window.",[147,222,224],{"start":223},5,[150,225,206,226,229],{},[38,227,228],{},"Open in Web IDE"," button on the right hand side of the detailed merge request window:",[12,231,232,236],{},[69,233],{"alt":234,"src":235},"open webIDE","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398516/blog/Content%20Images/how-to-status-checks/5-open-webide.png","\nOpening the Web IDE",[147,238,240],{"start":239},6,[150,241,242,243,245],{},"Make a minor update to the application. In the sample project ",[38,244,40],{},", I modified two files: DemoApplication.java and DemoApplicationTests.java.",[12,247,248],{},"6.1. In the DemoApplication.java class, I added the word \"today\" to the string returned by a call to this class:",[12,250,251,255],{},[69,252],{"alt":253,"src":254},"update DemoApp","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398517/blog/Content%20Images/how-to-status-checks/6-update-demoapp.png","\nMaking a simple update to DemoApplication.java",[12,257,258,259,262],{},"6.2. In the DemoApplicationTests.java class, which is a unit test for DemoApplication.java, I also added the word \"today\" to the string in the ",[77,260,261],{},"assertThat()"," invocation to match the value returned by a call to the DemoApplication.java class:",[12,264,265,269],{},[69,266],{"alt":267,"src":268},"update DemoAppTests","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398517/blog/Content%20Images/how-to-status-checks/7-update-demoapptests.png","\nMaking a simple update to DemoApplicationTests.java",[147,271,273],{"start":272},7,[150,274,206,275,278,279,282],{},[38,276,277],{},"Commit…"," button at the bottom of the Web IDE window. And then ensure to select the feature branch for the merge request before clicking on the ",[38,280,281],{},"Commit"," button again:",[69,284],{"src":285,"width":286,"height":286},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398517/blog/Content%20Images/how-to-status-checks/8-click-commit.png","30%",[147,288,290],{"start":289},8,[150,291,292],{},"Go back to the merge request detail window by clicking on the merge request number on the bottom margin of the window:",[69,294],{"src":295,"width":197,"height":197},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398517/blog/Content%20Images/how-to-status-checks/9-click-mr-at-bottom.png",[147,297,299],{"start":298},9,[150,300,301,302,305,306,309],{},"On the detail merge request window, scroll down until you see a section titled ",[38,303,304],{},"Status checks 1 pending",". This is the merge request widget that lists all external status checks associated with merge requests. Click on the ",[38,307,308],{},"Expand"," button on the right hand side of this section:",[12,311,312,316],{},[69,313],{"alt":314,"src":315},"expanding status checks widget","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398514/blog/Content%20Images/how-to-status-checks/10-click-on-expand.png","\nExpanding the status checks widget in the merge request",[147,318,320],{"start":319},10,[150,321,322,323,325],{},"In the expanded section, you will see an entry for the external status check you defined above, whose name is ",[77,324,79],{},". Notice that to the left of its name, there is a pause symbol indicating to the merge request stakeholders that the check is still in progress and has not communicated its approval to the merge request yet:",[12,327,328,332],{},[69,329],{"alt":330,"src":331},"list of status checks","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398514/blog/Content%20Images/how-to-status-checks/11-status-checks-widget-expanded.png","\nList of external status checks",[147,334,336],{"start":335},11,[150,337,338],{},"In a real life scenario, the pause symbol would change to a green checkmark when the external status check communicates to GitLab that the compliance validation is finished, i.e. the merge request has been approved by the external service:",[12,340,341,345],{},[69,342],{"alt":343,"src":344},"status checks passed","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398514/blog/Content%20Images/how-to-status-checks/12-status-check-passed.png","\nStatus checks that have passed",[43,347,349],{"id":348},"how-does-an-external-status-check-inform-gitlab-that-it-has-approved-the-merge-request","How does an external status check inform GitLab that it has approved the merge request",[12,351,352,353,358],{},"Using an external status check integrates GitLab merge requests to a home-grown or SaaS application, for example, by invoking an API of this external system. Once this external system does its compliance validation or check, then it needs to inform GitLab that it has approved the merge request. To do this, the external system API must make use of the ",[16,354,357],{"href":355,"rel":356},"https://docs.gitlab.com/api/status_checks/",[],"GitLab external status checks API"," to communicate to GitLab that the MR is approved. This is a 2-step process:",[147,360,361],{},[150,362,363],{},"The first step is to get the ID of the external status check you need to approve. Here is an example of how to invoke the GitLab API to do this:",[82,365,366],{},[12,367,368,369],{},"curl --request GET --header \"PRIVATE-TOKEN: ",[370,371,373,374,378],"replace",{"with":372,"your":372,"gitlab":372,"api":372,"token":372},"","\" \"",[16,375,376],{"href":376,"rel":377},"https://gitlab.com/api/v4/projects/28933616/merge_requests/1/status_checks",[],"\"",[12,380,381],{},"An example of what the command above will return follows:",[82,383,384],{},[12,385,386],{},[387,388,389,390],"span",{},"{\"id\":86,\"name\":\"compliance-check\",\"external_url\":\"",[16,391,394],{"href":392,"rel":393},"https://tech-marketing-sandbox-cd-compvalidator.compliance.gitlabworkshops.io/validate%22,%22status%22:%22pending%22%7D",[],"https://tech-marketing-sandbox-cd-compvalidator.compliance.gitlabworkshops.io/validate\",\"status\":\"pending\"}",[12,396,397],{},"The example return value above shows that the ID of the external status check that we’d like to approve is 86.",[82,399,400],{},[12,401,402,404,405,408],{},[38,403,96],{}," Although I'm showing an example of how to invoke the GitLab API above using the ",[77,406,407],{},"curl"," command, the idea is that your external system API call would carry out any checks and validation and then it would assemble this message in a REST HTTP call back to GitLab to communicate its approval of the merge request.",[147,410,412],{"start":411},2,[150,413,414],{},"Once you have the ID of the external status check, you can then approve it by using the GitLab API. Here’s an example:",[82,416,417],{},[12,418,419,420],{},"curl --request POST --header \"PRIVATE-TOKEN:",[370,421,373,422,426],{"with":372,"your":372,"gitlab":372,"api":372,"token":372},[16,423,424],{"href":424,"rel":425},"https://gitlab.com/api/v4/projects/28933616/merge_requests/1/status_check_responses?sha=",[],[370,427,428],{"with":372,"sha":372,"at":372,"head":372,"of":372,"the":372,"source":372,"branch":372},"&external_status_check_id=86\"",[12,430,431],{},"Executing the REST API call above will approve the external status check on the GitLab merge request.",[433,434,439],"pre",{"className":435,"code":437,"language":438,"meta":372},[436],"language-text","NOTE: to obtain the \u003CSHA at HEAD of the source branch>, here’s an example of the command you’d need to execute:\n\n$ git ls-remote https://gitlab.com/tech-marketing/sandbox/cd/my-proj.git\n\nThe URL in the preceding line is the URL to the git project for your merge request. And here’s an example of the output of the preceding command:\n\nad1eeee497c99466797a1155f514d3c0c2f0cc45    HEAD\n9e209c8d409a0867c1df4e0965aa675277176137    refs/heads/1-external-status-check-demo\nad1eeee497c99466797a1155f514d3c0c2f0cc45    refs/heads/master\n9e209c8d409a0867c1df4e0965aa675277176137    refs/merge-requests/1/head\n","text",[440,441,437],"code",{"__ignoreMap":372},[12,443,444,445],{},"In the output above, the SHA for the feature branch associated with the merge request is ",[77,446,447],{},"9e209c8d409a0867c1df4e0965aa675277176137",[23,449,451],{"id":450},"what-weve-learned","What we've learned",[12,453,454],{},"GitLab recently introduced \"external status checks for merge requests,\" which are effectively API calls to systems/application that sit outside GitLab. As you could see, with external status checks for merge requests, we were able to integrate GitLab with a third-party system that required manual approval for a merge request, ensuring that your application updates meet compliance and audit requirements.",[12,456,457],{},"For a demo of this feature in action, watch the video below:",[459,460,463,464],"figure",{"className":461},[462],"video_container","\n  ",[465,466,470],"iframe",{"src":467,"frameBorder":468,"allowFullScreen":469},"https://www.youtube.com/embed/v4iY8qMvFLo","0","true"," ",{"title":372,"searchDepth":411,"depth":411,"links":472},[473,474,480],{"id":25,"depth":411,"text":26},{"id":32,"depth":411,"text":33,"children":475},[476,478,479],{"id":45,"depth":477,"text":46},3,{"id":141,"depth":477,"text":142},{"id":348,"depth":477,"text":349},{"id":450,"depth":411,"text":451},"engineering","2021-10-04","Want to integrate third-party systems and apps with GitLab merge requests? Here's everything you need to know.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663397/Blog/Hero%20Images/logoforblogpost.jpg",{},true,"/en-us/blog/how-to-status-checks",{"title":5,"description":483,"ogTitle":5,"ogDescription":483,"noIndex":486,"ogImage":487,"ogUrl":492,"ogSiteName":493,"ogType":494,"canonicalUrls":492},"https://about.gitlab.com/blog/how-to-status-checks","https://about.gitlab.com","article","how-to-status-checks","en-us/blog/how-to-status-checks",[498,499,500],"integrations","workflow","DevOps","BlogPost","uy-l9U4pc2HTfOsCNngiy3Mbut2qaDPMlQFJusqrZLM",{"logo":504,"freeTrial":509,"sales":514,"login":519,"items":524,"search":850,"minimal":881,"duo":900,"switchNav":909,"pricingDeployment":920},{"config":505},{"href":506,"dataGaName":507,"dataGaLocation":508},"/","gitlab logo","header",{"text":510,"config":511},"Get free trial",{"href":512,"dataGaName":513,"dataGaLocation":508},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":515,"config":516},"Request a demo",{"href":517,"dataGaName":518,"dataGaLocation":508},"/sales/?contact-topic=request-demo","sales",{"text":520,"config":521},"Sign in",{"href":522,"dataGaName":523,"dataGaLocation":508},"https://gitlab.com/users/sign_in/","sign in",[525,554,654,659,772,828],{"text":526,"config":527,"menu":529},"Platform",{"dataNavLevelOne":528},"platform",{"type":530,"columns":531},"cards",[532,538,546],{"title":526,"description":533,"link":534},"The intelligent orchestration platform for DevSecOps",{"text":535,"config":536},"Explore our Platform",{"href":537,"dataGaName":528,"dataGaLocation":508},"/platform/",{"title":539,"description":540,"link":541},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":542,"config":543},"Meet GitLab Duo",{"href":544,"dataGaName":545,"dataGaLocation":508},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":547,"description":548,"link":549},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":550,"config":551},"Learn more",{"href":552,"dataGaName":553,"dataGaLocation":508},"/why-gitlab/","why gitlab",{"text":555,"left":489,"config":556,"menu":558},"Product",{"dataNavLevelOne":557},"solutions",{"type":559,"link":560,"columns":564,"feature":633},"lists",{"text":561,"config":562},"View all Solutions",{"href":563,"dataGaName":557,"dataGaLocation":508},"/solutions/",[565,589,612],{"title":566,"description":567,"link":568,"items":573},"Automation","CI/CD and automation to accelerate deployment",{"config":569},{"icon":570,"href":571,"dataGaName":572,"dataGaLocation":508},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[574,578,581,585],{"text":575,"config":576},"CI/CD",{"href":577,"dataGaLocation":508,"dataGaName":575},"/solutions/continuous-integration/",{"text":539,"config":579},{"href":544,"dataGaLocation":508,"dataGaName":580},"gitlab duo agent platform - product menu",{"text":582,"config":583},"Source Code Management",{"href":584,"dataGaLocation":508,"dataGaName":582},"/solutions/source-code-management/",{"text":586,"config":587},"Automated Software Delivery",{"href":571,"dataGaLocation":508,"dataGaName":588},"Automated software delivery",{"title":590,"description":591,"link":592,"items":597},"Security","Deliver code faster without compromising security",{"config":593},{"href":594,"dataGaName":595,"dataGaLocation":508,"icon":596},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[598,602,607],{"text":599,"config":600},"Application Security Testing",{"href":594,"dataGaName":601,"dataGaLocation":508},"Application security testing",{"text":603,"config":604},"Software Supply Chain Security",{"href":605,"dataGaLocation":508,"dataGaName":606},"/solutions/supply-chain/","Software supply chain security",{"text":608,"config":609},"Software Compliance",{"href":610,"dataGaName":611,"dataGaLocation":508},"/solutions/software-compliance/","software compliance",{"title":613,"link":614,"items":619},"Measurement",{"config":615},{"icon":616,"href":617,"dataGaName":618,"dataGaLocation":508},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[620,624,628],{"text":621,"config":622},"Visibility & Measurement",{"href":617,"dataGaLocation":508,"dataGaName":623},"Visibility and Measurement",{"text":625,"config":626},"Value Stream Management",{"href":627,"dataGaLocation":508,"dataGaName":625},"/solutions/value-stream-management/",{"text":629,"config":630},"Analytics & Insights",{"href":631,"dataGaLocation":508,"dataGaName":632},"/solutions/analytics-and-insights/","Analytics and insights",{"title":634,"type":559,"items":635},"GitLab for",[636,642,648],{"text":637,"config":638},"Enterprise",{"icon":639,"href":640,"dataGaLocation":508,"dataGaName":641},"Building","/enterprise/","enterprise",{"text":643,"config":644},"Small Business",{"icon":645,"href":646,"dataGaLocation":508,"dataGaName":647},"Work","/small-business/","small business",{"text":649,"config":650},"Public Sector",{"icon":651,"href":652,"dataGaLocation":508,"dataGaName":653},"Organization","/solutions/public-sector/","public sector",{"text":655,"config":656},"Pricing",{"href":657,"dataGaName":658,"dataGaLocation":508,"dataNavLevelOne":658},"/pricing/","pricing",{"text":660,"config":661,"menu":663},"Resources",{"dataNavLevelOne":662},"resources",{"type":559,"link":664,"columns":668,"feature":761},{"text":665,"config":666},"View all resources",{"href":667,"dataGaName":662,"dataGaLocation":508},"/resources/",[669,701,728],{"title":670,"items":671},"Getting started",[672,677,682,687,692,697],{"text":673,"config":674},"Install",{"href":675,"dataGaName":676,"dataGaLocation":508},"/install/","install",{"text":678,"config":679},"Quick start guides",{"href":680,"dataGaName":681,"dataGaLocation":508},"/get-started/","quick setup checklists",{"text":683,"config":684},"Learn",{"href":685,"dataGaLocation":508,"dataGaName":686},"https://university.gitlab.com/","learn",{"text":688,"config":689},"Product documentation",{"href":690,"dataGaName":691,"dataGaLocation":508},"https://docs.gitlab.com/","product documentation",{"text":693,"config":694},"Best practice videos",{"href":695,"dataGaName":696,"dataGaLocation":508},"/getting-started-videos/","best practice videos",{"text":698,"config":699},"Integrations",{"href":700,"dataGaName":498,"dataGaLocation":508},"/integrations/",{"title":702,"items":703},"Discover",[704,709,714,719,723],{"text":705,"config":706},"Customer success stories",{"href":707,"dataGaName":708,"dataGaLocation":508},"/customers/","customer success stories",{"text":710,"config":711},"Blog",{"href":712,"dataGaName":713,"dataGaLocation":508},"/blog/","blog",{"text":715,"config":716},"Demo Hub",{"href":717,"dataGaName":718,"dataGaLocation":508},"/demo-hub/","demo hub",{"text":720,"config":721},"The Source",{"href":722,"dataGaName":713,"dataGaLocation":508},"/the-source/",{"text":724,"config":725},"Remote",{"href":726,"dataGaName":727,"dataGaLocation":508},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":729,"items":730},"Connect",[731,736,741,746,751,756],{"text":732,"config":733},"GitLab Services",{"href":734,"dataGaName":735,"dataGaLocation":508},"/services/","services",{"text":737,"config":738},"Contribute",{"href":739,"dataGaName":740,"dataGaLocation":508},"https://contributors.gitlab.com","contribute",{"text":742,"config":743},"Community",{"href":744,"dataGaName":745,"dataGaLocation":508},"/community/","community",{"text":747,"config":748},"Forum",{"href":749,"dataGaName":750,"dataGaLocation":508},"https://forum.gitlab.com/","forum",{"text":752,"config":753},"Events",{"href":754,"dataGaName":755,"dataGaLocation":508},"/events/","events",{"text":757,"config":758},"Partners",{"href":759,"dataGaName":760,"dataGaLocation":508},"/partners/","partners",{"config":762,"title":765,"text":766,"link":767},{"background":763,"textColor":764},"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":768,"config":769},"Read the latest",{"href":770,"dataGaName":771,"dataGaLocation":508},"/whats-new/","whats new",{"text":773,"config":774,"menu":776},"Company",{"dataNavLevelOne":775},"company",{"type":559,"columns":777},[778],{"items":779},[780,785,791,793,798,803,808,813,818,823],{"text":781,"config":782},"About",{"href":783,"dataGaName":784,"dataGaLocation":508},"/company/","about",{"text":786,"config":787,"footerGa":790},"Jobs",{"href":788,"dataGaName":789,"dataGaLocation":508},"/jobs/","jobs",{"dataGaName":789},{"text":752,"config":792},{"href":754,"dataGaName":755,"dataGaLocation":508},{"text":794,"config":795},"Leadership",{"href":796,"dataGaName":797,"dataGaLocation":508},"/company/team/e-group/","leadership",{"text":799,"config":800},"Handbook",{"href":801,"dataGaName":802,"dataGaLocation":508},"https://handbook.gitlab.com/","handbook",{"text":804,"config":805},"Investor relations",{"href":806,"dataGaName":807,"dataGaLocation":508},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":809,"config":810},"Trust Center",{"href":811,"dataGaName":812,"dataGaLocation":508},"/security/","trust center",{"text":814,"config":815},"AI Transparency Center",{"href":816,"dataGaName":817,"dataGaLocation":508},"/ai-transparency-center/","ai transparency center",{"text":819,"config":820},"Newsletter",{"href":821,"dataGaName":822,"dataGaLocation":508},"/company/contact/#contact-forms","newsletter",{"text":824,"config":825},"Press",{"href":826,"dataGaName":827,"dataGaLocation":508},"/press/","press",{"text":829,"config":830,"menu":831},"Contact us",{"dataNavLevelOne":775},{"type":559,"columns":832},[833],{"items":834},[835,840,845],{"text":836,"config":837},"Talk to sales",{"href":838,"dataGaName":839,"dataGaLocation":508},"/sales/","talk to sales",{"text":841,"config":842},"Support portal",{"href":843,"dataGaName":844,"dataGaLocation":508},"https://support.gitlab.com/hc/en-us","support portal",{"text":846,"config":847},"Customer portal",{"href":848,"dataGaName":849,"dataGaLocation":508},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":851,"login":852,"suggestions":859},"Close",{"text":853,"link":854},"To search repositories and projects, login to",{"text":855,"config":856},"gitlab.com",{"href":522,"dataGaName":857,"dataGaLocation":858},"search login","search",{"text":860,"default":861},"Suggestions",[862,864,868,870,874,878],{"text":539,"config":863},{"href":544,"dataGaName":539,"dataGaLocation":858},{"text":865,"config":866},"Code Suggestions (AI)",{"href":867,"dataGaName":865,"dataGaLocation":858},"/solutions/code-suggestions/",{"text":575,"config":869},{"href":577,"dataGaName":575,"dataGaLocation":858},{"text":871,"config":872},"GitLab on AWS",{"href":873,"dataGaName":871,"dataGaLocation":858},"/partners/technology-partners/aws/",{"text":875,"config":876},"GitLab on Google Cloud",{"href":877,"dataGaName":875,"dataGaLocation":858},"/partners/technology-partners/google-cloud-platform/",{"text":879,"config":880},"Why GitLab?",{"href":552,"dataGaName":879,"dataGaLocation":858},{"freeTrial":882,"mobileIcon":887,"desktopIcon":892,"secondaryButton":895},{"text":883,"config":884},"Start free trial",{"href":885,"dataGaName":513,"dataGaLocation":886},"https://gitlab.com/-/trials/new/","nav",{"altText":888,"config":889},"Gitlab Icon",{"src":890,"dataGaName":891,"dataGaLocation":886},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":888,"config":893},{"src":894,"dataGaName":891,"dataGaLocation":886},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":896,"config":897},"Get Started",{"href":898,"dataGaName":899,"dataGaLocation":886},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":901,"mobileIcon":905,"desktopIcon":907},{"text":902,"config":903},"Learn more about GitLab Duo",{"href":544,"dataGaName":904,"dataGaLocation":886},"gitlab duo",{"altText":888,"config":906},{"src":890,"dataGaName":891,"dataGaLocation":886},{"altText":888,"config":908},{"src":894,"dataGaName":891,"dataGaLocation":886},{"button":910,"mobileIcon":915,"desktopIcon":917},{"text":911,"config":912},"/switch",{"href":913,"dataGaName":914,"dataGaLocation":886},"#contact","switch",{"altText":888,"config":916},{"src":890,"dataGaName":891,"dataGaLocation":886},{"altText":888,"config":918},{"src":919,"dataGaName":891,"dataGaLocation":886},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":921,"mobileIcon":926,"desktopIcon":928},{"text":922,"config":923},"Back to pricing",{"href":657,"dataGaName":924,"dataGaLocation":886,"icon":925},"back to pricing","GoBack",{"altText":888,"config":927},{"src":890,"dataGaName":891,"dataGaLocation":886},{"altText":888,"config":929},{"src":894,"dataGaName":891,"dataGaLocation":886},{"title":931,"titleMobile":932,"button":933,"config":938},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":550,"config":934},{"href":935,"dataGaName":936,"dataGaLocation":937},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":939,"disabled":486},"release",{"data":941},{"text":942,"source":943,"edit":949,"contribute":954,"config":959,"items":964,"minimal":1173},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":944,"config":945},"View page source",{"href":946,"dataGaName":947,"dataGaLocation":948},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":950,"config":951},"Edit this page",{"href":952,"dataGaName":953,"dataGaLocation":948},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":955,"config":956},"Please contribute",{"href":957,"dataGaName":958,"dataGaLocation":948},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":960,"facebook":961,"youtube":962,"linkedin":963},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[965,1012,1065,1109,1141],{"title":655,"links":966,"subMenu":981},[967,971,976],{"text":968,"config":969},"View plans",{"href":657,"dataGaName":970,"dataGaLocation":948},"view plans",{"text":972,"config":973},"Why Premium?",{"href":974,"dataGaName":975,"dataGaLocation":948},"/pricing/premium/","why premium",{"text":977,"config":978},"Why Ultimate?",{"href":979,"dataGaName":980,"dataGaLocation":948},"/pricing/ultimate/","why ultimate",[982],{"title":983,"links":984},"Contact Us",[985,988,990,992,997,1002,1007],{"text":986,"config":987},"Contact sales",{"href":838,"dataGaName":518,"dataGaLocation":948},{"text":841,"config":989},{"href":843,"dataGaName":844,"dataGaLocation":948},{"text":846,"config":991},{"href":848,"dataGaName":849,"dataGaLocation":948},{"text":993,"config":994},"Status",{"href":995,"dataGaName":996,"dataGaLocation":948},"https://status.gitlab.com/","status",{"text":998,"config":999},"Terms of use",{"href":1000,"dataGaName":1001,"dataGaLocation":948},"/terms/","terms of use",{"text":1003,"config":1004},"Privacy statement",{"href":1005,"dataGaName":1006,"dataGaLocation":948},"/privacy/","privacy statement",{"text":1008,"config":1009},"Cookie preferences",{"dataGaName":1010,"dataGaLocation":948,"id":1011,"isOneTrustButton":489},"cookie preferences","ot-sdk-btn",{"title":555,"links":1013,"subMenu":1022},[1014,1018],{"text":1015,"config":1016},"DevSecOps platform",{"href":537,"dataGaName":1017,"dataGaLocation":948},"devsecops platform",{"text":1019,"config":1020},"AI-Assisted Development",{"href":544,"dataGaName":1021,"dataGaLocation":948},"ai-assisted development",[1023],{"title":1024,"links":1025},"Topics",[1026,1031,1036,1040,1045,1050,1055,1060],{"text":1027,"config":1028},"CICD",{"href":1029,"dataGaName":1030,"dataGaLocation":948},"/topics/ci-cd/","cicd",{"text":1032,"config":1033},"GitOps",{"href":1034,"dataGaName":1035,"dataGaLocation":948},"/topics/gitops/","gitops",{"text":500,"config":1037},{"href":1038,"dataGaName":1039,"dataGaLocation":948},"/topics/devops/","devops",{"text":1041,"config":1042},"Version Control",{"href":1043,"dataGaName":1044,"dataGaLocation":948},"/topics/version-control/","version control",{"text":1046,"config":1047},"DevSecOps",{"href":1048,"dataGaName":1049,"dataGaLocation":948},"/topics/devsecops/","devsecops",{"text":1051,"config":1052},"Cloud Native",{"href":1053,"dataGaName":1054,"dataGaLocation":948},"/topics/cloud-native/","cloud native",{"text":1056,"config":1057},"AI for Coding",{"href":1058,"dataGaName":1059,"dataGaLocation":948},"/topics/devops/ai-for-coding/","ai for coding",{"text":1061,"config":1062},"Agentic AI",{"href":1063,"dataGaName":1064,"dataGaLocation":948},"/topics/agentic-ai/","agentic ai",{"title":1066,"links":1067},"Solutions",[1068,1070,1072,1077,1081,1084,1088,1091,1093,1096,1099,1104],{"text":599,"config":1069},{"href":594,"dataGaName":599,"dataGaLocation":948},{"text":588,"config":1071},{"href":571,"dataGaName":572,"dataGaLocation":948},{"text":1073,"config":1074},"Agile development",{"href":1075,"dataGaName":1076,"dataGaLocation":948},"/solutions/agile-delivery/","agile delivery",{"text":1078,"config":1079},"SCM",{"href":584,"dataGaName":1080,"dataGaLocation":948},"source code management",{"text":1027,"config":1082},{"href":577,"dataGaName":1083,"dataGaLocation":948},"continuous integration & delivery",{"text":1085,"config":1086},"Value stream management",{"href":627,"dataGaName":1087,"dataGaLocation":948},"value stream management",{"text":1032,"config":1089},{"href":1090,"dataGaName":1035,"dataGaLocation":948},"/solutions/gitops/",{"text":637,"config":1092},{"href":640,"dataGaName":641,"dataGaLocation":948},{"text":1094,"config":1095},"Small business",{"href":646,"dataGaName":647,"dataGaLocation":948},{"text":1097,"config":1098},"Public sector",{"href":652,"dataGaName":653,"dataGaLocation":948},{"text":1100,"config":1101},"Education",{"href":1102,"dataGaName":1103,"dataGaLocation":948},"/solutions/education/","education",{"text":1105,"config":1106},"Financial services",{"href":1107,"dataGaName":1108,"dataGaLocation":948},"/solutions/finance/","financial services",{"title":660,"links":1110},[1111,1113,1115,1117,1120,1122,1125,1127,1129,1131,1133,1135,1137,1139],{"text":673,"config":1112},{"href":675,"dataGaName":676,"dataGaLocation":948},{"text":678,"config":1114},{"href":680,"dataGaName":681,"dataGaLocation":948},{"text":683,"config":1116},{"href":685,"dataGaName":686,"dataGaLocation":948},{"text":688,"config":1118},{"href":690,"dataGaName":1119,"dataGaLocation":948},"docs",{"text":710,"config":1121},{"href":712,"dataGaName":713,"dataGaLocation":948},{"text":1123,"config":1124},"What's new",{"href":770,"dataGaName":771,"dataGaLocation":948},{"text":705,"config":1126},{"href":707,"dataGaName":708,"dataGaLocation":948},{"text":724,"config":1128},{"href":726,"dataGaName":727,"dataGaLocation":948},{"text":732,"config":1130},{"href":734,"dataGaName":735,"dataGaLocation":948},{"text":737,"config":1132},{"href":739,"dataGaName":740,"dataGaLocation":948},{"text":742,"config":1134},{"href":744,"dataGaName":745,"dataGaLocation":948},{"text":747,"config":1136},{"href":749,"dataGaName":750,"dataGaLocation":948},{"text":752,"config":1138},{"href":754,"dataGaName":755,"dataGaLocation":948},{"text":757,"config":1140},{"href":759,"dataGaName":760,"dataGaLocation":948},{"title":773,"links":1142},[1143,1145,1147,1149,1151,1153,1157,1162,1164,1166,1168],{"text":781,"config":1144},{"href":783,"dataGaName":775,"dataGaLocation":948},{"text":786,"config":1146},{"href":788,"dataGaName":789,"dataGaLocation":948},{"text":794,"config":1148},{"href":796,"dataGaName":797,"dataGaLocation":948},{"text":799,"config":1150},{"href":801,"dataGaName":802,"dataGaLocation":948},{"text":804,"config":1152},{"href":806,"dataGaName":807,"dataGaLocation":948},{"text":1154,"config":1155},"Sustainability",{"href":1156,"dataGaName":1154,"dataGaLocation":948},"/sustainability/",{"text":1158,"config":1159},"Diversity, inclusion and belonging (DIB)",{"href":1160,"dataGaName":1161,"dataGaLocation":948},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":809,"config":1163},{"href":811,"dataGaName":812,"dataGaLocation":948},{"text":819,"config":1165},{"href":821,"dataGaName":822,"dataGaLocation":948},{"text":824,"config":1167},{"href":826,"dataGaName":827,"dataGaLocation":948},{"text":1169,"config":1170},"Modern Slavery Transparency Statement",{"href":1171,"dataGaName":1172,"dataGaLocation":948},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1174},[1175,1178,1181],{"text":1176,"config":1177},"Terms",{"href":1000,"dataGaName":1001,"dataGaLocation":948},{"text":1179,"config":1180},"Cookies",{"dataGaName":1010,"dataGaLocation":948,"id":1011,"isOneTrustButton":489},{"text":1182,"config":1183},"Privacy",{"href":1005,"dataGaName":1006,"dataGaLocation":948},[1185],{"id":1186,"title":7,"body":485,"config":1187,"content":1189,"description":485,"extension":1193,"meta":1194,"navigation":489,"path":1195,"seo":1196,"stem":1197,"__hash__":1198},"blogAuthors/en-us/blog/authors/cesar-saavedra.yml",{"template":1188},"BlogAuthor",{"name":7,"config":1190},{"headshot":1191,"ctfId":1192},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659600/Blog/Author%20Headshots/csaavedra1-headshot.jpg","csaavedra1","yml",{},"/en-us/blog/authors/cesar-saavedra",{},"en-us/blog/authors/cesar-saavedra","SMqRf-z0W5m5GROz_dXGjmuIb3YaOwm_n_RfeK16GcA",[1200,1209,1217],{"title":1201,"description":1202,"heroImage":1203,"category":481,"date":1204,"authors":1205,"slug":1208,"externalUrl":485},"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",[1206,1207],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1210,"description":1211,"heroImage":1212,"category":481,"date":1213,"authors":1214,"slug":1216,"externalUrl":485},"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",[1215],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1218,"description":1219,"heroImage":1220,"category":481,"date":1221,"authors":1222,"slug":1224,"externalUrl":485},"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",[1223],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1226},[1227,1241,1253,1265],{"id":1228,"categories":1229,"header":1231,"text":1232,"button":1233,"image":1238},"ai-modernization",[1230],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1234,"config":1235},"Get your AI maturity score",{"href":1236,"dataGaName":1237,"dataGaLocation":713},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1239},{"src":1240},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1242,"categories":1243,"header":1245,"text":1232,"button":1246,"image":1250},"devops-modernization",[1244,1049],"product","Are you just managing tools or shipping innovation?",{"text":1247,"config":1248},"Get your DevOps maturity score",{"href":1249,"dataGaName":1237,"dataGaLocation":713},"/assessments/devops-modernization-assessment/",{"config":1251},{"src":1252},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1254,"categories":1255,"header":1257,"text":1232,"button":1258,"image":1262},"security-modernization",[1256],"security","Are you trading speed for security?",{"text":1259,"config":1260},"Get your security maturity score",{"href":1261,"dataGaName":1237,"dataGaLocation":713},"/assessments/security-modernization-assessment/",{"config":1263},{"src":1264},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1266,"paths":1267,"header":1270,"text":1271,"button":1272,"image":1277},"github-azure-migration",[1268,1269],"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":1273,"config":1274},"See how GitLab compares to GitHub",{"href":1275,"dataGaName":1276,"dataGaLocation":713},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1278},{"src":1252},{"header":1280,"blurb":1281,"button":1282,"secondaryButton":1287},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1283,"config":1284},"Get your free trial",{"href":1285,"dataGaName":513,"dataGaLocation":1286},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":986,"config":1288},{"href":838,"dataGaName":518,"dataGaLocation":1286},1786803751967]