[{"data":1,"prerenderedAt":1270},["ShallowReactive",2],{"/blog/three-yaml-tips-better-pipelines":3,"navigation-en-us":485,"banner-en-us":912,"footer-en-us":922,"blog-post-authors-en-us-Chrissie Buchanan":1166,"blog-related-posts-en-us-three-yaml-tips-better-pipelines":1181,"blog-promotions-en-us":1206,"next-steps-en-us":1260},{"id":4,"title":5,"authors":6,"body":8,"category":465,"date":466,"description":467,"extension":468,"externalUrl":469,"faq":469,"featured":470,"heroImage":471,"meta":472,"navigation":273,"path":473,"seo":474,"slug":478,"stem":479,"tags":480,"template":483,"updatedDate":469,"__hash__":484},"blogPosts/en-us/blog/three-yaml-tips-better-pipelines.md","3 YAML tips for better pipelines",[7],"Chrissie Buchanan",{"type":9,"value":10,"toc":458},"minimark",[11,15,24,29,32,40,43,52,55,59,68,71,121,129,132,144,151,155,158,175,184,190,193,196,200,203,219,225,348,363,371,377,394,405,408,415,429,433,440,447,454],[12,13,14],"p",{},"At GitLab, we’re fans of YAML. But for all of its benefits, we’d be lying if we said YAML hasn’t caused its fair share of headaches, too.",[12,16,17,23],{},[18,19,22],"a",{"href":20,"rel":21},"https://yaml.org/",[],"YAML"," is used industry-wide for declarative configuration. YAML offers flexibility and simplicity, as long as you know the rules and limitations. Since YAML is platform-agnostic, knowing best practices around YAML configurations is a transferable skillset in a cloud native world.",[25,26,28],"h2",{"id":27},"what-are-the-benefits-of-yaml","What are the benefits of YAML?",[12,30,31],{},"YAML is a data serialization language designed to be human-friendly. YAML is easy to use in a text editor, has a simple syntax that works across programming languages, and can store a lot of important configuration data (typically in a .yml or .yaml file).",[12,33,34,39],{},[18,35,38],{"href":36,"rel":37},"https://blog.stackpath.com/yaml/",[],"YAML is data-oriented"," and has features derived from Perl, C, HTML, and others.",[12,41,42],{},"Because YAML is a superset of JSON, it has built-in advantages including comments, self-referencing, and support for complex data types.",[12,44,45,46,51],{},"A ",[18,47,50],{"href":48,"rel":49},"https://www.codeproject.com/Articles/1214409/Learn-YAML-in-five-minutes",[],"YAML file uses declarative configuration"," to describe a variety of structures, such as API data structures and even deployment instructions for virtual machines and containers, to name a few.",[12,53,54],{},"YAML is comprehensive, widely-used, and works in every type of development environment.",[25,56,58],{"id":57},"yaml-tip-1-let-other-tools-do-the-formatting-for-you","YAML tip #1: Let other tools do the formatting for you",[12,60,61,62,67],{},"YAML is one of those languages where it’s minimalism is both a blessing and a curse, depending on who you ask. It also relies on the syntactically significant whitespace that is a source of ",[18,63,66],{"href":64,"rel":65},"https://wiki.c2.com/?SyntacticallySignificantWhitespaceConsideredHarmful",[],"heated debate"," among developers. For a language where formatting is a king, what can developers do to make sure they stay within the rules without having to analyze every single space and indentation?",[12,69,70],{},"Many text editors and platforms have plugins or built-in tools to check YAML configuration syntax for you.",[72,73,74,83,97,105,113],"ul",{},[75,76,77,82],"li",{},[18,78,81],{"href":79,"rel":80},"http://atom.io/",[],"Atom",", the open source text editor, comes with a default YAML mode.",[75,84,85,90,91,96],{},[18,86,89],{"href":87,"rel":88},"https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml",[],"Red Hat YAML support"," provides YAML Language and Kubernetes syntax support to the ",[18,92,95],{"href":93,"rel":94},"https://code.visualstudio.com/",[],"VS Code editor",".",[75,98,99,104],{},[18,100,103],{"href":101,"rel":102},"https://onlineyamltools.com/edit-yaml",[],"OnlineYamlTools"," has a web-based editor that will do in a pinch. It also links to other helpful options such as converting JSON to YAML, etc.",[75,106,107,112],{},[18,108,111],{"href":109,"rel":110},"https://www.slickedit.com/products/slickedit/448-the-most-powerful-yaml-editor-in-the-world#:~:text=SlickEdit%20%2D%20The%20most%20powerful%20YAML,source%20diff%2C%20and%20much%20more.",[],"SlickEdit"," is the self-described \"most powerful YAML editor in the world\" and has some helpful features to back it up (at a cost). SlickEdit offers a free trial.",[75,114,115,120],{},[18,116,119],{"href":117,"rel":118},"https://packagecontrol.io/packages/Pretty%20YAML",[],"Pretty YAML"," is a plugin for Sublime Text 2 and 3 that allows you to format YAML files.",[12,122,123,128],{},[18,124,127],{"href":125,"rel":126},"https://sourcelevel.io/blog/what-is-a-linter-and-why-your-team-should-use-it",[],"Linters"," are used in the development process to analyze code for stylistic and formatting errors, among other things. Teams adopt linters and other static tools by integrating them into their integrated development environment (IDE) of choice, and/or by running them as an additional step in their continuous integration (CI).",[12,130,131],{},"In GitLab, we have a CI lint that checks the syntax of your CI YAML configuration that also runs some basic logical validations.",[12,133,134,135,139,140,143],{},"To use the CI lint, paste a complete CI configuration (",[136,137,138],"code",{},".gitlab-ci.yml"," for example) into the text box and click ",[136,141,142],{},"Validate",":",[12,145,146],{},[147,148],"img",{"alt":149,"src":150},"GitLab CI lint","https://docs.gitlab.com/ci/img/ci_lint.png/",[25,152,154],{"id":153},"yaml-tip-2-keep-it-simple","YAML tip #2: Keep it simple",[12,156,157],{},"It’s easy to overwhelm the minimalism of a YAML file by including too many details, or by being inconsistent with formatting. When it comes to YAML, less is often more.",[12,159,160,161,164,165,170,171,174],{},"It isn’t necessary to specify every single attribute. ",[136,162,163],{},"Job timeout"," is an example of an attribute that can be left out, since this is something that is sometimes specified elsewhere. An example in GitLab is ",[18,166,169],{"href":167,"rel":168},"https://docs.gitlab.com/ci/yaml/#interruptible",[],"interruptible",", which is used to indicate that a job should be canceled if made redundant by a newer pipeline run. Since this defaults to ",[136,172,173],{},"false"," it’s not always necessary to include it.",[12,176,177,178,183],{},"Some people indent gratuitously when writing YAML to help themselves visualize large chunks of data. To better visualize how data works together, it might be helpful to create a \"pseudo-config\" before committing the code to YAML. On the ",[18,179,182],{"href":180,"rel":181},"https://www.redhat.com/sysadmin/yaml-tips",[],"Red Hat blog",", a pseudo-config is described as pseudo-code where you don't have to worry about structure or indentation, parent-child relationships, inheritance, or nesting. Just write the data down as you understand it.",[12,185,186],{},[147,187],{"alt":188,"src":189},"Red Hat pseudo config","https://www.redhat.com/sysadmin/sites/default/files/inline-images/pseudoyaml.jpg",[12,191,192],{},"Once you understand how the data correlates, then you can commit it to YAML.",[12,194,195],{},"Regardless of how you define simplicity in your workflow, try to keep YAML configs uncluttered and include only the necessary data. And if you’re not sure what data is necessary, write out a pseudo-config to help you visualize it.",[25,197,199],{"id":198},"yaml-tip-3-reuse-config-when-possible","YAML tip #3: Reuse config when possible",[12,201,202],{},"Starting from scratch is a lot of wasted effort, and YAML is no exception. One of the best parts of YAML is its reusabilty, and reusing config is a way to keep files consistent within an organization.",[12,204,205,206,211,212,215,216,218],{},"One way to ",[18,207,210],{"href":208,"rel":209},"https://docs.gitlab.com/ci/yaml/#include",[],"avoid duplicated configuration"," is by using the ",[136,213,214],{},"include"," keyword, which allows the inclusion of external YAML files. For example, global default variables for all projects that don’t need to be modified for every file. The ",[136,217,214],{}," keyword helps to break down a YAML configuration into multiple files and boosts readability, especially for long files. It’s also possible to have template files stored in a central repository and projects included in their configuration files.",[12,220,221,224],{},[136,222,223],{},"extends"," is a great way to reuse some YAML config in multiple places, for example:",[226,227,232],"pre",{"className":228,"code":229,"language":230,"meta":231,"style":231},"language-yaml shiki shiki-themes github-light",".image_template:\n  image:\n    name: centos:latest\n\ntest:\n  extends: .image_template\n  script:\n    - echo \"Testing\"\n\ndeploy:\n  extends: .image_template\n  script:\n    - echo \"Deploying\"\n\n","yaml","",[136,233,234,247,255,268,275,283,294,302,311,316,324,333,340],{"__ignoreMap":231},[235,236,239,243],"span",{"class":237,"line":238},"line",1,[235,240,242],{"class":241},"shJU0",".image_template",[235,244,246],{"class":245},"sgsFI",":\n",[235,248,250,253],{"class":237,"line":249},2,[235,251,252],{"class":241},"  image",[235,254,246],{"class":245},[235,256,258,261,264],{"class":237,"line":257},3,[235,259,260],{"class":241},"    name",[235,262,263],{"class":245},": ",[235,265,267],{"class":266},"sYBdl","centos:latest\n",[235,269,271],{"class":237,"line":270},4,[235,272,274],{"emptyLinePlaceholder":273},true,"\n",[235,276,278,281],{"class":237,"line":277},5,[235,279,280],{"class":241},"test",[235,282,246],{"class":245},[235,284,286,289,291],{"class":237,"line":285},6,[235,287,288],{"class":241},"  extends",[235,290,263],{"class":245},[235,292,293],{"class":266},".image_template\n",[235,295,297,300],{"class":237,"line":296},7,[235,298,299],{"class":241},"  script",[235,301,246],{"class":245},[235,303,305,308],{"class":237,"line":304},8,[235,306,307],{"class":245},"    - ",[235,309,310],{"class":266},"echo \"Testing\"\n",[235,312,314],{"class":237,"line":313},9,[235,315,274],{"emptyLinePlaceholder":273},[235,317,319,322],{"class":237,"line":318},10,[235,320,321],{"class":241},"deploy",[235,323,246],{"class":245},[235,325,327,329,331],{"class":237,"line":326},11,[235,328,288],{"class":241},[235,330,263],{"class":245},[235,332,293],{"class":266},[235,334,336,338],{"class":237,"line":335},12,[235,337,299],{"class":241},[235,339,246],{"class":245},[235,341,343,345],{"class":237,"line":342},13,[235,344,307],{"class":245},[235,346,347],{"class":266},"echo \"Deploying\"\n",[12,349,350,351,356,357,362],{},"YAML has a handy feature called ",[18,352,355],{"href":353,"rel":354},"https://docs.gitlab.com/ci/yaml/yaml_optimization/#anchors",[],"anchors",", which lets you easily duplicate content across your document. Anchors can be used to duplicate/inherit properties, and is a perfect example to be used with ",[18,358,361],{"href":359,"rel":360},"https://docs.gitlab.com/ci/jobs/#hide-jobs",[],"hidden jobs"," to provide templates for your jobs. When there is duplicate keys, GitLab will perform a reverse deep merge based on the keys.",[226,364,369],{"className":365,"code":367,"language":368,"meta":231},[366],"language-text",".job_template: &job_definition  # Hidden key that defines an anchor named 'job_definition'\n  image: ruby:2.6\n  services:\n    - postgres\n    - redis\n\ntest1:\n  &lt;\u003C: *job_definition           # Merge the contents of the 'job_definition' alias\n  script:\n    - test1 project\n\ntest2:\n  &lt;\u003C: *job_definition           # Merge the contents of the 'job_definition' alias\n  script:\n    - test2 project\n\n","text",[136,370,367],{"__ignoreMap":231},[12,372,373,374,376],{},"One big caveat to anchors: You can’t use anchors across multiple files when leveraging the ",[136,375,214],{}," feature.",[12,378,379,380,384,385,388,389,96],{},"Instead of building pipelines from scratch, ",[18,381,383],{"href":382},"/blog/get-started-ci-pipeline-templates/","CI/CD pipeline templates"," simplify the process by having parameters already built-in. At GitLab, pipelines are defined in a ",[136,386,387],{},"gitlab-ci.yml"," file. Because our CI/CD templates come in over 30 popular languages, chances are good that we have the template you need to get started in our ",[18,390,393],{"href":391,"rel":392},"https://gitlab.com/gitlab-org/gitlab/tree/master/lib/gitlab/ci/templates",[],"CI template repository",[12,395,396,397,399,400,96],{},"Templates can be modified and are created to fit many use cases. To see a large ",[136,398,138],{}," file used in an enterprise, see the ",[18,401,404],{"href":402,"rel":403},"https://gitlab.com/gitlab-org/gitlab/blob/master/.gitlab-ci.yml",[],".gitlab-ci.yml file for GitLab",[12,406,407],{},"Whether you’re a YAML lover, YAML novice, or using YAML against your will, knowing some tips and tricks can make your development process a better experience. Do you have any YAML tips or recommendations? Feel free to comment down below.",[12,409,410,411,96],{},"Curious about GitLab CI/CD and want to show off your YAML skills? ",[18,412,414],{"href":413},"/free-trial/","Try GitLab free",[12,416,417,418,423,424],{},"Cover image by ",[18,419,422],{"href":420,"rel":421},"https://unsplash.com/@haritsmustya?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText",[],"Harits Mustya Pratama"," on ",[18,425,428],{"href":426,"rel":427},"https://unsplash.com/s/photos/greenhouse?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText",[],"Unsplash",[25,430,432],{"id":431},"related-content","Related content",[12,434,435],{},[18,436,439],{"href":437,"rel":438},"https://docs.gitlab.com/ci/yaml/",[],"GitLab CI/CD pipeline configuration reference",[12,441,442],{},[18,443,446],{"href":444,"rel":445},"https://about.gitlab.com/blog/better-devops-with-gitlab-ci-cd/",[],"Unlock better DevOps with GitLab CI/CD",[12,448,449],{},[18,450,453],{"href":451,"rel":452},"https://docs.gitlab.com/ci/pipelines/pipeline_efficiency/",[],"Pipeline efficiency",[455,456,457],"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":231,"searchDepth":249,"depth":249,"links":459},[460,461,462,463,464],{"id":27,"depth":249,"text":28},{"id":57,"depth":249,"text":58},{"id":153,"depth":249,"text":154},{"id":198,"depth":249,"text":199},{"id":431,"depth":249,"text":432},"insights","2020-10-01","Learn how to get the most out of your YAML configs.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749681626/Blog/Hero%20Images/yaml-tips.jpg",{},"/en-us/blog/three-yaml-tips-better-pipelines",{"title":5,"description":467,"ogTitle":5,"ogDescription":467,"noIndex":470,"ogImage":471,"ogUrl":475,"ogSiteName":476,"ogType":477,"canonicalUrls":475},"https://about.gitlab.com/blog/three-yaml-tips-better-pipelines","https://about.gitlab.com","article","three-yaml-tips-better-pipelines","en-us/blog/three-yaml-tips-better-pipelines",[481,482],"CI/CD","DevOps","BlogPost","7-MbzXvxcgzfuP7SDTgYNkPMT1Q5qNiAR0iPgs4p72c",{"logo":486,"freeTrial":491,"sales":496,"login":501,"items":506,"search":832,"minimal":863,"duo":882,"switchNav":891,"pricingDeployment":902},{"config":487},{"href":488,"dataGaName":489,"dataGaLocation":490},"/","gitlab logo","header",{"text":492,"config":493},"Get free trial",{"href":494,"dataGaName":495,"dataGaLocation":490},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":497,"config":498},"Request a demo",{"href":499,"dataGaName":500,"dataGaLocation":490},"/sales/?contact-topic=request-demo","sales",{"text":502,"config":503},"Sign in",{"href":504,"dataGaName":505,"dataGaLocation":490},"https://gitlab.com/users/sign_in/","sign in",[507,536,635,640,754,810],{"text":508,"config":509,"menu":511},"Platform",{"dataNavLevelOne":510},"platform",{"type":512,"columns":513},"cards",[514,520,528],{"title":508,"description":515,"link":516},"The intelligent orchestration platform for DevSecOps",{"text":517,"config":518},"Explore our Platform",{"href":519,"dataGaName":510,"dataGaLocation":490},"/platform/",{"title":521,"description":522,"link":523},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":524,"config":525},"Meet GitLab Duo",{"href":526,"dataGaName":527,"dataGaLocation":490},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":529,"description":530,"link":531},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":532,"config":533},"Learn more",{"href":534,"dataGaName":535,"dataGaLocation":490},"/why-gitlab/","why gitlab",{"text":537,"left":273,"config":538,"menu":540},"Product",{"dataNavLevelOne":539},"solutions",{"type":541,"link":542,"columns":546,"feature":614},"lists",{"text":543,"config":544},"View all Solutions",{"href":545,"dataGaName":539,"dataGaLocation":490},"/solutions/",[547,570,593],{"title":548,"description":549,"link":550,"items":555},"Automation","CI/CD and automation to accelerate deployment",{"config":551},{"icon":552,"href":553,"dataGaName":554,"dataGaLocation":490},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[556,559,562,566],{"text":481,"config":557},{"href":558,"dataGaLocation":490,"dataGaName":481},"/solutions/continuous-integration/",{"text":521,"config":560},{"href":526,"dataGaLocation":490,"dataGaName":561},"gitlab duo agent platform - product menu",{"text":563,"config":564},"Source Code Management",{"href":565,"dataGaLocation":490,"dataGaName":563},"/solutions/source-code-management/",{"text":567,"config":568},"Automated Software Delivery",{"href":553,"dataGaLocation":490,"dataGaName":569},"Automated software delivery",{"title":571,"description":572,"link":573,"items":578},"Security","Deliver code faster without compromising security",{"config":574},{"href":575,"dataGaName":576,"dataGaLocation":490,"icon":577},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[579,583,588],{"text":580,"config":581},"Application Security Testing",{"href":575,"dataGaName":582,"dataGaLocation":490},"Application security testing",{"text":584,"config":585},"Software Supply Chain Security",{"href":586,"dataGaLocation":490,"dataGaName":587},"/solutions/supply-chain/","Software supply chain security",{"text":589,"config":590},"Software Compliance",{"href":591,"dataGaName":592,"dataGaLocation":490},"/solutions/software-compliance/","software compliance",{"title":594,"link":595,"items":600},"Measurement",{"config":596},{"icon":597,"href":598,"dataGaName":599,"dataGaLocation":490},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[601,605,609],{"text":602,"config":603},"Visibility & Measurement",{"href":598,"dataGaLocation":490,"dataGaName":604},"Visibility and Measurement",{"text":606,"config":607},"Value Stream Management",{"href":608,"dataGaLocation":490,"dataGaName":606},"/solutions/value-stream-management/",{"text":610,"config":611},"Analytics & Insights",{"href":612,"dataGaLocation":490,"dataGaName":613},"/solutions/analytics-and-insights/","Analytics and insights",{"title":615,"type":541,"items":616},"GitLab for",[617,623,629],{"text":618,"config":619},"Enterprise",{"icon":620,"href":621,"dataGaLocation":490,"dataGaName":622},"Building","/enterprise/","enterprise",{"text":624,"config":625},"Small Business",{"icon":626,"href":627,"dataGaLocation":490,"dataGaName":628},"Work","/small-business/","small business",{"text":630,"config":631},"Public Sector",{"icon":632,"href":633,"dataGaLocation":490,"dataGaName":634},"Organization","/solutions/public-sector/","public sector",{"text":636,"config":637},"Pricing",{"href":638,"dataGaName":639,"dataGaLocation":490,"dataNavLevelOne":639},"/pricing/","pricing",{"text":641,"config":642,"menu":644},"Resources",{"dataNavLevelOne":643},"resources",{"type":541,"link":645,"columns":649,"feature":743},{"text":646,"config":647},"View all resources",{"href":648,"dataGaName":643,"dataGaLocation":490},"/resources/",[650,683,710],{"title":651,"items":652},"Getting started",[653,658,663,668,673,678],{"text":654,"config":655},"Install",{"href":656,"dataGaName":657,"dataGaLocation":490},"/install/","install",{"text":659,"config":660},"Quick start guides",{"href":661,"dataGaName":662,"dataGaLocation":490},"/get-started/","quick setup checklists",{"text":664,"config":665},"Learn",{"href":666,"dataGaLocation":490,"dataGaName":667},"https://university.gitlab.com/","learn",{"text":669,"config":670},"Product documentation",{"href":671,"dataGaName":672,"dataGaLocation":490},"https://docs.gitlab.com/","product documentation",{"text":674,"config":675},"Best practice videos",{"href":676,"dataGaName":677,"dataGaLocation":490},"/getting-started-videos/","best practice videos",{"text":679,"config":680},"Integrations",{"href":681,"dataGaName":682,"dataGaLocation":490},"/integrations/","integrations",{"title":684,"items":685},"Discover",[686,691,696,701,705],{"text":687,"config":688},"Customer success stories",{"href":689,"dataGaName":690,"dataGaLocation":490},"/customers/","customer success stories",{"text":692,"config":693},"Blog",{"href":694,"dataGaName":695,"dataGaLocation":490},"/blog/","blog",{"text":697,"config":698},"Demo Hub",{"href":699,"dataGaName":700,"dataGaLocation":490},"/demo-hub/","demo hub",{"text":702,"config":703},"The Source",{"href":704,"dataGaName":695,"dataGaLocation":490},"/the-source/",{"text":706,"config":707},"Remote",{"href":708,"dataGaName":709,"dataGaLocation":490},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":711,"items":712},"Connect",[713,718,723,728,733,738],{"text":714,"config":715},"GitLab Services",{"href":716,"dataGaName":717,"dataGaLocation":490},"/services/","services",{"text":719,"config":720},"Contribute",{"href":721,"dataGaName":722,"dataGaLocation":490},"https://contributors.gitlab.com","contribute",{"text":724,"config":725},"Community",{"href":726,"dataGaName":727,"dataGaLocation":490},"/community/","community",{"text":729,"config":730},"Forum",{"href":731,"dataGaName":732,"dataGaLocation":490},"https://forum.gitlab.com/","forum",{"text":734,"config":735},"Events",{"href":736,"dataGaName":737,"dataGaLocation":490},"/events/","events",{"text":739,"config":740},"Partners",{"href":741,"dataGaName":742,"dataGaLocation":490},"/partners/","partners",{"config":744,"title":747,"text":748,"link":749},{"background":745,"textColor":746},"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":750,"config":751},"Read the latest",{"href":752,"dataGaName":753,"dataGaLocation":490},"/whats-new/","whats new",{"text":755,"config":756,"menu":758},"Company",{"dataNavLevelOne":757},"company",{"type":541,"columns":759},[760],{"items":761},[762,767,773,775,780,785,790,795,800,805],{"text":763,"config":764},"About",{"href":765,"dataGaName":766,"dataGaLocation":490},"/company/","about",{"text":768,"config":769,"footerGa":772},"Jobs",{"href":770,"dataGaName":771,"dataGaLocation":490},"/jobs/","jobs",{"dataGaName":771},{"text":734,"config":774},{"href":736,"dataGaName":737,"dataGaLocation":490},{"text":776,"config":777},"Leadership",{"href":778,"dataGaName":779,"dataGaLocation":490},"/company/team/e-group/","leadership",{"text":781,"config":782},"Handbook",{"href":783,"dataGaName":784,"dataGaLocation":490},"https://handbook.gitlab.com/","handbook",{"text":786,"config":787},"Investor relations",{"href":788,"dataGaName":789,"dataGaLocation":490},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":791,"config":792},"Trust Center",{"href":793,"dataGaName":794,"dataGaLocation":490},"/security/","trust center",{"text":796,"config":797},"AI Transparency Center",{"href":798,"dataGaName":799,"dataGaLocation":490},"/ai-transparency-center/","ai transparency center",{"text":801,"config":802},"Newsletter",{"href":803,"dataGaName":804,"dataGaLocation":490},"/company/contact/#contact-forms","newsletter",{"text":806,"config":807},"Press",{"href":808,"dataGaName":809,"dataGaLocation":490},"/press/","press",{"text":811,"config":812,"menu":813},"Contact us",{"dataNavLevelOne":757},{"type":541,"columns":814},[815],{"items":816},[817,822,827],{"text":818,"config":819},"Talk to sales",{"href":820,"dataGaName":821,"dataGaLocation":490},"/sales/","talk to sales",{"text":823,"config":824},"Support portal",{"href":825,"dataGaName":826,"dataGaLocation":490},"https://support.gitlab.com/hc/en-us","support portal",{"text":828,"config":829},"Customer portal",{"href":830,"dataGaName":831,"dataGaLocation":490},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":833,"login":834,"suggestions":841},"Close",{"text":835,"link":836},"To search repositories and projects, login to",{"text":837,"config":838},"gitlab.com",{"href":504,"dataGaName":839,"dataGaLocation":840},"search login","search",{"text":842,"default":843},"Suggestions",[844,846,850,852,856,860],{"text":521,"config":845},{"href":526,"dataGaName":521,"dataGaLocation":840},{"text":847,"config":848},"Code Suggestions (AI)",{"href":849,"dataGaName":847,"dataGaLocation":840},"/solutions/code-suggestions/",{"text":481,"config":851},{"href":558,"dataGaName":481,"dataGaLocation":840},{"text":853,"config":854},"GitLab on AWS",{"href":855,"dataGaName":853,"dataGaLocation":840},"/partners/technology-partners/aws/",{"text":857,"config":858},"GitLab on Google Cloud",{"href":859,"dataGaName":857,"dataGaLocation":840},"/partners/technology-partners/google-cloud-platform/",{"text":861,"config":862},"Why GitLab?",{"href":534,"dataGaName":861,"dataGaLocation":840},{"freeTrial":864,"mobileIcon":869,"desktopIcon":874,"secondaryButton":877},{"text":865,"config":866},"Start free trial",{"href":867,"dataGaName":495,"dataGaLocation":868},"https://gitlab.com/-/trials/new/","nav",{"altText":870,"config":871},"Gitlab Icon",{"src":872,"dataGaName":873,"dataGaLocation":868},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":870,"config":875},{"src":876,"dataGaName":873,"dataGaLocation":868},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":878,"config":879},"Get Started",{"href":880,"dataGaName":881,"dataGaLocation":868},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":883,"mobileIcon":887,"desktopIcon":889},{"text":884,"config":885},"Learn more about GitLab Duo",{"href":526,"dataGaName":886,"dataGaLocation":868},"gitlab duo",{"altText":870,"config":888},{"src":872,"dataGaName":873,"dataGaLocation":868},{"altText":870,"config":890},{"src":876,"dataGaName":873,"dataGaLocation":868},{"button":892,"mobileIcon":897,"desktopIcon":899},{"text":893,"config":894},"/switch",{"href":895,"dataGaName":896,"dataGaLocation":868},"#contact","switch",{"altText":870,"config":898},{"src":872,"dataGaName":873,"dataGaLocation":868},{"altText":870,"config":900},{"src":901,"dataGaName":873,"dataGaLocation":868},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":903,"mobileIcon":908,"desktopIcon":910},{"text":904,"config":905},"Back to pricing",{"href":638,"dataGaName":906,"dataGaLocation":868,"icon":907},"back to pricing","GoBack",{"altText":870,"config":909},{"src":872,"dataGaName":873,"dataGaLocation":868},{"altText":870,"config":911},{"src":876,"dataGaName":873,"dataGaLocation":868},{"title":913,"titleMobile":914,"button":915,"config":920},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":532,"config":916},{"href":917,"dataGaName":918,"dataGaLocation":919},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":921,"disabled":470},"release",{"data":923},{"text":924,"source":925,"edit":931,"contribute":936,"config":941,"items":946,"minimal":1155},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":926,"config":927},"View page source",{"href":928,"dataGaName":929,"dataGaLocation":930},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":932,"config":933},"Edit this page",{"href":934,"dataGaName":935,"dataGaLocation":930},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":937,"config":938},"Please contribute",{"href":939,"dataGaName":940,"dataGaLocation":930},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":942,"facebook":943,"youtube":944,"linkedin":945},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[947,994,1047,1091,1123],{"title":636,"links":948,"subMenu":963},[949,953,958],{"text":950,"config":951},"View plans",{"href":638,"dataGaName":952,"dataGaLocation":930},"view plans",{"text":954,"config":955},"Why Premium?",{"href":956,"dataGaName":957,"dataGaLocation":930},"/pricing/premium/","why premium",{"text":959,"config":960},"Why Ultimate?",{"href":961,"dataGaName":962,"dataGaLocation":930},"/pricing/ultimate/","why ultimate",[964],{"title":965,"links":966},"Contact Us",[967,970,972,974,979,984,989],{"text":968,"config":969},"Contact sales",{"href":820,"dataGaName":500,"dataGaLocation":930},{"text":823,"config":971},{"href":825,"dataGaName":826,"dataGaLocation":930},{"text":828,"config":973},{"href":830,"dataGaName":831,"dataGaLocation":930},{"text":975,"config":976},"Status",{"href":977,"dataGaName":978,"dataGaLocation":930},"https://status.gitlab.com/","status",{"text":980,"config":981},"Terms of use",{"href":982,"dataGaName":983,"dataGaLocation":930},"/terms/","terms of use",{"text":985,"config":986},"Privacy statement",{"href":987,"dataGaName":988,"dataGaLocation":930},"/privacy/","privacy statement",{"text":990,"config":991},"Cookie preferences",{"dataGaName":992,"dataGaLocation":930,"id":993,"isOneTrustButton":273},"cookie preferences","ot-sdk-btn",{"title":537,"links":995,"subMenu":1004},[996,1000],{"text":997,"config":998},"DevSecOps platform",{"href":519,"dataGaName":999,"dataGaLocation":930},"devsecops platform",{"text":1001,"config":1002},"AI-Assisted Development",{"href":526,"dataGaName":1003,"dataGaLocation":930},"ai-assisted development",[1005],{"title":1006,"links":1007},"Topics",[1008,1013,1018,1022,1027,1032,1037,1042],{"text":1009,"config":1010},"CICD",{"href":1011,"dataGaName":1012,"dataGaLocation":930},"/topics/ci-cd/","cicd",{"text":1014,"config":1015},"GitOps",{"href":1016,"dataGaName":1017,"dataGaLocation":930},"/topics/gitops/","gitops",{"text":482,"config":1019},{"href":1020,"dataGaName":1021,"dataGaLocation":930},"/topics/devops/","devops",{"text":1023,"config":1024},"Version Control",{"href":1025,"dataGaName":1026,"dataGaLocation":930},"/topics/version-control/","version control",{"text":1028,"config":1029},"DevSecOps",{"href":1030,"dataGaName":1031,"dataGaLocation":930},"/topics/devsecops/","devsecops",{"text":1033,"config":1034},"Cloud Native",{"href":1035,"dataGaName":1036,"dataGaLocation":930},"/topics/cloud-native/","cloud native",{"text":1038,"config":1039},"AI for Coding",{"href":1040,"dataGaName":1041,"dataGaLocation":930},"/topics/devops/ai-for-coding/","ai for coding",{"text":1043,"config":1044},"Agentic AI",{"href":1045,"dataGaName":1046,"dataGaLocation":930},"/topics/agentic-ai/","agentic ai",{"title":1048,"links":1049},"Solutions",[1050,1052,1054,1059,1063,1066,1070,1073,1075,1078,1081,1086],{"text":580,"config":1051},{"href":575,"dataGaName":580,"dataGaLocation":930},{"text":569,"config":1053},{"href":553,"dataGaName":554,"dataGaLocation":930},{"text":1055,"config":1056},"Agile development",{"href":1057,"dataGaName":1058,"dataGaLocation":930},"/solutions/agile-delivery/","agile delivery",{"text":1060,"config":1061},"SCM",{"href":565,"dataGaName":1062,"dataGaLocation":930},"source code management",{"text":1009,"config":1064},{"href":558,"dataGaName":1065,"dataGaLocation":930},"continuous integration & delivery",{"text":1067,"config":1068},"Value stream management",{"href":608,"dataGaName":1069,"dataGaLocation":930},"value stream management",{"text":1014,"config":1071},{"href":1072,"dataGaName":1017,"dataGaLocation":930},"/solutions/gitops/",{"text":618,"config":1074},{"href":621,"dataGaName":622,"dataGaLocation":930},{"text":1076,"config":1077},"Small business",{"href":627,"dataGaName":628,"dataGaLocation":930},{"text":1079,"config":1080},"Public sector",{"href":633,"dataGaName":634,"dataGaLocation":930},{"text":1082,"config":1083},"Education",{"href":1084,"dataGaName":1085,"dataGaLocation":930},"/solutions/education/","education",{"text":1087,"config":1088},"Financial services",{"href":1089,"dataGaName":1090,"dataGaLocation":930},"/solutions/finance/","financial services",{"title":641,"links":1092},[1093,1095,1097,1099,1102,1104,1107,1109,1111,1113,1115,1117,1119,1121],{"text":654,"config":1094},{"href":656,"dataGaName":657,"dataGaLocation":930},{"text":659,"config":1096},{"href":661,"dataGaName":662,"dataGaLocation":930},{"text":664,"config":1098},{"href":666,"dataGaName":667,"dataGaLocation":930},{"text":669,"config":1100},{"href":671,"dataGaName":1101,"dataGaLocation":930},"docs",{"text":692,"config":1103},{"href":694,"dataGaName":695,"dataGaLocation":930},{"text":1105,"config":1106},"What's new",{"href":752,"dataGaName":753,"dataGaLocation":930},{"text":687,"config":1108},{"href":689,"dataGaName":690,"dataGaLocation":930},{"text":706,"config":1110},{"href":708,"dataGaName":709,"dataGaLocation":930},{"text":714,"config":1112},{"href":716,"dataGaName":717,"dataGaLocation":930},{"text":719,"config":1114},{"href":721,"dataGaName":722,"dataGaLocation":930},{"text":724,"config":1116},{"href":726,"dataGaName":727,"dataGaLocation":930},{"text":729,"config":1118},{"href":731,"dataGaName":732,"dataGaLocation":930},{"text":734,"config":1120},{"href":736,"dataGaName":737,"dataGaLocation":930},{"text":739,"config":1122},{"href":741,"dataGaName":742,"dataGaLocation":930},{"title":755,"links":1124},[1125,1127,1129,1131,1133,1135,1139,1144,1146,1148,1150],{"text":763,"config":1126},{"href":765,"dataGaName":757,"dataGaLocation":930},{"text":768,"config":1128},{"href":770,"dataGaName":771,"dataGaLocation":930},{"text":776,"config":1130},{"href":778,"dataGaName":779,"dataGaLocation":930},{"text":781,"config":1132},{"href":783,"dataGaName":784,"dataGaLocation":930},{"text":786,"config":1134},{"href":788,"dataGaName":789,"dataGaLocation":930},{"text":1136,"config":1137},"Sustainability",{"href":1138,"dataGaName":1136,"dataGaLocation":930},"/sustainability/",{"text":1140,"config":1141},"Diversity, inclusion and belonging (DIB)",{"href":1142,"dataGaName":1143,"dataGaLocation":930},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":791,"config":1145},{"href":793,"dataGaName":794,"dataGaLocation":930},{"text":801,"config":1147},{"href":803,"dataGaName":804,"dataGaLocation":930},{"text":806,"config":1149},{"href":808,"dataGaName":809,"dataGaLocation":930},{"text":1151,"config":1152},"Modern Slavery Transparency Statement",{"href":1153,"dataGaName":1154,"dataGaLocation":930},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1156},[1157,1160,1163],{"text":1158,"config":1159},"Terms",{"href":982,"dataGaName":983,"dataGaLocation":930},{"text":1161,"config":1162},"Cookies",{"dataGaName":992,"dataGaLocation":930,"id":993,"isOneTrustButton":273},{"text":1164,"config":1165},"Privacy",{"href":987,"dataGaName":988,"dataGaLocation":930},[1167],{"id":1168,"title":7,"body":469,"config":1169,"content":1171,"description":469,"extension":1175,"meta":1176,"navigation":273,"path":1177,"seo":1178,"stem":1179,"__hash__":1180},"blogAuthors/en-us/blog/authors/chrissie-buchanan.yml",{"template":1170},"BlogAuthor",{"name":7,"config":1172},{"headshot":1173,"ctfId":1174},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659488/Blog/Author%20Headshots/gitlab-logo-extra-whitespace.png","cbuchanan","yml",{},"/en-us/blog/authors/chrissie-buchanan",{},"en-us/blog/authors/chrissie-buchanan","VUaqNs-WRatnVN614U2QKvMKVSh6PynpH3T0SHM4ayU",[1182,1190,1198],{"title":1183,"description":1184,"heroImage":1185,"category":465,"date":1186,"authors":1187,"slug":1189,"externalUrl":469},"How we overhauled GitLab navigation","Users weren't getting what they needed from our navigation. Here are the steps we took to turn that experience around.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749682884/Blog/Hero%20Images/navigation.jpg","2023-08-15",[1188],"Ashley Knobloch","navigation-research-blog-post",{"title":1191,"description":1192,"heroImage":1193,"category":465,"date":1194,"authors":1195,"slug":1197,"externalUrl":469},"Beautifying our UI: Giving GitLab build features a fresh look","Get an inside look at how we are improving the usability of GitLab build features with multiple visual design improvements.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749682807/Blog/Hero%20Images/beautify.jpg","2023-07-05",[1196],"Veethika Mishra","beautifying-of-our-ui",{"title":1199,"description":1200,"heroImage":1201,"category":465,"date":1202,"authors":1203,"slug":1205,"externalUrl":469},"4 best practices leading orgs to release software faster","GitLab's 2023 Global DevSecOps Survey illuminates the strategies that organizations deploying more frequently have in common.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663908/Blog/Hero%20Images/2023-devsecops-report-blog-banner2.png","2023-06-08",[1204],"Kristina Weis","best-practices-leading-orgs-to-release-software-faster",{"promotions":1207},[1208,1222,1234,1246],{"id":1209,"categories":1210,"header":1212,"text":1213,"button":1214,"image":1219},"ai-modernization",[1211],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1215,"config":1216},"Get your AI maturity score",{"href":1217,"dataGaName":1218,"dataGaLocation":695},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1220},{"src":1221},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1223,"categories":1224,"header":1226,"text":1213,"button":1227,"image":1231},"devops-modernization",[1225,1031],"product","Are you just managing tools or shipping innovation?",{"text":1228,"config":1229},"Get your DevOps maturity score",{"href":1230,"dataGaName":1218,"dataGaLocation":695},"/assessments/devops-modernization-assessment/",{"config":1232},{"src":1233},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1235,"categories":1236,"header":1238,"text":1213,"button":1239,"image":1243},"security-modernization",[1237],"security","Are you trading speed for security?",{"text":1240,"config":1241},"Get your security maturity score",{"href":1242,"dataGaName":1218,"dataGaLocation":695},"/assessments/security-modernization-assessment/",{"config":1244},{"src":1245},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1247,"paths":1248,"header":1251,"text":1252,"button":1253,"image":1258},"github-azure-migration",[1249,1250],"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":1254,"config":1255},"See how GitLab compares to GitHub",{"href":1256,"dataGaName":1257,"dataGaLocation":695},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1259},{"src":1233},{"header":1261,"blurb":1262,"button":1263,"secondaryButton":1268},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1264,"config":1265},"Get your free trial",{"href":1266,"dataGaName":495,"dataGaLocation":1267},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":968,"config":1269},{"href":820,"dataGaName":500,"dataGaLocation":1267},1786803753641]