[{"data":1,"prerenderedAt":1156},["ShallowReactive",2],{"/blog/how-to-translate-bamboo-agent-capabilities-to-gitlab-runner-tags":3,"navigation-en-us":369,"banner-en-us":796,"footer-en-us":806,"blog-post-authors-en-us-Abubakar Siddiq Ango":1051,"blog-related-posts-en-us-how-to-translate-bamboo-agent-capabilities-to-gitlab-runner-tags":1066,"blog-promotions-en-us":1092,"next-steps-en-us":1146},{"id":4,"title":5,"authors":6,"body":8,"category":348,"date":349,"description":350,"extension":351,"externalUrl":352,"faq":352,"featured":240,"heroImage":353,"meta":354,"navigation":240,"path":355,"seo":356,"slug":361,"stem":362,"tags":363,"template":367,"updatedDate":352,"__hash__":368},"blogPosts/en-us/blog/how-to-translate-bamboo-agent-capabilities-to-gitlab-runner-tags.md","How to translate Bamboo agent capabilities to GitLab Runner tags  ",[7],"Abubakar Siddiq Ango",{"type":9,"value":10,"toc":342},"minimark",[11,15,25,28,31,34,53,56,61,75,86,90,93,181,188,192,207,211,214,286,301,309,324,327,338],[12,13,14],"p",{},"CI pipelines often start simple – a single job building a binary and pushing it to an artifact repository or to some production environment. Ever-changing software requirements introduce more complexities, such as adding more jobs to perform certain checks and reviewing the output before the final build job is executed.",[12,16,17,18,24],{},"These complexities increase exponentially when builds are expected to target varying systems with different system architectures or resource needs. This is evident in projects like operating systems, mobile apps, or software distributions that support multiple deployment platforms. To account for the varying needs of builds in these types of environments, having multiple runners that match needed requirements is key, and that's where ",[19,20,23],"a",{"href":21,"rel":22},"https://docs.gitlab.com/runner/",[],"GitLab Runner"," tags come in. If you are coming from Atlassian's Bamboo, they are called \"agent capabilities.\"",[12,26,27],{},"Runner tags allow organizing runners by a tag that signifies a specific use case they support; these tags are then used to make sure CI jobs run on a runner that meets their requirements. A job can require GPU resources that are only available on a handful of runners; tagging the job to the tags of the runner allows it to be scheduled on the runner with GPUs.",[12,29,30],{},"Agent capabilities on Bamboo are used to achieve the same functionality by specifying binaries or custom identifiers that must be matched or available for a job to run on a Bamboo agent. In this blog post, we will be looking at how to translate Bamboo agent capabilities to GitLab Runner tags.",[12,32,33],{},"Bamboo has varying agent capabilities:",[35,36,37,41,44,47,50],"ul",{},[38,39,40],"li",{},"Executable capability specifies executables that are available on an agent.",[38,42,43],{},"JDK capability specifies that the Java Development Kit is installed and available for builds.",[38,45,46],{},"Version Control capability lets Bamboo know the version control systems set up on an agent and where the client application is located.",[38,48,49],{},"Docker capability is used to define the agents where Docker is installed for Docker tasks",[38,51,52],{},"Custom capability uses key/value identifiers to identify a unique functionality an agent provides.",[12,54,55],{},"GitLab makes the process easier by using tags to identify Runners, some of which can be assigned multiple tags to denote the varying functionalities they can provide to jobs. Let's look at how you can use Runner tags in GitLab.",[57,58,60],"h2",{"id":59},"adding-tags-to-gitlab-runner","Adding tags to GitLab Runner",[12,62,63,64,69,70,74],{},"When ",[19,65,68],{"href":66,"rel":67},"https://docs.gitlab.com/runner/register/",[],"registering a runner"," after installation, one of the steps requires providing a list of comma-separated tags that can be used. If none are provided at this stage, you can always edit the ",[71,72,73],"code",{},"/etc/gitlab-runner/config.toml"," file and add any missing tags.",[12,76,77,78,81,82,85],{},"You can also manage the tags of a runner in GitLab by accessing the runner's edit page and updating the ",[71,79,80],{},"Tags"," field. You have the option for the runner to be exclusive to jobs that are tagged appropriately, or when there are no tagged jobs to run, it should run untagged jobs, too. Checking ",[71,83,84],{},"Run untagged jobs"," enables this behavior.",[57,87,89],{"id":88},"using-tags-in-gitlab-ciyaml-file","Using tags in .gitlab-ci.yaml file",[12,91,92],{},"To run a job on a specific runner, add the relevant tags to the job's configuration, as shown below:",[94,95,100],"pre",{"className":96,"code":97,"language":98,"meta":99,"style":99},"language-yaml shiki shiki-themes github-light","build_ios:\n  image: macos-13-xcode-14\n  stage: build\n  script:\n    - bundle check --path vendor/bundle || bundle install --path vendor/bundle --jobs $(nproc)\n    - bundle exec fastlane build\n  tags: \n    - saas-macos-medium-m1\n\n","yaml","",[71,101,102,115,128,139,147,156,164,173],{"__ignoreMap":99},[103,104,107,111],"span",{"class":105,"line":106},"line",1,[103,108,110],{"class":109},"shJU0","build_ios",[103,112,114],{"class":113},"sgsFI",":\n",[103,116,118,121,124],{"class":105,"line":117},2,[103,119,120],{"class":109},"  image",[103,122,123],{"class":113},": ",[103,125,127],{"class":126},"sYBdl","macos-13-xcode-14\n",[103,129,131,134,136],{"class":105,"line":130},3,[103,132,133],{"class":109},"  stage",[103,135,123],{"class":113},[103,137,138],{"class":126},"build\n",[103,140,142,145],{"class":105,"line":141},4,[103,143,144],{"class":109},"  script",[103,146,114],{"class":113},[103,148,150,153],{"class":105,"line":149},5,[103,151,152],{"class":113},"    - ",[103,154,155],{"class":126},"bundle check --path vendor/bundle || bundle install --path vendor/bundle --jobs $(nproc)\n",[103,157,159,161],{"class":105,"line":158},6,[103,160,152],{"class":113},[103,162,163],{"class":126},"bundle exec fastlane build\n",[103,165,167,170],{"class":105,"line":166},7,[103,168,169],{"class":109},"  tags",[103,171,172],{"class":113},": \n",[103,174,176,178],{"class":105,"line":175},8,[103,177,152],{"class":113},[103,179,180],{"class":126},"saas-macos-medium-m1\n",[12,182,183,184,187],{},"In the example above, the job builds an iOS application only on runners operating on a macOS device with an M1 chip and tagged ",[71,185,186],{},"saas-macos-medium-m1",".",[57,189,191],{"id":190},"using-multiple-tags","Using multiple tags",[12,193,194,195,198,199,202,203,206],{},"A job can specify multiple tags to target a diverse range of runners, especially in organizations that run several fleets of runners as part of their software development lifecycle. A job will only run if a runner is found that has all the tags the job has been tagged with. For example, if a job has ",[71,196,197],{},"[linux, android, fastlane]"," tags, a runner with ",[71,200,201],{},"[ android, fastlane]"," or ",[71,204,205],{},"[ linux, android]"," will not execute the job because the full set of tags does not match the runner.",[57,208,210],{"id":209},"dynamic-jobs-with-tags-and-variables","Dynamic jobs with tags and variables",[12,212,213],{},"You can use variables to determine the values of tags and thus dynamically influence which runners pick up the jobs. For example:",[94,215,217],{"className":96,"code":216,"language":98,"meta":99,"style":99},"variables:\n  KUBERNETES_RUNNER: kubernetes\n\n  job:\n    tags:\n      - docker\n      - $KUBERNETES_RUNNER\n    script:\n      - echo \"Hello runner selector feature\"\n\n",[71,218,219,226,236,242,249,256,264,271,278],{"__ignoreMap":99},[103,220,221,224],{"class":105,"line":106},[103,222,223],{"class":109},"variables",[103,225,114],{"class":113},[103,227,228,231,233],{"class":105,"line":117},[103,229,230],{"class":109},"  KUBERNETES_RUNNER",[103,232,123],{"class":113},[103,234,235],{"class":126},"kubernetes\n",[103,237,238],{"class":105,"line":130},[103,239,241],{"emptyLinePlaceholder":240},true,"\n",[103,243,244,247],{"class":105,"line":141},[103,245,246],{"class":109},"  job",[103,248,114],{"class":113},[103,250,251,254],{"class":105,"line":149},[103,252,253],{"class":109},"    tags",[103,255,114],{"class":113},[103,257,258,261],{"class":105,"line":158},[103,259,260],{"class":113},"      - ",[103,262,263],{"class":126},"docker\n",[103,265,266,268],{"class":105,"line":166},[103,267,260],{"class":113},[103,269,270],{"class":126},"$KUBERNETES_RUNNER\n",[103,272,273,276],{"class":105,"line":175},[103,274,275],{"class":109},"    script",[103,277,114],{"class":113},[103,279,281,283],{"class":105,"line":280},9,[103,282,260],{"class":113},[103,284,285],{"class":126},"echo \"Hello runner selector feature\"\n",[12,287,288,289,292,293,300],{},"In this example, only runners tagged with ",[71,290,291],{},"kubernetes"," will execute the job. You can take this further in more complex pipelines with ",[19,294,297],{"href":295,"rel":296},"https://docs.gitlab.com/ci/yaml/#parallelmatrix",[],[71,298,299],{},"parallel: matrix",". Here is an example:",[94,302,307],{"className":303,"code":305,"language":306,"meta":99},[304],"language-text","deploystacks:\n  stage: deploy\n  parallel:\n    matrix:\n      - PROVIDER: aws\n        STACK: [monitoring, app1]\n      - PROVIDER: gcp\n        STACK: [data]\n  tags:\n    - ${PROVIDER}-${STACK}\n  environment: $PROVIDER/$STACK\n\n","text",[71,308,305],{"__ignoreMap":99},[12,310,311,312,315,316,319,320,323],{},"This example ends up with three parallel jobs with three different tags for each: ",[71,313,314],{},"aws-monitoring",", ",[71,317,318],{},"aws-app1"," and ",[71,321,322],{},"gcp-data",", thus targeting possibly three different runners.",[12,325,326],{},"Using tags in your GitLab CI configuration gives you the flexibility to determine where and how your applications are built, to use resources more efficiently as scarce resources can be limited to certain runners, and to determine how jobs are allocated to those runners.",[328,329,330],"blockquote",{},[12,331,332,333,187],{},"Learn more about ",[19,334,337],{"href":335,"rel":336},"https://about.gitlab.com/move-to-gitlab-from-atlassian/",[],"how to make the move from Atlassian to GitLab",[339,340,341],"style",{},"html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":99,"searchDepth":117,"depth":117,"links":343},[344,345,346,347],{"id":59,"depth":117,"text":60},{"id":88,"depth":117,"text":89},{"id":190,"depth":117,"text":191},{"id":209,"depth":117,"text":210},"engineering","2024-02-22","This tutorial demonstrates how to use tags to organize GitLab Runners when building complex CI/CD pipelines.","md",null,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663019/Blog/Hero%20Images/AdobeStock_519147119.jpg",{},"/en-us/blog/how-to-translate-bamboo-agent-capabilities-to-gitlab-runner-tags",{"title":5,"description":350,"ogTitle":5,"ogDescription":350,"noIndex":357,"ogImage":353,"ogUrl":358,"ogSiteName":359,"ogType":360,"canonicalUrls":358},false,"https://about.gitlab.com/blog/how-to-translate-bamboo-agent-capabilities-to-gitlab-runner-tags","https://about.gitlab.com","article","how-to-translate-bamboo-agent-capabilities-to-gitlab-runner-tags","en-us/blog/how-to-translate-bamboo-agent-capabilities-to-gitlab-runner-tags",[364,365,366],"CI/CD","CI","tutorial","BlogPost","FVyW4eTd-mulkuXo6aFNlehanFZYSp4G-jZiG01-dNE",{"logo":370,"freeTrial":375,"sales":380,"login":385,"items":390,"search":716,"minimal":747,"duo":766,"switchNav":775,"pricingDeployment":786},{"config":371},{"href":372,"dataGaName":373,"dataGaLocation":374},"/","gitlab logo","header",{"text":376,"config":377},"Get free trial",{"href":378,"dataGaName":379,"dataGaLocation":374},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":381,"config":382},"Request a demo",{"href":383,"dataGaName":384,"dataGaLocation":374},"/sales/?contact-topic=request-demo","sales",{"text":386,"config":387},"Sign in",{"href":388,"dataGaName":389,"dataGaLocation":374},"https://gitlab.com/users/sign_in/","sign in",[391,420,519,524,638,694],{"text":392,"config":393,"menu":395},"Platform",{"dataNavLevelOne":394},"platform",{"type":396,"columns":397},"cards",[398,404,412],{"title":392,"description":399,"link":400},"The intelligent orchestration platform for DevSecOps",{"text":401,"config":402},"Explore our Platform",{"href":403,"dataGaName":394,"dataGaLocation":374},"/platform/",{"title":405,"description":406,"link":407},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":408,"config":409},"Meet GitLab Duo",{"href":410,"dataGaName":411,"dataGaLocation":374},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":413,"description":414,"link":415},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":416,"config":417},"Learn more",{"href":418,"dataGaName":419,"dataGaLocation":374},"/why-gitlab/","why gitlab",{"text":421,"left":240,"config":422,"menu":424},"Product",{"dataNavLevelOne":423},"solutions",{"type":425,"link":426,"columns":430,"feature":498},"lists",{"text":427,"config":428},"View all Solutions",{"href":429,"dataGaName":423,"dataGaLocation":374},"/solutions/",[431,454,477],{"title":432,"description":433,"link":434,"items":439},"Automation","CI/CD and automation to accelerate deployment",{"config":435},{"icon":436,"href":437,"dataGaName":438,"dataGaLocation":374},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[440,443,446,450],{"text":364,"config":441},{"href":442,"dataGaLocation":374,"dataGaName":364},"/solutions/continuous-integration/",{"text":405,"config":444},{"href":410,"dataGaLocation":374,"dataGaName":445},"gitlab duo agent platform - product menu",{"text":447,"config":448},"Source Code Management",{"href":449,"dataGaLocation":374,"dataGaName":447},"/solutions/source-code-management/",{"text":451,"config":452},"Automated Software Delivery",{"href":437,"dataGaLocation":374,"dataGaName":453},"Automated software delivery",{"title":455,"description":456,"link":457,"items":462},"Security","Deliver code faster without compromising security",{"config":458},{"href":459,"dataGaName":460,"dataGaLocation":374,"icon":461},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[463,467,472],{"text":464,"config":465},"Application Security Testing",{"href":459,"dataGaName":466,"dataGaLocation":374},"Application security testing",{"text":468,"config":469},"Software Supply Chain Security",{"href":470,"dataGaLocation":374,"dataGaName":471},"/solutions/supply-chain/","Software supply chain security",{"text":473,"config":474},"Software Compliance",{"href":475,"dataGaName":476,"dataGaLocation":374},"/solutions/software-compliance/","software compliance",{"title":478,"link":479,"items":484},"Measurement",{"config":480},{"icon":481,"href":482,"dataGaName":483,"dataGaLocation":374},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[485,489,493],{"text":486,"config":487},"Visibility & Measurement",{"href":482,"dataGaLocation":374,"dataGaName":488},"Visibility and Measurement",{"text":490,"config":491},"Value Stream Management",{"href":492,"dataGaLocation":374,"dataGaName":490},"/solutions/value-stream-management/",{"text":494,"config":495},"Analytics & Insights",{"href":496,"dataGaLocation":374,"dataGaName":497},"/solutions/analytics-and-insights/","Analytics and insights",{"title":499,"type":425,"items":500},"GitLab for",[501,507,513],{"text":502,"config":503},"Enterprise",{"icon":504,"href":505,"dataGaLocation":374,"dataGaName":506},"Building","/enterprise/","enterprise",{"text":508,"config":509},"Small Business",{"icon":510,"href":511,"dataGaLocation":374,"dataGaName":512},"Work","/small-business/","small business",{"text":514,"config":515},"Public Sector",{"icon":516,"href":517,"dataGaLocation":374,"dataGaName":518},"Organization","/solutions/public-sector/","public sector",{"text":520,"config":521},"Pricing",{"href":522,"dataGaName":523,"dataGaLocation":374,"dataNavLevelOne":523},"/pricing/","pricing",{"text":525,"config":526,"menu":528},"Resources",{"dataNavLevelOne":527},"resources",{"type":425,"link":529,"columns":533,"feature":627},{"text":530,"config":531},"View all resources",{"href":532,"dataGaName":527,"dataGaLocation":374},"/resources/",[534,567,594],{"title":535,"items":536},"Getting started",[537,542,547,552,557,562],{"text":538,"config":539},"Install",{"href":540,"dataGaName":541,"dataGaLocation":374},"/install/","install",{"text":543,"config":544},"Quick start guides",{"href":545,"dataGaName":546,"dataGaLocation":374},"/get-started/","quick setup checklists",{"text":548,"config":549},"Learn",{"href":550,"dataGaLocation":374,"dataGaName":551},"https://university.gitlab.com/","learn",{"text":553,"config":554},"Product documentation",{"href":555,"dataGaName":556,"dataGaLocation":374},"https://docs.gitlab.com/","product documentation",{"text":558,"config":559},"Best practice videos",{"href":560,"dataGaName":561,"dataGaLocation":374},"/getting-started-videos/","best practice videos",{"text":563,"config":564},"Integrations",{"href":565,"dataGaName":566,"dataGaLocation":374},"/integrations/","integrations",{"title":568,"items":569},"Discover",[570,575,580,585,589],{"text":571,"config":572},"Customer success stories",{"href":573,"dataGaName":574,"dataGaLocation":374},"/customers/","customer success stories",{"text":576,"config":577},"Blog",{"href":578,"dataGaName":579,"dataGaLocation":374},"/blog/","blog",{"text":581,"config":582},"Demo Hub",{"href":583,"dataGaName":584,"dataGaLocation":374},"/demo-hub/","demo hub",{"text":586,"config":587},"The Source",{"href":588,"dataGaName":579,"dataGaLocation":374},"/the-source/",{"text":590,"config":591},"Remote",{"href":592,"dataGaName":593,"dataGaLocation":374},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":595,"items":596},"Connect",[597,602,607,612,617,622],{"text":598,"config":599},"GitLab Services",{"href":600,"dataGaName":601,"dataGaLocation":374},"/services/","services",{"text":603,"config":604},"Contribute",{"href":605,"dataGaName":606,"dataGaLocation":374},"https://contributors.gitlab.com","contribute",{"text":608,"config":609},"Community",{"href":610,"dataGaName":611,"dataGaLocation":374},"/community/","community",{"text":613,"config":614},"Forum",{"href":615,"dataGaName":616,"dataGaLocation":374},"https://forum.gitlab.com/","forum",{"text":618,"config":619},"Events",{"href":620,"dataGaName":621,"dataGaLocation":374},"/events/","events",{"text":623,"config":624},"Partners",{"href":625,"dataGaName":626,"dataGaLocation":374},"/partners/","partners",{"config":628,"title":631,"text":632,"link":633},{"background":629,"textColor":630},"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":634,"config":635},"Read the latest",{"href":636,"dataGaName":637,"dataGaLocation":374},"/whats-new/","whats new",{"text":639,"config":640,"menu":642},"Company",{"dataNavLevelOne":641},"company",{"type":425,"columns":643},[644],{"items":645},[646,651,657,659,664,669,674,679,684,689],{"text":647,"config":648},"About",{"href":649,"dataGaName":650,"dataGaLocation":374},"/company/","about",{"text":652,"config":653,"footerGa":656},"Jobs",{"href":654,"dataGaName":655,"dataGaLocation":374},"/jobs/","jobs",{"dataGaName":655},{"text":618,"config":658},{"href":620,"dataGaName":621,"dataGaLocation":374},{"text":660,"config":661},"Leadership",{"href":662,"dataGaName":663,"dataGaLocation":374},"/company/team/e-group/","leadership",{"text":665,"config":666},"Handbook",{"href":667,"dataGaName":668,"dataGaLocation":374},"https://handbook.gitlab.com/","handbook",{"text":670,"config":671},"Investor relations",{"href":672,"dataGaName":673,"dataGaLocation":374},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":675,"config":676},"Trust Center",{"href":677,"dataGaName":678,"dataGaLocation":374},"/security/","trust center",{"text":680,"config":681},"AI Transparency Center",{"href":682,"dataGaName":683,"dataGaLocation":374},"/ai-transparency-center/","ai transparency center",{"text":685,"config":686},"Newsletter",{"href":687,"dataGaName":688,"dataGaLocation":374},"/company/contact/#contact-forms","newsletter",{"text":690,"config":691},"Press",{"href":692,"dataGaName":693,"dataGaLocation":374},"/press/","press",{"text":695,"config":696,"menu":697},"Contact us",{"dataNavLevelOne":641},{"type":425,"columns":698},[699],{"items":700},[701,706,711],{"text":702,"config":703},"Talk to sales",{"href":704,"dataGaName":705,"dataGaLocation":374},"/sales/","talk to sales",{"text":707,"config":708},"Support portal",{"href":709,"dataGaName":710,"dataGaLocation":374},"https://support.gitlab.com/hc/en-us","support portal",{"text":712,"config":713},"Customer portal",{"href":714,"dataGaName":715,"dataGaLocation":374},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":717,"login":718,"suggestions":725},"Close",{"text":719,"link":720},"To search repositories and projects, login to",{"text":721,"config":722},"gitlab.com",{"href":388,"dataGaName":723,"dataGaLocation":724},"search login","search",{"text":726,"default":727},"Suggestions",[728,730,734,736,740,744],{"text":405,"config":729},{"href":410,"dataGaName":405,"dataGaLocation":724},{"text":731,"config":732},"Code Suggestions (AI)",{"href":733,"dataGaName":731,"dataGaLocation":724},"/solutions/code-suggestions/",{"text":364,"config":735},{"href":442,"dataGaName":364,"dataGaLocation":724},{"text":737,"config":738},"GitLab on AWS",{"href":739,"dataGaName":737,"dataGaLocation":724},"/partners/technology-partners/aws/",{"text":741,"config":742},"GitLab on Google Cloud",{"href":743,"dataGaName":741,"dataGaLocation":724},"/partners/technology-partners/google-cloud-platform/",{"text":745,"config":746},"Why GitLab?",{"href":418,"dataGaName":745,"dataGaLocation":724},{"freeTrial":748,"mobileIcon":753,"desktopIcon":758,"secondaryButton":761},{"text":749,"config":750},"Start free trial",{"href":751,"dataGaName":379,"dataGaLocation":752},"https://gitlab.com/-/trials/new/","nav",{"altText":754,"config":755},"Gitlab Icon",{"src":756,"dataGaName":757,"dataGaLocation":752},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":754,"config":759},{"src":760,"dataGaName":757,"dataGaLocation":752},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":762,"config":763},"Get Started",{"href":764,"dataGaName":765,"dataGaLocation":752},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":767,"mobileIcon":771,"desktopIcon":773},{"text":768,"config":769},"Learn more about GitLab Duo",{"href":410,"dataGaName":770,"dataGaLocation":752},"gitlab duo",{"altText":754,"config":772},{"src":756,"dataGaName":757,"dataGaLocation":752},{"altText":754,"config":774},{"src":760,"dataGaName":757,"dataGaLocation":752},{"button":776,"mobileIcon":781,"desktopIcon":783},{"text":777,"config":778},"/switch",{"href":779,"dataGaName":780,"dataGaLocation":752},"#contact","switch",{"altText":754,"config":782},{"src":756,"dataGaName":757,"dataGaLocation":752},{"altText":754,"config":784},{"src":785,"dataGaName":757,"dataGaLocation":752},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":787,"mobileIcon":792,"desktopIcon":794},{"text":788,"config":789},"Back to pricing",{"href":522,"dataGaName":790,"dataGaLocation":752,"icon":791},"back to pricing","GoBack",{"altText":754,"config":793},{"src":756,"dataGaName":757,"dataGaLocation":752},{"altText":754,"config":795},{"src":760,"dataGaName":757,"dataGaLocation":752},{"title":797,"titleMobile":798,"button":799,"config":804},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":416,"config":800},{"href":801,"dataGaName":802,"dataGaLocation":803},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":805,"disabled":357},"release",{"data":807},{"text":808,"source":809,"edit":815,"contribute":820,"config":825,"items":830,"minimal":1040},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":810,"config":811},"View page source",{"href":812,"dataGaName":813,"dataGaLocation":814},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":816,"config":817},"Edit this page",{"href":818,"dataGaName":819,"dataGaLocation":814},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":821,"config":822},"Please contribute",{"href":823,"dataGaName":824,"dataGaLocation":814},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":826,"facebook":827,"youtube":828,"linkedin":829},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[831,878,932,976,1008],{"title":520,"links":832,"subMenu":847},[833,837,842],{"text":834,"config":835},"View plans",{"href":522,"dataGaName":836,"dataGaLocation":814},"view plans",{"text":838,"config":839},"Why Premium?",{"href":840,"dataGaName":841,"dataGaLocation":814},"/pricing/premium/","why premium",{"text":843,"config":844},"Why Ultimate?",{"href":845,"dataGaName":846,"dataGaLocation":814},"/pricing/ultimate/","why ultimate",[848],{"title":849,"links":850},"Contact Us",[851,854,856,858,863,868,873],{"text":852,"config":853},"Contact sales",{"href":704,"dataGaName":384,"dataGaLocation":814},{"text":707,"config":855},{"href":709,"dataGaName":710,"dataGaLocation":814},{"text":712,"config":857},{"href":714,"dataGaName":715,"dataGaLocation":814},{"text":859,"config":860},"Status",{"href":861,"dataGaName":862,"dataGaLocation":814},"https://status.gitlab.com/","status",{"text":864,"config":865},"Terms of use",{"href":866,"dataGaName":867,"dataGaLocation":814},"/terms/","terms of use",{"text":869,"config":870},"Privacy statement",{"href":871,"dataGaName":872,"dataGaLocation":814},"/privacy/","privacy statement",{"text":874,"config":875},"Cookie preferences",{"dataGaName":876,"dataGaLocation":814,"id":877,"isOneTrustButton":240},"cookie preferences","ot-sdk-btn",{"title":421,"links":879,"subMenu":888},[880,884],{"text":881,"config":882},"DevSecOps platform",{"href":403,"dataGaName":883,"dataGaLocation":814},"devsecops platform",{"text":885,"config":886},"AI-Assisted Development",{"href":410,"dataGaName":887,"dataGaLocation":814},"ai-assisted development",[889],{"title":890,"links":891},"Topics",[892,897,902,907,912,917,922,927],{"text":893,"config":894},"CICD",{"href":895,"dataGaName":896,"dataGaLocation":814},"/topics/ci-cd/","cicd",{"text":898,"config":899},"GitOps",{"href":900,"dataGaName":901,"dataGaLocation":814},"/topics/gitops/","gitops",{"text":903,"config":904},"DevOps",{"href":905,"dataGaName":906,"dataGaLocation":814},"/topics/devops/","devops",{"text":908,"config":909},"Version Control",{"href":910,"dataGaName":911,"dataGaLocation":814},"/topics/version-control/","version control",{"text":913,"config":914},"DevSecOps",{"href":915,"dataGaName":916,"dataGaLocation":814},"/topics/devsecops/","devsecops",{"text":918,"config":919},"Cloud Native",{"href":920,"dataGaName":921,"dataGaLocation":814},"/topics/cloud-native/","cloud native",{"text":923,"config":924},"AI for Coding",{"href":925,"dataGaName":926,"dataGaLocation":814},"/topics/devops/ai-for-coding/","ai for coding",{"text":928,"config":929},"Agentic AI",{"href":930,"dataGaName":931,"dataGaLocation":814},"/topics/agentic-ai/","agentic ai",{"title":933,"links":934},"Solutions",[935,937,939,944,948,951,955,958,960,963,966,971],{"text":464,"config":936},{"href":459,"dataGaName":464,"dataGaLocation":814},{"text":453,"config":938},{"href":437,"dataGaName":438,"dataGaLocation":814},{"text":940,"config":941},"Agile development",{"href":942,"dataGaName":943,"dataGaLocation":814},"/solutions/agile-delivery/","agile delivery",{"text":945,"config":946},"SCM",{"href":449,"dataGaName":947,"dataGaLocation":814},"source code management",{"text":893,"config":949},{"href":442,"dataGaName":950,"dataGaLocation":814},"continuous integration & delivery",{"text":952,"config":953},"Value stream management",{"href":492,"dataGaName":954,"dataGaLocation":814},"value stream management",{"text":898,"config":956},{"href":957,"dataGaName":901,"dataGaLocation":814},"/solutions/gitops/",{"text":502,"config":959},{"href":505,"dataGaName":506,"dataGaLocation":814},{"text":961,"config":962},"Small business",{"href":511,"dataGaName":512,"dataGaLocation":814},{"text":964,"config":965},"Public sector",{"href":517,"dataGaName":518,"dataGaLocation":814},{"text":967,"config":968},"Education",{"href":969,"dataGaName":970,"dataGaLocation":814},"/solutions/education/","education",{"text":972,"config":973},"Financial services",{"href":974,"dataGaName":975,"dataGaLocation":814},"/solutions/finance/","financial services",{"title":525,"links":977},[978,980,982,984,987,989,992,994,996,998,1000,1002,1004,1006],{"text":538,"config":979},{"href":540,"dataGaName":541,"dataGaLocation":814},{"text":543,"config":981},{"href":545,"dataGaName":546,"dataGaLocation":814},{"text":548,"config":983},{"href":550,"dataGaName":551,"dataGaLocation":814},{"text":553,"config":985},{"href":555,"dataGaName":986,"dataGaLocation":814},"docs",{"text":576,"config":988},{"href":578,"dataGaName":579,"dataGaLocation":814},{"text":990,"config":991},"What's new",{"href":636,"dataGaName":637,"dataGaLocation":814},{"text":571,"config":993},{"href":573,"dataGaName":574,"dataGaLocation":814},{"text":590,"config":995},{"href":592,"dataGaName":593,"dataGaLocation":814},{"text":598,"config":997},{"href":600,"dataGaName":601,"dataGaLocation":814},{"text":603,"config":999},{"href":605,"dataGaName":606,"dataGaLocation":814},{"text":608,"config":1001},{"href":610,"dataGaName":611,"dataGaLocation":814},{"text":613,"config":1003},{"href":615,"dataGaName":616,"dataGaLocation":814},{"text":618,"config":1005},{"href":620,"dataGaName":621,"dataGaLocation":814},{"text":623,"config":1007},{"href":625,"dataGaName":626,"dataGaLocation":814},{"title":639,"links":1009},[1010,1012,1014,1016,1018,1020,1024,1029,1031,1033,1035],{"text":647,"config":1011},{"href":649,"dataGaName":641,"dataGaLocation":814},{"text":652,"config":1013},{"href":654,"dataGaName":655,"dataGaLocation":814},{"text":660,"config":1015},{"href":662,"dataGaName":663,"dataGaLocation":814},{"text":665,"config":1017},{"href":667,"dataGaName":668,"dataGaLocation":814},{"text":670,"config":1019},{"href":672,"dataGaName":673,"dataGaLocation":814},{"text":1021,"config":1022},"Sustainability",{"href":1023,"dataGaName":1021,"dataGaLocation":814},"/sustainability/",{"text":1025,"config":1026},"Diversity, inclusion and belonging (DIB)",{"href":1027,"dataGaName":1028,"dataGaLocation":814},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":675,"config":1030},{"href":677,"dataGaName":678,"dataGaLocation":814},{"text":685,"config":1032},{"href":687,"dataGaName":688,"dataGaLocation":814},{"text":690,"config":1034},{"href":692,"dataGaName":693,"dataGaLocation":814},{"text":1036,"config":1037},"Modern Slavery Transparency Statement",{"href":1038,"dataGaName":1039,"dataGaLocation":814},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1041},[1042,1045,1048],{"text":1043,"config":1044},"Terms",{"href":866,"dataGaName":867,"dataGaLocation":814},{"text":1046,"config":1047},"Cookies",{"dataGaName":876,"dataGaLocation":814,"id":877,"isOneTrustButton":240},{"text":1049,"config":1050},"Privacy",{"href":871,"dataGaName":872,"dataGaLocation":814},[1052],{"id":1053,"title":7,"body":352,"config":1054,"content":1056,"description":352,"extension":1060,"meta":1061,"navigation":240,"path":1062,"seo":1063,"stem":1064,"__hash__":1065},"blogAuthors/en-us/blog/authors/abubakar-siddiq-ango.yml",{"template":1055},"BlogAuthor",{"name":7,"config":1057},{"headshot":1058,"ctfId":1059},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749660104/Blog/Author%20Headshots/abuango-headshot.jpg","abuango","yml",{},"/en-us/blog/authors/abubakar-siddiq-ango",{},"en-us/blog/authors/abubakar-siddiq-ango","u5Jv4JxCpfmcGQuXEU4Lr5xVBJP9LAB2NkXRMLeYwPE",[1067,1076,1084],{"title":1068,"description":1069,"heroImage":1070,"category":348,"date":1071,"authors":1072,"slug":1075,"externalUrl":352},"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",[1073,1074],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1077,"description":1078,"heroImage":1079,"category":348,"date":1080,"authors":1081,"slug":1083,"externalUrl":352},"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",[1082],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1085,"description":1086,"heroImage":1087,"category":348,"date":1088,"authors":1089,"slug":1091,"externalUrl":352},"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",[1090],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1093},[1094,1108,1120,1132],{"id":1095,"categories":1096,"header":1098,"text":1099,"button":1100,"image":1105},"ai-modernization",[1097],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1101,"config":1102},"Get your AI maturity score",{"href":1103,"dataGaName":1104,"dataGaLocation":579},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1106},{"src":1107},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1109,"categories":1110,"header":1112,"text":1099,"button":1113,"image":1117},"devops-modernization",[1111,916],"product","Are you just managing tools or shipping innovation?",{"text":1114,"config":1115},"Get your DevOps maturity score",{"href":1116,"dataGaName":1104,"dataGaLocation":579},"/assessments/devops-modernization-assessment/",{"config":1118},{"src":1119},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1121,"categories":1122,"header":1124,"text":1099,"button":1125,"image":1129},"security-modernization",[1123],"security","Are you trading speed for security?",{"text":1126,"config":1127},"Get your security maturity score",{"href":1128,"dataGaName":1104,"dataGaLocation":579},"/assessments/security-modernization-assessment/",{"config":1130},{"src":1131},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1133,"paths":1134,"header":1137,"text":1138,"button":1139,"image":1144},"github-azure-migration",[1135,1136],"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":1140,"config":1141},"See how GitLab compares to GitHub",{"href":1142,"dataGaName":1143,"dataGaLocation":579},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1145},{"src":1119},{"header":1147,"blurb":1148,"button":1149,"secondaryButton":1154},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1150,"config":1151},"Get your free trial",{"href":1152,"dataGaName":379,"dataGaLocation":1153},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":852,"config":1155},{"href":704,"dataGaName":384,"dataGaLocation":1153},1786803752004]