[{"data":1,"prerenderedAt":1127},["ShallowReactive",2],{"/blog/gitlab-apis-ci":3,"navigation-en-us":343,"banner-en-us":770,"footer-en-us":780,"blog-post-authors-en-us-William Arias":1024,"blog-related-posts-en-us-gitlab-apis-ci":1039,"blog-promotions-en-us":1063,"next-steps-en-us":1117},{"id":4,"title":5,"authors":6,"body":8,"category":320,"date":321,"description":322,"extension":323,"externalUrl":324,"faq":324,"featured":325,"heroImage":326,"meta":327,"navigation":328,"path":329,"seo":330,"slug":334,"stem":335,"tags":336,"template":341,"updatedDate":324,"__hash__":342},"blogPosts/en-us/blog/gitlab-apis-ci.md","Using Gitlab APIs: Real Use Case Scenario",[7],"William Arias",{"type":9,"value":10,"toc":312},"minimark",[11,15,18,25,32,37,43,48,54,57,62,65,71,75,78,84,87,93,96,126,134,142,149,156,160,163,169,172,177,192,195,199,205,208,213,216,242,245,251,254,271,278,287,295,298],[12,13,14],"p",{},"Gitlab APIs along with  Continuous Integration can be very helpful when executing certain bulk tasks.",[12,16,17],{},"Consider this requirement derived from a real-world scenario",[19,20,21],"ul",{},[22,23,24],"li",{},"Company XYZ possess several repositories that have been organized under a Gitlab group",[12,26,27],{},[28,29],"img",{"alt":30,"src":31},"group","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398329/blog/Content%20Images/gitlab-apis-ci/gitlab-group.png",[19,33,34],{},[22,35,36],{},"The company needs to test the building of projects in bulk using new hardware (Runner with different CPU Architecture) that will bring down execution costs, whenever the build in each of the projects fails an issue must be  automatically created.",[12,38,39],{},[28,40],{"alt":41,"src":42},"runner","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398331/blog/Content%20Images/gitlab-apis-ci/runner.png",[19,44,45],{},[22,46,47],{},"Lastly, all the issues that were automatically created whenever a project built failed,  should be collected in bulk and reported back to a Wiki",[12,49,50],{},[28,51],{"alt":52,"src":53},"pipelineview","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398327/blog/Content%20Images/gitlab-apis-ci/3-pipelineview-collect-issues.png",[12,55,56],{},"How do we test the building of those several projects and create issues and reports about its execution automatically? Let's use Gitlab CI and  APIs.",[58,59,61],"h2",{"id":60},"_1-company-groups-and-projects-structure","1. Company groups and projects Structure",[12,63,64],{},"In this case, the set of projects were grouped under a single group, following this structure:",[12,66,67],{},[28,68],{"alt":69,"src":70},"groupview","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398328/blog/Content%20Images/gitlab-apis-ci/4-group-view-api-blog.png",[58,72,74],{"id":73},"_2-automatically-creating-issues-leveraging-gitlab-ci-and-api","2. Automatically creating Issues leveraging Gitlab CI and API",[12,76,77],{},"In order to create issues using Gitlab API we will use the Issues API an example of that  can use the following cURL command:",[12,79,80],{},[28,81],{"alt":82,"src":83},"curl","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398328/blog/Content%20Images/gitlab-apis-ci/5-create-issue-api-gitlabapi.png",[12,85,86],{},"The API Call:",[12,88,89],{},[90,91,92],"code",{},"curl --request POST --header \"PRIVATE-TOKEN:$ISSUE_API_KEY\" \"https://gitlab.com/api/v4/projects/$CI_PROJECT_ID/issues?title=Build%20Failed&labels=ARMbuild&description=Project%20Tests%20Failed%20on%20ARM\"",[12,94,95],{},"The previous Gitlab API call can be configured to be executed whenever a job fails. Let's dissect this API Call to understand its parameters so you can potentially customize it  for your project environment",[19,97,98,106,109,112],{},[22,99,100,101],{},"Base URL:  ",[102,103,104],"a",{"href":104,"rel":105},"https://gitlab.com/api/v4/projects",[],[22,107,108],{},"Project where we want to add the issue:  $CI_PROJECT_ID Notice this ID is unique and corresponds to the project where the CI/CD pipeline runs",[22,110,111],{},"Issues: Endpoint we use to tell Gitlab we want to add an issue to the project",[22,113,114,115],{},"Parameters:\n",[19,116,117,120,123],{},[22,118,119],{},"Title: How we want the issue to be titled",[22,121,122],{},"Labels: Helpful to group issues by label or type, They help you organize and tag your work so you can track and find the work items you’re interested in.",[22,124,125],{},"Description: Field to explain the nature of the issue if needed",[12,127,128,129,133],{},"The request is of type POST, because we are sending data to our receiver service.  For this call to be successful it requires  authentication for which we will use ",[130,131,132],"em",{},"PRIVATE-TOKEN"," header",[12,135,136,137],{},"The private token can be generated by following these steps ",[102,138,141],{"href":139,"rel":140},"https://docs.gitlab.com/user/profile/personal_access_tokens/",[],"How-to-generate-token",[12,143,144,145],{},"When we execute the above API call, we create an issue in the corresponding Gitlab project\n",[28,146],{"alt":147,"src":148},"issueproject","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398329/blog/Content%20Images/gitlab-apis-ci/5-issues-created.png",[12,150,151,152],{},"Great, so once the multi-project pipeline has run,  each of the projects that failed in its building stage will create an issue warning us to double check why it failed while documenting the failure and labeling it for future follow-up.\n",[28,153],{"alt":154,"src":155},"multiproject","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398329/blog/Content%20Images/gitlab-apis-ci/7.1-multiproject-pipeline-gitlabapi.png",[58,157,159],{"id":158},"_3-automatically-collecting-all-the-issues-from-gitlab-group","3. Automatically collecting all the issues from Gitlab Group",[12,161,162],{},"Thanks to Gitlab CI and APIs we can collect all the issues created and report them back, by adding this script  in  your pipeline stage",[12,164,165],{},[28,166],{"alt":167,"src":168},"collectissues","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398329/blog/Content%20Images/gitlab-apis-ci/7-collecting-issues-apiblog.png",[12,170,171],{},"Let's dissect again the main API call:",[12,173,174],{},[90,175,176],{},"curl --header \"PRIVATE-TOKEN:$GROUP_ISSUE_LIST\" \"https://gitlab.com/api/v4/groups/9123625/issues",[19,178,179,186,189],{},[22,180,181,182],{},"Base url: ",[102,183,184],{"href":184,"rel":185},"https://gitlab.com/api/v4/",[],[22,187,188],{},"Group resource: /groups/9123625",[22,190,191],{},"Issues resources: /issues",[12,193,194],{},"The previous API call will return a json object, the one we will save as an artifact when executing our pipeline job. Notice this artifact is created and saved automatically by Gitlab CI\nGreat! So far we created issues per failed project, and collected them all in one single step",[58,196,198],{"id":197},"_4-reporting-back-to-wiki-project","4. Reporting back to Wiki Project",[12,200,201],{},[28,202],{"alt":203,"src":204},"wikijob","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398329/blog/Content%20Images/gitlab-apis-ci/8-reportwiki-gitlab-api.png",[12,206,207],{},"For convenience, the json report was transformed to markdown, then using the following script we publish the markdown report to the Wiki of an specific project",[12,209,210],{},[90,211,212],{},"curl --data \"format=markdown&title=$CI_JOB_ID&content=$results\" --header \"PRIVATE-TOKEN:$API_WIKI\" \"https://gitlab.com/api/v4/projects/20852684/wikis\"",[12,214,215],{},"Let's breakdown again the API call:",[19,217,218,223,226,229],{},[22,219,181,220],{},[102,221,184],{"href":184,"rel":222},[],[22,224,225],{},"Project resource ID : /projects/20852684",[22,227,228],{},"Wiki resource: /wiki",[22,230,114,231],{},[19,232,233,236,239],{},[22,234,235],{},"Data format: markdown. We want to publish a markdown table",[22,237,238],{},"Title: Title of the Wiki entry, we use the environment variable corresponding to the CI_JOB that was executed",[22,240,241],{},"Content: The markdown table generated with the issues collection",[12,243,244],{},"Finally, when the last API call has been executed, this is an example of the output we can get:",[12,246,247],{},[28,248],{"alt":249,"src":250},"report","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398326/blog/Content%20Images/gitlab-apis-ci/10-test-report-gitlabapi.png",[12,252,253],{},"Let's recapitulate, by using Gitlab CI in a multi project pipeline along with APIs we were able to test and report automatically x-number of projects and its compatibility with a new hardware CPU architecture. More information about the APIs utilized for this project here:",[12,255,256,261,266],{},[102,257,260],{"href":258,"rel":259},"https://docs.gitlab.com/api/issues/#new-issue",[],"Issues-api",[102,262,265],{"href":263,"rel":264},"https://docs.gitlab.com/api/issues/#list-group-issues",[],"Collect-group-issues",[102,267,270],{"href":268,"rel":269},"https://docs.gitlab.com/api/wikis/",[],"WikisAPI",[12,272,273],{},[102,274,277],{"href":275,"rel":276},"https://about.gitlab.com/blog/cross-project-pipeline/",[],"Multi-project-pipeline",[12,279,280,281,286],{},"If you’d like to see GitLab’s API in action, watch this ",[102,282,285],{"href":283,"rel":284},"https://youtu.be/zdBwMHARkU0?t=469",[],"video",".",[12,288,289,290,286],{},"For more information, visit ",[102,291,294],{"href":292,"rel":293},"https://university.gitlab.com/",[],"LEARN@GITLAB",[12,296,297],{},"Cover image credit:",[12,299,300,301,306,307],{},"Cover image by ",[102,302,305],{"href":303,"rel":304},"https://unsplash.com/photos/yQpAaMsQzYE",[],"Mohanan"," on ",[102,308,311],{"href":309,"rel":310},"https://unsplash.com",[],"Unsplash",{"title":313,"searchDepth":314,"depth":314,"links":315},"",2,[316,317,318,319],{"id":60,"depth":314,"text":61},{"id":73,"depth":314,"text":74},{"id":158,"depth":314,"text":159},{"id":197,"depth":314,"text":198},"unfiltered","2020-01-22","Learn about how GitLab CI and APIs can help you automate bulk tasks","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749681037/Blog/Hero%20Images/gitlabapi-cover.jpg",{},true,"/en-us/blog/gitlab-apis-ci",{"title":5,"description":322,"ogTitle":5,"ogDescription":322,"noIndex":325,"ogImage":326,"ogUrl":331,"ogSiteName":332,"ogType":333,"canonicalUrls":331},"https://about.gitlab.com/blog/gitlab-apis-ci","https://about.gitlab.com","article","gitlab-apis-ci","en-us/blog/gitlab-apis-ci",[337,338,339,340],"CI","AWS","DevOps","demo","BlogPost","lOM9T_Hs_HMGyahikfZroyqkN5mOLvNsD6RYdWTf0Uo",{"logo":344,"freeTrial":349,"sales":354,"login":359,"items":364,"search":690,"minimal":721,"duo":740,"switchNav":749,"pricingDeployment":760},{"config":345},{"href":346,"dataGaName":347,"dataGaLocation":348},"/","gitlab logo","header",{"text":350,"config":351},"Get free trial",{"href":352,"dataGaName":353,"dataGaLocation":348},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":355,"config":356},"Request a demo",{"href":357,"dataGaName":358,"dataGaLocation":348},"/sales/?contact-topic=request-demo","sales",{"text":360,"config":361},"Sign in",{"href":362,"dataGaName":363,"dataGaLocation":348},"https://gitlab.com/users/sign_in/","sign in",[365,394,494,499,612,668],{"text":366,"config":367,"menu":369},"Platform",{"dataNavLevelOne":368},"platform",{"type":370,"columns":371},"cards",[372,378,386],{"title":366,"description":373,"link":374},"The intelligent orchestration platform for DevSecOps",{"text":375,"config":376},"Explore our Platform",{"href":377,"dataGaName":368,"dataGaLocation":348},"/platform/",{"title":379,"description":380,"link":381},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":382,"config":383},"Meet GitLab Duo",{"href":384,"dataGaName":385,"dataGaLocation":348},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":387,"description":388,"link":389},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":390,"config":391},"Learn more",{"href":392,"dataGaName":393,"dataGaLocation":348},"/why-gitlab/","why gitlab",{"text":395,"left":328,"config":396,"menu":398},"Product",{"dataNavLevelOne":397},"solutions",{"type":399,"link":400,"columns":404,"feature":473},"lists",{"text":401,"config":402},"View all Solutions",{"href":403,"dataGaName":397,"dataGaLocation":348},"/solutions/",[405,429,452],{"title":406,"description":407,"link":408,"items":413},"Automation","CI/CD and automation to accelerate deployment",{"config":409},{"icon":410,"href":411,"dataGaName":412,"dataGaLocation":348},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[414,418,421,425],{"text":415,"config":416},"CI/CD",{"href":417,"dataGaLocation":348,"dataGaName":415},"/solutions/continuous-integration/",{"text":379,"config":419},{"href":384,"dataGaLocation":348,"dataGaName":420},"gitlab duo agent platform - product menu",{"text":422,"config":423},"Source Code Management",{"href":424,"dataGaLocation":348,"dataGaName":422},"/solutions/source-code-management/",{"text":426,"config":427},"Automated Software Delivery",{"href":411,"dataGaLocation":348,"dataGaName":428},"Automated software delivery",{"title":430,"description":431,"link":432,"items":437},"Security","Deliver code faster without compromising security",{"config":433},{"href":434,"dataGaName":435,"dataGaLocation":348,"icon":436},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[438,442,447],{"text":439,"config":440},"Application Security Testing",{"href":434,"dataGaName":441,"dataGaLocation":348},"Application security testing",{"text":443,"config":444},"Software Supply Chain Security",{"href":445,"dataGaLocation":348,"dataGaName":446},"/solutions/supply-chain/","Software supply chain security",{"text":448,"config":449},"Software Compliance",{"href":450,"dataGaName":451,"dataGaLocation":348},"/solutions/software-compliance/","software compliance",{"title":453,"link":454,"items":459},"Measurement",{"config":455},{"icon":456,"href":457,"dataGaName":458,"dataGaLocation":348},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[460,464,468],{"text":461,"config":462},"Visibility & Measurement",{"href":457,"dataGaLocation":348,"dataGaName":463},"Visibility and Measurement",{"text":465,"config":466},"Value Stream Management",{"href":467,"dataGaLocation":348,"dataGaName":465},"/solutions/value-stream-management/",{"text":469,"config":470},"Analytics & Insights",{"href":471,"dataGaLocation":348,"dataGaName":472},"/solutions/analytics-and-insights/","Analytics and insights",{"title":474,"type":399,"items":475},"GitLab for",[476,482,488],{"text":477,"config":478},"Enterprise",{"icon":479,"href":480,"dataGaLocation":348,"dataGaName":481},"Building","/enterprise/","enterprise",{"text":483,"config":484},"Small Business",{"icon":485,"href":486,"dataGaLocation":348,"dataGaName":487},"Work","/small-business/","small business",{"text":489,"config":490},"Public Sector",{"icon":491,"href":492,"dataGaLocation":348,"dataGaName":493},"Organization","/solutions/public-sector/","public sector",{"text":495,"config":496},"Pricing",{"href":497,"dataGaName":498,"dataGaLocation":348,"dataNavLevelOne":498},"/pricing/","pricing",{"text":500,"config":501,"menu":503},"Resources",{"dataNavLevelOne":502},"resources",{"type":399,"link":504,"columns":508,"feature":601},{"text":505,"config":506},"View all resources",{"href":507,"dataGaName":502,"dataGaLocation":348},"/resources/",[509,541,568],{"title":510,"items":511},"Getting started",[512,517,522,526,531,536],{"text":513,"config":514},"Install",{"href":515,"dataGaName":516,"dataGaLocation":348},"/install/","install",{"text":518,"config":519},"Quick start guides",{"href":520,"dataGaName":521,"dataGaLocation":348},"/get-started/","quick setup checklists",{"text":523,"config":524},"Learn",{"href":292,"dataGaLocation":348,"dataGaName":525},"learn",{"text":527,"config":528},"Product documentation",{"href":529,"dataGaName":530,"dataGaLocation":348},"https://docs.gitlab.com/","product documentation",{"text":532,"config":533},"Best practice videos",{"href":534,"dataGaName":535,"dataGaLocation":348},"/getting-started-videos/","best practice videos",{"text":537,"config":538},"Integrations",{"href":539,"dataGaName":540,"dataGaLocation":348},"/integrations/","integrations",{"title":542,"items":543},"Discover",[544,549,554,559,563],{"text":545,"config":546},"Customer success stories",{"href":547,"dataGaName":548,"dataGaLocation":348},"/customers/","customer success stories",{"text":550,"config":551},"Blog",{"href":552,"dataGaName":553,"dataGaLocation":348},"/blog/","blog",{"text":555,"config":556},"Demo Hub",{"href":557,"dataGaName":558,"dataGaLocation":348},"/demo-hub/","demo hub",{"text":560,"config":561},"The Source",{"href":562,"dataGaName":553,"dataGaLocation":348},"/the-source/",{"text":564,"config":565},"Remote",{"href":566,"dataGaName":567,"dataGaLocation":348},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":569,"items":570},"Connect",[571,576,581,586,591,596],{"text":572,"config":573},"GitLab Services",{"href":574,"dataGaName":575,"dataGaLocation":348},"/services/","services",{"text":577,"config":578},"Contribute",{"href":579,"dataGaName":580,"dataGaLocation":348},"https://contributors.gitlab.com","contribute",{"text":582,"config":583},"Community",{"href":584,"dataGaName":585,"dataGaLocation":348},"/community/","community",{"text":587,"config":588},"Forum",{"href":589,"dataGaName":590,"dataGaLocation":348},"https://forum.gitlab.com/","forum",{"text":592,"config":593},"Events",{"href":594,"dataGaName":595,"dataGaLocation":348},"/events/","events",{"text":597,"config":598},"Partners",{"href":599,"dataGaName":600,"dataGaLocation":348},"/partners/","partners",{"config":602,"title":605,"text":606,"link":607},{"background":603,"textColor":604},"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":608,"config":609},"Read the latest",{"href":610,"dataGaName":611,"dataGaLocation":348},"/whats-new/","whats new",{"text":613,"config":614,"menu":616},"Company",{"dataNavLevelOne":615},"company",{"type":399,"columns":617},[618],{"items":619},[620,625,631,633,638,643,648,653,658,663],{"text":621,"config":622},"About",{"href":623,"dataGaName":624,"dataGaLocation":348},"/company/","about",{"text":626,"config":627,"footerGa":630},"Jobs",{"href":628,"dataGaName":629,"dataGaLocation":348},"/jobs/","jobs",{"dataGaName":629},{"text":592,"config":632},{"href":594,"dataGaName":595,"dataGaLocation":348},{"text":634,"config":635},"Leadership",{"href":636,"dataGaName":637,"dataGaLocation":348},"/company/team/e-group/","leadership",{"text":639,"config":640},"Handbook",{"href":641,"dataGaName":642,"dataGaLocation":348},"https://handbook.gitlab.com/","handbook",{"text":644,"config":645},"Investor relations",{"href":646,"dataGaName":647,"dataGaLocation":348},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":649,"config":650},"Trust Center",{"href":651,"dataGaName":652,"dataGaLocation":348},"/security/","trust center",{"text":654,"config":655},"AI Transparency Center",{"href":656,"dataGaName":657,"dataGaLocation":348},"/ai-transparency-center/","ai transparency center",{"text":659,"config":660},"Newsletter",{"href":661,"dataGaName":662,"dataGaLocation":348},"/company/contact/#contact-forms","newsletter",{"text":664,"config":665},"Press",{"href":666,"dataGaName":667,"dataGaLocation":348},"/press/","press",{"text":669,"config":670,"menu":671},"Contact us",{"dataNavLevelOne":615},{"type":399,"columns":672},[673],{"items":674},[675,680,685],{"text":676,"config":677},"Talk to sales",{"href":678,"dataGaName":679,"dataGaLocation":348},"/sales/","talk to sales",{"text":681,"config":682},"Support portal",{"href":683,"dataGaName":684,"dataGaLocation":348},"https://support.gitlab.com/hc/en-us","support portal",{"text":686,"config":687},"Customer portal",{"href":688,"dataGaName":689,"dataGaLocation":348},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":691,"login":692,"suggestions":699},"Close",{"text":693,"link":694},"To search repositories and projects, login to",{"text":695,"config":696},"gitlab.com",{"href":362,"dataGaName":697,"dataGaLocation":698},"search login","search",{"text":700,"default":701},"Suggestions",[702,704,708,710,714,718],{"text":379,"config":703},{"href":384,"dataGaName":379,"dataGaLocation":698},{"text":705,"config":706},"Code Suggestions (AI)",{"href":707,"dataGaName":705,"dataGaLocation":698},"/solutions/code-suggestions/",{"text":415,"config":709},{"href":417,"dataGaName":415,"dataGaLocation":698},{"text":711,"config":712},"GitLab on AWS",{"href":713,"dataGaName":711,"dataGaLocation":698},"/partners/technology-partners/aws/",{"text":715,"config":716},"GitLab on Google Cloud",{"href":717,"dataGaName":715,"dataGaLocation":698},"/partners/technology-partners/google-cloud-platform/",{"text":719,"config":720},"Why GitLab?",{"href":392,"dataGaName":719,"dataGaLocation":698},{"freeTrial":722,"mobileIcon":727,"desktopIcon":732,"secondaryButton":735},{"text":723,"config":724},"Start free trial",{"href":725,"dataGaName":353,"dataGaLocation":726},"https://gitlab.com/-/trials/new/","nav",{"altText":728,"config":729},"Gitlab Icon",{"src":730,"dataGaName":731,"dataGaLocation":726},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":728,"config":733},{"src":734,"dataGaName":731,"dataGaLocation":726},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":736,"config":737},"Get Started",{"href":738,"dataGaName":739,"dataGaLocation":726},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":741,"mobileIcon":745,"desktopIcon":747},{"text":742,"config":743},"Learn more about GitLab Duo",{"href":384,"dataGaName":744,"dataGaLocation":726},"gitlab duo",{"altText":728,"config":746},{"src":730,"dataGaName":731,"dataGaLocation":726},{"altText":728,"config":748},{"src":734,"dataGaName":731,"dataGaLocation":726},{"button":750,"mobileIcon":755,"desktopIcon":757},{"text":751,"config":752},"/switch",{"href":753,"dataGaName":754,"dataGaLocation":726},"#contact","switch",{"altText":728,"config":756},{"src":730,"dataGaName":731,"dataGaLocation":726},{"altText":728,"config":758},{"src":759,"dataGaName":731,"dataGaLocation":726},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":761,"mobileIcon":766,"desktopIcon":768},{"text":762,"config":763},"Back to pricing",{"href":497,"dataGaName":764,"dataGaLocation":726,"icon":765},"back to pricing","GoBack",{"altText":728,"config":767},{"src":730,"dataGaName":731,"dataGaLocation":726},{"altText":728,"config":769},{"src":734,"dataGaName":731,"dataGaLocation":726},{"title":771,"titleMobile":772,"button":773,"config":778},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":390,"config":774},{"href":775,"dataGaName":776,"dataGaLocation":777},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":779,"disabled":325},"release",{"data":781},{"text":782,"source":783,"edit":789,"contribute":794,"config":799,"items":804,"minimal":1013},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":784,"config":785},"View page source",{"href":786,"dataGaName":787,"dataGaLocation":788},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":790,"config":791},"Edit this page",{"href":792,"dataGaName":793,"dataGaLocation":788},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":795,"config":796},"Please contribute",{"href":797,"dataGaName":798,"dataGaLocation":788},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":800,"facebook":801,"youtube":802,"linkedin":803},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[805,852,905,949,981],{"title":495,"links":806,"subMenu":821},[807,811,816],{"text":808,"config":809},"View plans",{"href":497,"dataGaName":810,"dataGaLocation":788},"view plans",{"text":812,"config":813},"Why Premium?",{"href":814,"dataGaName":815,"dataGaLocation":788},"/pricing/premium/","why premium",{"text":817,"config":818},"Why Ultimate?",{"href":819,"dataGaName":820,"dataGaLocation":788},"/pricing/ultimate/","why ultimate",[822],{"title":823,"links":824},"Contact Us",[825,828,830,832,837,842,847],{"text":826,"config":827},"Contact sales",{"href":678,"dataGaName":358,"dataGaLocation":788},{"text":681,"config":829},{"href":683,"dataGaName":684,"dataGaLocation":788},{"text":686,"config":831},{"href":688,"dataGaName":689,"dataGaLocation":788},{"text":833,"config":834},"Status",{"href":835,"dataGaName":836,"dataGaLocation":788},"https://status.gitlab.com/","status",{"text":838,"config":839},"Terms of use",{"href":840,"dataGaName":841,"dataGaLocation":788},"/terms/","terms of use",{"text":843,"config":844},"Privacy statement",{"href":845,"dataGaName":846,"dataGaLocation":788},"/privacy/","privacy statement",{"text":848,"config":849},"Cookie preferences",{"dataGaName":850,"dataGaLocation":788,"id":851,"isOneTrustButton":328},"cookie preferences","ot-sdk-btn",{"title":395,"links":853,"subMenu":862},[854,858],{"text":855,"config":856},"DevSecOps platform",{"href":377,"dataGaName":857,"dataGaLocation":788},"devsecops platform",{"text":859,"config":860},"AI-Assisted Development",{"href":384,"dataGaName":861,"dataGaLocation":788},"ai-assisted development",[863],{"title":864,"links":865},"Topics",[866,871,876,880,885,890,895,900],{"text":867,"config":868},"CICD",{"href":869,"dataGaName":870,"dataGaLocation":788},"/topics/ci-cd/","cicd",{"text":872,"config":873},"GitOps",{"href":874,"dataGaName":875,"dataGaLocation":788},"/topics/gitops/","gitops",{"text":339,"config":877},{"href":878,"dataGaName":879,"dataGaLocation":788},"/topics/devops/","devops",{"text":881,"config":882},"Version Control",{"href":883,"dataGaName":884,"dataGaLocation":788},"/topics/version-control/","version control",{"text":886,"config":887},"DevSecOps",{"href":888,"dataGaName":889,"dataGaLocation":788},"/topics/devsecops/","devsecops",{"text":891,"config":892},"Cloud Native",{"href":893,"dataGaName":894,"dataGaLocation":788},"/topics/cloud-native/","cloud native",{"text":896,"config":897},"AI for Coding",{"href":898,"dataGaName":899,"dataGaLocation":788},"/topics/devops/ai-for-coding/","ai for coding",{"text":901,"config":902},"Agentic AI",{"href":903,"dataGaName":904,"dataGaLocation":788},"/topics/agentic-ai/","agentic ai",{"title":906,"links":907},"Solutions",[908,910,912,917,921,924,928,931,933,936,939,944],{"text":439,"config":909},{"href":434,"dataGaName":439,"dataGaLocation":788},{"text":428,"config":911},{"href":411,"dataGaName":412,"dataGaLocation":788},{"text":913,"config":914},"Agile development",{"href":915,"dataGaName":916,"dataGaLocation":788},"/solutions/agile-delivery/","agile delivery",{"text":918,"config":919},"SCM",{"href":424,"dataGaName":920,"dataGaLocation":788},"source code management",{"text":867,"config":922},{"href":417,"dataGaName":923,"dataGaLocation":788},"continuous integration & delivery",{"text":925,"config":926},"Value stream management",{"href":467,"dataGaName":927,"dataGaLocation":788},"value stream management",{"text":872,"config":929},{"href":930,"dataGaName":875,"dataGaLocation":788},"/solutions/gitops/",{"text":477,"config":932},{"href":480,"dataGaName":481,"dataGaLocation":788},{"text":934,"config":935},"Small business",{"href":486,"dataGaName":487,"dataGaLocation":788},{"text":937,"config":938},"Public sector",{"href":492,"dataGaName":493,"dataGaLocation":788},{"text":940,"config":941},"Education",{"href":942,"dataGaName":943,"dataGaLocation":788},"/solutions/education/","education",{"text":945,"config":946},"Financial services",{"href":947,"dataGaName":948,"dataGaLocation":788},"/solutions/finance/","financial services",{"title":500,"links":950},[951,953,955,957,960,962,965,967,969,971,973,975,977,979],{"text":513,"config":952},{"href":515,"dataGaName":516,"dataGaLocation":788},{"text":518,"config":954},{"href":520,"dataGaName":521,"dataGaLocation":788},{"text":523,"config":956},{"href":292,"dataGaName":525,"dataGaLocation":788},{"text":527,"config":958},{"href":529,"dataGaName":959,"dataGaLocation":788},"docs",{"text":550,"config":961},{"href":552,"dataGaName":553,"dataGaLocation":788},{"text":963,"config":964},"What's new",{"href":610,"dataGaName":611,"dataGaLocation":788},{"text":545,"config":966},{"href":547,"dataGaName":548,"dataGaLocation":788},{"text":564,"config":968},{"href":566,"dataGaName":567,"dataGaLocation":788},{"text":572,"config":970},{"href":574,"dataGaName":575,"dataGaLocation":788},{"text":577,"config":972},{"href":579,"dataGaName":580,"dataGaLocation":788},{"text":582,"config":974},{"href":584,"dataGaName":585,"dataGaLocation":788},{"text":587,"config":976},{"href":589,"dataGaName":590,"dataGaLocation":788},{"text":592,"config":978},{"href":594,"dataGaName":595,"dataGaLocation":788},{"text":597,"config":980},{"href":599,"dataGaName":600,"dataGaLocation":788},{"title":613,"links":982},[983,985,987,989,991,993,997,1002,1004,1006,1008],{"text":621,"config":984},{"href":623,"dataGaName":615,"dataGaLocation":788},{"text":626,"config":986},{"href":628,"dataGaName":629,"dataGaLocation":788},{"text":634,"config":988},{"href":636,"dataGaName":637,"dataGaLocation":788},{"text":639,"config":990},{"href":641,"dataGaName":642,"dataGaLocation":788},{"text":644,"config":992},{"href":646,"dataGaName":647,"dataGaLocation":788},{"text":994,"config":995},"Sustainability",{"href":996,"dataGaName":994,"dataGaLocation":788},"/sustainability/",{"text":998,"config":999},"Diversity, inclusion and belonging (DIB)",{"href":1000,"dataGaName":1001,"dataGaLocation":788},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":649,"config":1003},{"href":651,"dataGaName":652,"dataGaLocation":788},{"text":659,"config":1005},{"href":661,"dataGaName":662,"dataGaLocation":788},{"text":664,"config":1007},{"href":666,"dataGaName":667,"dataGaLocation":788},{"text":1009,"config":1010},"Modern Slavery Transparency Statement",{"href":1011,"dataGaName":1012,"dataGaLocation":788},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1014},[1015,1018,1021],{"text":1016,"config":1017},"Terms",{"href":840,"dataGaName":841,"dataGaLocation":788},{"text":1019,"config":1020},"Cookies",{"dataGaName":850,"dataGaLocation":788,"id":851,"isOneTrustButton":328},{"text":1022,"config":1023},"Privacy",{"href":845,"dataGaName":846,"dataGaLocation":788},[1025],{"id":1026,"title":7,"body":324,"config":1027,"content":1029,"description":324,"extension":1033,"meta":1034,"navigation":328,"path":1035,"seo":1036,"stem":1037,"__hash__":1038},"blogAuthors/en-us/blog/authors/william-arias.yml",{"template":1028},"BlogAuthor",{"name":7,"config":1030},{"headshot":1031,"ctfId":1032},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749667549/Blog/Author%20Headshots/warias-headshot.jpg","warias","yml",{},"/en-us/blog/authors/william-arias",{},"en-us/blog/authors/william-arias","1h59SugLZ7hePm0SChSE5WG0Z3uurYxGrujcXoxs4tA",[1040,1048,1056],{"title":1041,"description":1042,"heroImage":1043,"category":320,"date":1044,"authors":1045,"slug":1047,"externalUrl":324},"CEO Shadow Takeaways from Jacie","Recap of my experience in the CEO Shadow Program.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664102/Blog/Hero%20Images/gitlab-values-cover.png","2021-05-18",[1046],"Jacie Bandur","ceo-shadow-recap",{"title":1049,"description":1050,"heroImage":1051,"category":320,"date":1052,"authors":1053,"slug":1055,"externalUrl":324},"Why I love contributing to GitLab","Making small meaningful changes is what it's all about.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749679501/Blog/Hero%20Images/new-feature.png","2021-05-11",[1054],"Austin Regnery","why-i-love-contributing-to-gitlab",{"title":1057,"description":1058,"heroImage":1059,"category":320,"date":1052,"authors":1060,"slug":1062,"externalUrl":324},"Placebo Lines on the Pipeline Graph","Have you noticed the connecting lines missing on your pipelines lately? Here's why","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749679507/Blog/Hero%20Images/ci-cd.png",[1061],"Sam Beckham","placebo-lines-on-the-pipeline-graph",{"promotions":1064},[1065,1079,1091,1103],{"id":1066,"categories":1067,"header":1069,"text":1070,"button":1071,"image":1076},"ai-modernization",[1068],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1072,"config":1073},"Get your AI maturity score",{"href":1074,"dataGaName":1075,"dataGaLocation":553},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1077},{"src":1078},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1080,"categories":1081,"header":1083,"text":1070,"button":1084,"image":1088},"devops-modernization",[1082,889],"product","Are you just managing tools or shipping innovation?",{"text":1085,"config":1086},"Get your DevOps maturity score",{"href":1087,"dataGaName":1075,"dataGaLocation":553},"/assessments/devops-modernization-assessment/",{"config":1089},{"src":1090},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1092,"categories":1093,"header":1095,"text":1070,"button":1096,"image":1100},"security-modernization",[1094],"security","Are you trading speed for security?",{"text":1097,"config":1098},"Get your security maturity score",{"href":1099,"dataGaName":1075,"dataGaLocation":553},"/assessments/security-modernization-assessment/",{"config":1101},{"src":1102},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1104,"paths":1105,"header":1108,"text":1109,"button":1110,"image":1115},"github-azure-migration",[1106,1107],"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":1111,"config":1112},"See how GitLab compares to GitHub",{"href":1113,"dataGaName":1114,"dataGaLocation":553},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1116},{"src":1090},{"header":1118,"blurb":1119,"button":1120,"secondaryButton":1125},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1121,"config":1122},"Get your free trial",{"href":1123,"dataGaName":353,"dataGaLocation":1124},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":826,"config":1126},{"href":678,"dataGaName":358,"dataGaLocation":1124},1786803747755]