[{"data":1,"prerenderedAt":1853},["ShallowReactive",2],{"/blog/how-orange-uses-gitlab-ci-cd-for-modern-devops":3,"navigation-en-us":1074,"banner-en-us":1501,"footer-en-us":1511,"blog-post-authors-en-us-Pierre Smeyers":1750,"blog-related-posts-en-us-how-orange-uses-gitlab-ci-cd-for-modern-devops":1764,"blog-promotions-en-us":1789,"next-steps-en-us":1843},{"id":4,"title":5,"authors":6,"body":8,"category":1054,"date":1055,"description":1056,"extension":1057,"externalUrl":1058,"faq":1058,"featured":1059,"heroImage":1060,"meta":1061,"navigation":601,"path":1062,"seo":1063,"slug":1067,"stem":1068,"tags":1069,"template":1072,"updatedDate":1058,"__hash__":1073},"blogPosts/en-us/blog/how-orange-uses-gitlab-ci-cd-for-modern-devops.md","How Orange made a first step toward CI/CD standardization with GitLab",[7],"Pierre Smeyers",{"type":9,"value":10,"toc":1039},"minimark",[11,21,29,45,50,59,64,67,74,80,83,86,93,96,99,102,105,120,123,126,130,133,151,199,202,205,212,220,228,237,243,287,293,328,348,360,366,372,378,398,872,879,885,899,905,908,919,922,993,999,1006,1012,1021,1035],[12,13,14,15,20],"p",{},"CI/CD is a foundational piece to modern software development. It's a major brick in the ",[16,17,19],"a",{"href":18},"/topics/devops/","DevOps"," \"Automation\" pillar and every company involved in IT has to implement CI/CD or they're already quite far behind the curve.",[12,22,23,24,28],{},"But ",[16,25,27],{"href":26},"/topics/ci-cd/","implementing CI/CD"," can be challenging especially for growing or large companies. Some of those challenges include:",[30,31,32,36,42],"ul",{},[33,34,35],"li",{},"DevOps expertise and technical skills",[33,37,38],{},[16,39,41],{"href":40},"/topics/devsecops/","DevSecOps",[33,43,44],{},"Standardization",[46,47,49],"h2",{"id":48},"three-key-hurdles-that-come-with-implementing-cicd","Three key hurdles that come with implementing CI/CD",[12,51,52,53,58],{},"This blog post unpackes these challenges and explains how ",[16,54,57],{"href":55,"rel":56},"https://orange.com/",[],"Orange"," overcame them using GitLab.",[60,61,63],"h3",{"id":62},"devops-and-technical-skills","DevOps and technical skills",[12,65,66],{},"No matter which CI/CD tool you're using, it requires some amount of expertise to implement it right.",[12,68,69,73],{},[70,71,72],"strong",{},"DevOps expertise"," is important because your team needs some experience with Git workflows, deployment, environments, secrets management, etc. You can't ask a complete rookie to implement a state-of-the art DevOps pipeline without expertise or experience.",[12,75,76,79],{},[70,77,78],{},"Technical skills"," are also important for implementing CI/CD. Any professional can tell you that getting started tutorials are insufficient. We inevitably need advanced functions, and that requires knowing the tool pretty well. This is particularly true with GitLab CI/CD, which is a fantastic functionally rich tool. GitLab CI/CD is constantly evolving, which creates an ongoing burden for projects that want to integrate new tooling as they go.",[60,81,41],{"id":82},"devsecops",[12,84,85],{},"DevOps is all about finding the right balance between shortening the cycle and maximizing your confidence.",[12,87,88,92],{},[16,89,91],{"href":90},"/solutions/application-security-testing/","DevSecOps tools"," are a keystone in maximizing our confidence because they detect issues with things like security, code quality, and compliance, etc., almost instantly. But DevSecOps tools are evolving quickly and today's Docker container scanner tools can be replaced by newcomers in just a few months.",[12,94,95],{},"Also, having each development team in the company choose and integrate various DevSecOps tools doesn't make sense and will be a waste of time and resources. Going this route means most developers won't use any DevSecOps tool because the opportunity cost isn't worth the time and effort.",[60,97,44],{"id":98},"standardization",[12,100,101],{},"The last challenge in implementing CI/CD at a large company is the lack of standardization.",[12,103,104],{},"GitLab CI/CD - as with most other CI/CD tools - is mainly a sophisticated scheduler, allowing a team to define technical tasks and their sequence. GitLab CI/CD cares little about the nature of these tasks, and does not give any clues as to the \"right\" way to build a DevOps pipeline. The consequence of this is that every company, project team, and developer will implement a DevOps pipeline their own way, in a manner that is probably significantly different from their colleagues'.",[12,106,107,108,113,114,119],{},"As a lifelong Javaist, I like to compare the current situation in CI/CD with what was the Java build in the pre-Maven era. Back then, we used non-structuring tools such as ",[16,109,112],{"href":110,"rel":111},"https://en.wikipedia.org/wiki/Make_(software)",[],"Make"," or ",[16,115,118],{"href":116,"rel":117},"https://en.wikipedia.org/wiki/Apache_Ant",[],"Apache Ant",". Each project created its own build system, adopted its own conventions, code, and resource files structure. In short, it was a happy mess with everyone reinventing the wheel. When joining another project, a user had to ask: \"How does the build work here?\".",[12,121,122],{},"In 2004, Maven was released (and Gradle three years later). For a while, there were heated debates between the proponents of standardization and the defenders of expertise and customization. Today it would not occur to anyone to build a Java project with anything other than Maven or Gradle. Now, if I join a project developed in Java, I will immediately know how files are organized and how the project is built. Java build is now standardized.",[12,124,125],{},"I believe that CI/CD ought to go a similar route: tools should offer a more opinionated framework so that CI/CD too becomes a non-topic.",[46,127,129],{"id":128},"how-a-single-gitlab-feature-changed-the-game-for-orange","How a single GitLab feature changed the game for Orange",[12,131,132],{},"At Orange - probably like many other companies involved in IT - we struggled with the three challenges summarized above.",[12,134,135,136,144,145,150],{},"Then in January 2019, the ",[16,137,140],{"href":138,"rel":139},"https://docs.gitlab.com/ci/yaml/#include",[],[141,142,143],"code",{},"include"," feature was released in the ",[16,146,149],{"href":147,"rel":148},"https://docs.gitlab.com/releases/",[],"Community Edition (version 11.7) of GitLab",":",[152,153,158],"pre",{"className":154,"code":155,"language":156,"meta":157,"style":157},"language-yaml shiki shiki-themes github-light","include:\n  - project: a-path/to-some-project'\n    file: '/very-smart-template.yml'\n\n","yaml","",[141,159,160,172,188],{"__ignoreMap":157},[161,162,165,168],"span",{"class":163,"line":164},"line",1,[161,166,143],{"class":167},"shJU0",[161,169,171],{"class":170},"sgsFI",":\n",[161,173,175,178,181,184],{"class":163,"line":174},2,[161,176,177],{"class":170},"  - ",[161,179,180],{"class":167},"project",[161,182,183],{"class":170},": ",[161,185,187],{"class":186},"sYBdl","a-path/to-some-project'\n",[161,189,191,194,196],{"class":163,"line":190},3,[161,192,193],{"class":167},"    file",[161,195,183],{"class":170},[161,197,198],{"class":186},"'/very-smart-template.yml'\n",[12,200,201],{},"This feature finally gave us the ability to develop and share state-of-the-art GitLab CI/CD pipeline templates!",[12,203,204],{},"So that's what we did.",[12,206,207,208,211],{},"For two years, a handful of DevOps/security/languages/cloud experts developed ready-to-use GitLab CI/CD pipeline templates. This personal initiative quickly became recognized as an internal project, attracting more users and contributors, bringing the community to 1000+ members as of June 2021, and leveraging about 30 available templates. The visible effect of this increasing adoption is the beginning of a ",[70,209,210],{},"CI/CD standardization at Orange",".",[12,213,214,215,211],{},"We were so happy with our results and convinced that it's a general need that we open sourced our templates under the name ",[16,216,219],{"href":217,"rel":218},"https://to-be-continuous.gitlab.io/doc/",[],"\"to be continuous\"",[12,221,222,227],{},[223,224],"img",{"alt":225,"src":226},"To be continuous logo","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398780/blog/Content%20Images/orange_tbc.png","\nThe \"to be continuous\" logo.",[60,229,231,232,236],{"id":230},"what-is-in-to-be-continuous","What is in ",[233,234,235],"em",{},"to be continuous","?",[12,238,239,240,242],{},"For now, ",[233,241,235],{}," has 26 templates of six kinds:",[30,244,245,251,257,263,269,275,281],{},[33,246,247,250],{},[70,248,249],{},"Build & Test",": Angular, Bash, Go, Gradle, Maven, MkDocs, Node.js, PHP, Python",[33,252,253,256],{},[70,254,255],{},"Code Analysis",": Gitleaks, SonarQube",[33,258,259,262],{},[70,260,261],{},"Packaging",": Docker",[33,264,265,268],{},[70,266,267],{},"Infrastructure"," (IaC): Terraform",[33,270,271,274],{},[70,272,273],{},"Deploy & Run",": Ansible, Cloud Foundry, Google Cloud, Helm, Kubernetes, OpenShift, S3 (Simple Storage Service)",[33,276,277,280],{},[70,278,279],{},"Acceptance",": Cypress, Postman, Puppeteer, Robot Framework, SSL test, k6",[33,282,283,286],{},[70,284,285],{},"Others",": semantic-release",[12,288,289,292],{},[233,290,291],{},"To be continuous"," is thoroughly documented:",[30,294,295,302,309,320],{},[33,296,297],{},[16,298,301],{"href":299,"rel":300},"https://to-be-continuous.gitlab.io/doc/understand/",[],"Basic notions and philosophy",[33,303,304],{},[16,305,308],{"href":306,"rel":307},"https://to-be-continuous.gitlab.io/doc/usage/",[],"General usage principles",[33,310,311,312,314,315],{},"How to use ",[233,313,235],{}," in a ",[16,316,319],{"href":317,"rel":318},"https://to-be-continuous.gitlab.io/doc/self-managed/basic/",[],"self-managed instance of GitLab",[33,321,322,323],{},"Every template also has ",[16,324,327],{"href":325,"rel":326},"https://to-be-continuous.gitlab.io/doc/ref/angular/",[],"its own documentation",[12,329,330,331,333,334,339,340,343,344,347],{},"To get started quickly, ",[233,332,235],{}," provides an ",[16,335,338],{"href":336,"rel":337},"https://to-be-continuous.gitlab.io/kicker/",[],"interactive configurer"," (aka ",[233,341,342],{},"\"kicker\"",") that allows generating the ",[141,345,346],{},".gitlab-ci.yml"," file simply by selecting the technical characteristics of your project.",[12,349,350,351,353,354,359],{},"Finally, ",[233,352,235],{}," exposes several ",[16,355,358],{"href":356,"rel":357},"https://gitlab.com/to-be-continuous/samples",[],"example projects",", illustrating how to use the templates in production-like projects, combining multiple templates.",[60,361,363,364],{"id":362},"a-quick-glance-at-to-be-continuous","A quick glance at ",[233,365,235],{},[12,367,368,369,371],{},"There are tons of resources to get started with ",[233,370,235],{},". But here is a quick example to get the taste of it.",[12,373,374,375,377],{},"Here is the ",[141,376,346],{}," file for a project:",[30,379,380,383,386,389,392,395],{},[33,381,382],{},"Developed in Java 11 (built with Maven)",[33,384,385],{},"Code analysis with SonarQube",[33,387,388],{},"Packaged as a Docker image",[33,390,391],{},"Deployed to Kubernetes cluster",[33,393,394],{},"GUI tests with Cypress",[33,396,397],{},"API tests with Postman (Newman)",[152,399,401],{"className":154,"code":400,"language":156,"meta":157,"style":157},"include:\n  # Maven template\n  - project: \"to-be-continuous/maven\"\n    ref: \"1.4.2\"\n    file: \"templates/gitlab-ci-maven.yml\"\n  # Docker template\n  - project: \"to-be-continuous/docker\"\n    ref: \"1.2.0\"\n    file: \"templates/gitlab-ci-docker.yml\"\n  # Kubernetes template\n  - project: \"to-be-continuous/kubernetes\"\n    ref: \"1.2.0\"\n    file: \"templates/gitlab-ci-k8s.yml\"\n  # Cypress template\n  - project: \"to-be-continuous/cypress\"\n    ref: \"1.2.0\"\n    file: \"templates/gitlab-ci-cypress.yml\"\n  # Postman template\n  - project: \"to-be-continuous/postman\"\n    ref: \"1.2.0\"\n    file: \"templates/gitlab-ci-postman.yml\"\n\n# Global variables\nvariables:\n  # Explicitly define the Maven + JDK version\n  MAVEN_IMAGE: \"maven:3.8-openjdk-11\"\n\n  # Enables SonarQube analysis (on sonarcloud.io)\n  SONAR_URL: \"https://sonarcloud.io\"\n  # organization & projectKey defined in pom.xml\n  # SONAR_AUTH_TOKEN defined as a secret CI/CD variable\n\n  # Kubernetes\n  K8S_KUBECTL_IMAGE: \"bitnami/kubectl:1.17\" # client version matching my cluster\n  K8S_URL: \"https://k8s-api.my.domain\" # Kubernetes Cluster API url\n  # K8S_CA_CERT & K8S_TOKEN defined as secret CI/CD variables\n  # enable review, staging & prod\n  K8S_REVIEW_SPACE: \"non-prod\"\n  K8S_STAGING_SPACE: \"non-prod\"\n  K8S_PROD_SPACE: \"prod\"\n\n  # Cypress & Postman: enable test on review aps\n  REVIEW_ENABLED: \"true\"\n\n# Pipeline steps\nstages:\n  - build\n  - test\n  - package-build\n  - package-test\n  - review\n  - staging\n  - deploy\n  - acceptance\n  - publish\n  - production\n",[141,402,403,409,415,426,437,447,453,465,475,485,491,503,512,522,528,540,549,559,565,577,586,596,603,609,617,623,634,639,645,656,662,668,673,679,693,707,713,719,730,740,751,756,762,773,778,784,792,800,808,816,824,832,840,848,856,864],{"__ignoreMap":157},[161,404,405,407],{"class":163,"line":164},[161,406,143],{"class":167},[161,408,171],{"class":170},[161,410,411],{"class":163,"line":174},[161,412,414],{"class":413},"sAwPA","  # Maven template\n",[161,416,417,419,421,423],{"class":163,"line":190},[161,418,177],{"class":170},[161,420,180],{"class":167},[161,422,183],{"class":170},[161,424,425],{"class":186},"\"to-be-continuous/maven\"\n",[161,427,429,432,434],{"class":163,"line":428},4,[161,430,431],{"class":167},"    ref",[161,433,183],{"class":170},[161,435,436],{"class":186},"\"1.4.2\"\n",[161,438,440,442,444],{"class":163,"line":439},5,[161,441,193],{"class":167},[161,443,183],{"class":170},[161,445,446],{"class":186},"\"templates/gitlab-ci-maven.yml\"\n",[161,448,450],{"class":163,"line":449},6,[161,451,452],{"class":413},"  # Docker template\n",[161,454,456,458,460,462],{"class":163,"line":455},7,[161,457,177],{"class":170},[161,459,180],{"class":167},[161,461,183],{"class":170},[161,463,464],{"class":186},"\"to-be-continuous/docker\"\n",[161,466,468,470,472],{"class":163,"line":467},8,[161,469,431],{"class":167},[161,471,183],{"class":170},[161,473,474],{"class":186},"\"1.2.0\"\n",[161,476,478,480,482],{"class":163,"line":477},9,[161,479,193],{"class":167},[161,481,183],{"class":170},[161,483,484],{"class":186},"\"templates/gitlab-ci-docker.yml\"\n",[161,486,488],{"class":163,"line":487},10,[161,489,490],{"class":413},"  # Kubernetes template\n",[161,492,494,496,498,500],{"class":163,"line":493},11,[161,495,177],{"class":170},[161,497,180],{"class":167},[161,499,183],{"class":170},[161,501,502],{"class":186},"\"to-be-continuous/kubernetes\"\n",[161,504,506,508,510],{"class":163,"line":505},12,[161,507,431],{"class":167},[161,509,183],{"class":170},[161,511,474],{"class":186},[161,513,515,517,519],{"class":163,"line":514},13,[161,516,193],{"class":167},[161,518,183],{"class":170},[161,520,521],{"class":186},"\"templates/gitlab-ci-k8s.yml\"\n",[161,523,525],{"class":163,"line":524},14,[161,526,527],{"class":413},"  # Cypress template\n",[161,529,531,533,535,537],{"class":163,"line":530},15,[161,532,177],{"class":170},[161,534,180],{"class":167},[161,536,183],{"class":170},[161,538,539],{"class":186},"\"to-be-continuous/cypress\"\n",[161,541,543,545,547],{"class":163,"line":542},16,[161,544,431],{"class":167},[161,546,183],{"class":170},[161,548,474],{"class":186},[161,550,552,554,556],{"class":163,"line":551},17,[161,553,193],{"class":167},[161,555,183],{"class":170},[161,557,558],{"class":186},"\"templates/gitlab-ci-cypress.yml\"\n",[161,560,562],{"class":163,"line":561},18,[161,563,564],{"class":413},"  # Postman template\n",[161,566,568,570,572,574],{"class":163,"line":567},19,[161,569,177],{"class":170},[161,571,180],{"class":167},[161,573,183],{"class":170},[161,575,576],{"class":186},"\"to-be-continuous/postman\"\n",[161,578,580,582,584],{"class":163,"line":579},20,[161,581,431],{"class":167},[161,583,183],{"class":170},[161,585,474],{"class":186},[161,587,589,591,593],{"class":163,"line":588},21,[161,590,193],{"class":167},[161,592,183],{"class":170},[161,594,595],{"class":186},"\"templates/gitlab-ci-postman.yml\"\n",[161,597,599],{"class":163,"line":598},22,[161,600,602],{"emptyLinePlaceholder":601},true,"\n",[161,604,606],{"class":163,"line":605},23,[161,607,608],{"class":413},"# Global variables\n",[161,610,612,615],{"class":163,"line":611},24,[161,613,614],{"class":167},"variables",[161,616,171],{"class":170},[161,618,620],{"class":163,"line":619},25,[161,621,622],{"class":413},"  # Explicitly define the Maven + JDK version\n",[161,624,626,629,631],{"class":163,"line":625},26,[161,627,628],{"class":167},"  MAVEN_IMAGE",[161,630,183],{"class":170},[161,632,633],{"class":186},"\"maven:3.8-openjdk-11\"\n",[161,635,637],{"class":163,"line":636},27,[161,638,602],{"emptyLinePlaceholder":601},[161,640,642],{"class":163,"line":641},28,[161,643,644],{"class":413},"  # Enables SonarQube analysis (on sonarcloud.io)\n",[161,646,648,651,653],{"class":163,"line":647},29,[161,649,650],{"class":167},"  SONAR_URL",[161,652,183],{"class":170},[161,654,655],{"class":186},"\"https://sonarcloud.io\"\n",[161,657,659],{"class":163,"line":658},30,[161,660,661],{"class":413},"  # organization & projectKey defined in pom.xml\n",[161,663,665],{"class":163,"line":664},31,[161,666,667],{"class":413},"  # SONAR_AUTH_TOKEN defined as a secret CI/CD variable\n",[161,669,671],{"class":163,"line":670},32,[161,672,602],{"emptyLinePlaceholder":601},[161,674,676],{"class":163,"line":675},33,[161,677,678],{"class":413},"  # Kubernetes\n",[161,680,682,685,687,690],{"class":163,"line":681},34,[161,683,684],{"class":167},"  K8S_KUBECTL_IMAGE",[161,686,183],{"class":170},[161,688,689],{"class":186},"\"bitnami/kubectl:1.17\"",[161,691,692],{"class":413}," # client version matching my cluster\n",[161,694,696,699,701,704],{"class":163,"line":695},35,[161,697,698],{"class":167},"  K8S_URL",[161,700,183],{"class":170},[161,702,703],{"class":186},"\"https://k8s-api.my.domain\"",[161,705,706],{"class":413}," # Kubernetes Cluster API url\n",[161,708,710],{"class":163,"line":709},36,[161,711,712],{"class":413},"  # K8S_CA_CERT & K8S_TOKEN defined as secret CI/CD variables\n",[161,714,716],{"class":163,"line":715},37,[161,717,718],{"class":413},"  # enable review, staging & prod\n",[161,720,722,725,727],{"class":163,"line":721},38,[161,723,724],{"class":167},"  K8S_REVIEW_SPACE",[161,726,183],{"class":170},[161,728,729],{"class":186},"\"non-prod\"\n",[161,731,733,736,738],{"class":163,"line":732},39,[161,734,735],{"class":167},"  K8S_STAGING_SPACE",[161,737,183],{"class":170},[161,739,729],{"class":186},[161,741,743,746,748],{"class":163,"line":742},40,[161,744,745],{"class":167},"  K8S_PROD_SPACE",[161,747,183],{"class":170},[161,749,750],{"class":186},"\"prod\"\n",[161,752,754],{"class":163,"line":753},41,[161,755,602],{"emptyLinePlaceholder":601},[161,757,759],{"class":163,"line":758},42,[161,760,761],{"class":413},"  # Cypress & Postman: enable test on review aps\n",[161,763,765,768,770],{"class":163,"line":764},43,[161,766,767],{"class":167},"  REVIEW_ENABLED",[161,769,183],{"class":170},[161,771,772],{"class":186},"\"true\"\n",[161,774,776],{"class":163,"line":775},44,[161,777,602],{"emptyLinePlaceholder":601},[161,779,781],{"class":163,"line":780},45,[161,782,783],{"class":413},"# Pipeline steps\n",[161,785,787,790],{"class":163,"line":786},46,[161,788,789],{"class":167},"stages",[161,791,171],{"class":170},[161,793,795,797],{"class":163,"line":794},47,[161,796,177],{"class":170},[161,798,799],{"class":186},"build\n",[161,801,803,805],{"class":163,"line":802},48,[161,804,177],{"class":170},[161,806,807],{"class":186},"test\n",[161,809,811,813],{"class":163,"line":810},49,[161,812,177],{"class":170},[161,814,815],{"class":186},"package-build\n",[161,817,819,821],{"class":163,"line":818},50,[161,820,177],{"class":170},[161,822,823],{"class":186},"package-test\n",[161,825,827,829],{"class":163,"line":826},51,[161,828,177],{"class":170},[161,830,831],{"class":186},"review\n",[161,833,835,837],{"class":163,"line":834},52,[161,836,177],{"class":170},[161,838,839],{"class":186},"staging\n",[161,841,843,845],{"class":163,"line":842},53,[161,844,177],{"class":170},[161,846,847],{"class":186},"deploy\n",[161,849,851,853],{"class":163,"line":850},54,[161,852,177],{"class":170},[161,854,855],{"class":186},"acceptance\n",[161,857,859,861],{"class":163,"line":858},55,[161,860,177],{"class":170},[161,862,863],{"class":186},"publish\n",[161,865,867,869],{"class":163,"line":866},56,[161,868,177],{"class":170},[161,870,871],{"class":186},"production\n",[12,873,874,875,878],{},"This fully declarative file produces the following ",[70,876,877],{},"development pipeline"," (any feature branch):",[12,880,881],{},[223,882],{"alt":883,"src":884},"Screenshot of development pipeline","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398779/blog/Content%20Images/orange_development_pipeline.png",[12,886,887,888,891,892,113,895,898],{},"... and the following ",[70,889,890],{},"production pipeline"," (",[141,893,894],{},"master",[141,896,897],{},"main"," depending on your preferences):",[12,900,901],{},[223,902],{"alt":903,"src":904},"Screenshot of production pipeline","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398779/blog/Content%20Images/orange_production_pipeline.png",[12,906,907],{},"Although they look pretty much the same, they aren't:",[30,909,910,913,916],{},[33,911,912],{},"While the production pipeline privileges sureness and completeness, development pipelines privilege short cycles and developer experience. While code analysis jobs and acceptance tests are blocked in production, they only generate a non-blocking warning in development in case of failure.",[33,914,915],{},"The production pipeline deploys to the staging environment before deploying to production (provided acceptance tests are green). Development pipelines may deploy to a dynamically generated review environment (optional).",[33,917,918],{},"Developers may prefer to use a single integration environment (associated with the develop branch) instead of one review app per feature branch. The default behavior of the integration pipeline is much closer to the production one.",[12,920,921],{},"What you can't see:",[30,923,924,933,947,955,963,966,969,990],{},[33,925,926,927,932],{},"Java unit tests are automatically executed, their report is integrated to GitLab, with ",[16,928,931],{"href":929,"rel":930},"https://docs.gitlab.com/ci/yaml/#coverage",[],"code coverage"," too.",[33,934,935,936,113,941,946],{},"SonarQube integration automatically uses ",[16,937,940],{"href":938,"rel":939},"https://docs.sonarqube.org/latest/branches/overview/",[],"branch analysis",[16,942,945],{"href":943,"rel":944},"https://docs.sonarqube.org/latest/analysis/pull-request/",[],"MR analysis"," (with MR decoration) depending on the context.",[33,948,949,950,932],{},"Kubernetes environments are obviously ",[16,951,954],{"href":952,"rel":953},"https://docs.gitlab.com/ci/environments/",[],"integrated to GitLab",[33,956,957,962],{},[16,958,961],{"href":959,"rel":960},"https://docs.gitlab.com/ci/review_apps/",[],"Review apps"," can be cleaned-up manually or automatically on branch deletion.",[33,964,965],{},"Cypress and Postman tests reports are also integrated to GitLab.",[33,967,968],{},"Docker uses the Kaniko build by default but it might be configured to use Docker-in-Docker instead. It uses the GitLab registry by default but can be configured to use any other registry.",[33,970,971,972,977,978,983,984,989],{},"Each template integrates the most appropriate DevSecOps tools: ",[16,973,976],{"href":974,"rel":975},"https://kube-score.com/",[],"kube-score"," for Kubernetes, ",[16,979,982],{"href":980,"rel":981},"https://github.com/hadolint/hadolint",[],"hadolint"," for Docker, ",[16,985,988],{"href":986,"rel":987},"https://jeremylong.github.io/DependencyCheck/",[],"OWASP Dependency-Check"," for Maven, among others.",[33,991,992],{},"All those templates combine themselves gracefully. For example, Kubernetes may simply deploy the Docker image built upstream; Cypress and Postman tests automatically test the application deployed in the upstream jobs; Kubernetes could be replaced with OpenShift, GCP or any other supported hosting technology, it would behave the same.",[46,994,996,997],{"id":995},"contribute-to-to-be-continuous","Contribute to ",[233,998,235],{},[12,1000,1001,1005],{},[16,1002,235],{"href":1003,"rel":1004},"https://to-be-continuous.gitlab.io/doc",[]," is out and eagerly waiting for users and contributors.",[12,1007,1008,1009,1011],{},"Have a look and share your feedback. Whether you like our choices or not, we want to hear from you. Your inputs are even more valuable to help us improve ",[233,1010,235],{}," and cover as many use cases as possible.",[12,1013,1014,1015,1020],{},"But anyway, never forget this: ",[16,1016,1018],{"href":138,"rel":1017},[],[141,1019,143],{}," is undoubtedly the feature that makes CI/CD standardization possible in your company (and beyond).",[12,1022,1023,1024,1029,1030],{},"Cover image by ",[16,1025,1028],{"href":1026,"rel":1027},"https://unsplash.com/@graphicnode",[],"Graphic Node"," on ",[16,1031,1034],{"href":1032,"rel":1033},"https://unsplash.com/photos/yi1YB_FubH8",[],"Unsplash",[1036,1037,1038],"style",{},"html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":157,"searchDepth":174,"depth":174,"links":1040},[1041,1046,1052],{"id":48,"depth":174,"text":49,"children":1042},[1043,1044,1045],{"id":62,"depth":190,"text":63},{"id":82,"depth":190,"text":41},{"id":98,"depth":190,"text":44},{"id":128,"depth":174,"text":129,"children":1047},[1048,1050],{"id":230,"depth":190,"text":1049},"What is in to be continuous?",{"id":362,"depth":190,"text":1051},"A quick glance at to be continuous",{"id":995,"depth":174,"text":1053},"Contribute to to be continuous","open-source","2021-07-29","Find out how Orange made a first step toward CI/CD standardization with GitLab","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749682084/Blog/Hero%20Images/oranges.jpg",{},"/en-us/blog/how-orange-uses-gitlab-ci-cd-for-modern-devops",{"title":5,"description":1056,"ogTitle":5,"ogDescription":1056,"noIndex":1059,"ogImage":1060,"ogUrl":1064,"ogSiteName":1065,"ogType":1066,"canonicalUrls":1064},"https://about.gitlab.com/blog/how-orange-uses-gitlab-ci-cd-for-modern-devops","https://about.gitlab.com","article","how-orange-uses-gitlab-ci-cd-for-modern-devops","en-us/blog/how-orange-uses-gitlab-ci-cd-for-modern-devops",[19,1070,1071],"open source","CI","BlogPost","elurQHKRREBWnvLxmeP-BNHIIAx28fqDVRD5ka6JWdo",{"logo":1075,"freeTrial":1080,"sales":1085,"login":1090,"items":1095,"search":1421,"minimal":1452,"duo":1471,"switchNav":1480,"pricingDeployment":1491},{"config":1076},{"href":1077,"dataGaName":1078,"dataGaLocation":1079},"/","gitlab logo","header",{"text":1081,"config":1082},"Get free trial",{"href":1083,"dataGaName":1084,"dataGaLocation":1079},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":1086,"config":1087},"Request a demo",{"href":1088,"dataGaName":1089,"dataGaLocation":1079},"/sales/?contact-topic=request-demo","sales",{"text":1091,"config":1092},"Sign in",{"href":1093,"dataGaName":1094,"dataGaLocation":1079},"https://gitlab.com/users/sign_in/","sign in",[1096,1125,1224,1229,1343,1399],{"text":1097,"config":1098,"menu":1100},"Platform",{"dataNavLevelOne":1099},"platform",{"type":1101,"columns":1102},"cards",[1103,1109,1117],{"title":1097,"description":1104,"link":1105},"The intelligent orchestration platform for DevSecOps",{"text":1106,"config":1107},"Explore our Platform",{"href":1108,"dataGaName":1099,"dataGaLocation":1079},"/platform/",{"title":1110,"description":1111,"link":1112},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":1113,"config":1114},"Meet GitLab Duo",{"href":1115,"dataGaName":1116,"dataGaLocation":1079},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1118,"description":1119,"link":1120},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":1121,"config":1122},"Learn more",{"href":1123,"dataGaName":1124,"dataGaLocation":1079},"/why-gitlab/","why gitlab",{"text":1126,"left":601,"config":1127,"menu":1129},"Product",{"dataNavLevelOne":1128},"solutions",{"type":1130,"link":1131,"columns":1135,"feature":1203},"lists",{"text":1132,"config":1133},"View all Solutions",{"href":1134,"dataGaName":1128,"dataGaLocation":1079},"/solutions/",[1136,1160,1182],{"title":1137,"description":1138,"link":1139,"items":1144},"Automation","CI/CD and automation to accelerate deployment",{"config":1140},{"icon":1141,"href":1142,"dataGaName":1143,"dataGaLocation":1079},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[1145,1149,1152,1156],{"text":1146,"config":1147},"CI/CD",{"href":1148,"dataGaLocation":1079,"dataGaName":1146},"/solutions/continuous-integration/",{"text":1110,"config":1150},{"href":1115,"dataGaLocation":1079,"dataGaName":1151},"gitlab duo agent platform - product menu",{"text":1153,"config":1154},"Source Code Management",{"href":1155,"dataGaLocation":1079,"dataGaName":1153},"/solutions/source-code-management/",{"text":1157,"config":1158},"Automated Software Delivery",{"href":1142,"dataGaLocation":1079,"dataGaName":1159},"Automated software delivery",{"title":1161,"description":1162,"link":1163,"items":1167},"Security","Deliver code faster without compromising security",{"config":1164},{"href":90,"dataGaName":1165,"dataGaLocation":1079,"icon":1166},"security and compliance","ShieldCheckLight",[1168,1172,1177],{"text":1169,"config":1170},"Application Security Testing",{"href":90,"dataGaName":1171,"dataGaLocation":1079},"Application security testing",{"text":1173,"config":1174},"Software Supply Chain Security",{"href":1175,"dataGaLocation":1079,"dataGaName":1176},"/solutions/supply-chain/","Software supply chain security",{"text":1178,"config":1179},"Software Compliance",{"href":1180,"dataGaName":1181,"dataGaLocation":1079},"/solutions/software-compliance/","software compliance",{"title":1183,"link":1184,"items":1189},"Measurement",{"config":1185},{"icon":1186,"href":1187,"dataGaName":1188,"dataGaLocation":1079},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[1190,1194,1198],{"text":1191,"config":1192},"Visibility & Measurement",{"href":1187,"dataGaLocation":1079,"dataGaName":1193},"Visibility and Measurement",{"text":1195,"config":1196},"Value Stream Management",{"href":1197,"dataGaLocation":1079,"dataGaName":1195},"/solutions/value-stream-management/",{"text":1199,"config":1200},"Analytics & Insights",{"href":1201,"dataGaLocation":1079,"dataGaName":1202},"/solutions/analytics-and-insights/","Analytics and insights",{"title":1204,"type":1130,"items":1205},"GitLab for",[1206,1212,1218],{"text":1207,"config":1208},"Enterprise",{"icon":1209,"href":1210,"dataGaLocation":1079,"dataGaName":1211},"Building","/enterprise/","enterprise",{"text":1213,"config":1214},"Small Business",{"icon":1215,"href":1216,"dataGaLocation":1079,"dataGaName":1217},"Work","/small-business/","small business",{"text":1219,"config":1220},"Public Sector",{"icon":1221,"href":1222,"dataGaLocation":1079,"dataGaName":1223},"Organization","/solutions/public-sector/","public sector",{"text":1225,"config":1226},"Pricing",{"href":1227,"dataGaName":1228,"dataGaLocation":1079,"dataNavLevelOne":1228},"/pricing/","pricing",{"text":1230,"config":1231,"menu":1233},"Resources",{"dataNavLevelOne":1232},"resources",{"type":1130,"link":1234,"columns":1238,"feature":1332},{"text":1235,"config":1236},"View all resources",{"href":1237,"dataGaName":1232,"dataGaLocation":1079},"/resources/",[1239,1272,1299],{"title":1240,"items":1241},"Getting started",[1242,1247,1252,1257,1262,1267],{"text":1243,"config":1244},"Install",{"href":1245,"dataGaName":1246,"dataGaLocation":1079},"/install/","install",{"text":1248,"config":1249},"Quick start guides",{"href":1250,"dataGaName":1251,"dataGaLocation":1079},"/get-started/","quick setup checklists",{"text":1253,"config":1254},"Learn",{"href":1255,"dataGaLocation":1079,"dataGaName":1256},"https://university.gitlab.com/","learn",{"text":1258,"config":1259},"Product documentation",{"href":1260,"dataGaName":1261,"dataGaLocation":1079},"https://docs.gitlab.com/","product documentation",{"text":1263,"config":1264},"Best practice videos",{"href":1265,"dataGaName":1266,"dataGaLocation":1079},"/getting-started-videos/","best practice videos",{"text":1268,"config":1269},"Integrations",{"href":1270,"dataGaName":1271,"dataGaLocation":1079},"/integrations/","integrations",{"title":1273,"items":1274},"Discover",[1275,1280,1285,1290,1294],{"text":1276,"config":1277},"Customer success stories",{"href":1278,"dataGaName":1279,"dataGaLocation":1079},"/customers/","customer success stories",{"text":1281,"config":1282},"Blog",{"href":1283,"dataGaName":1284,"dataGaLocation":1079},"/blog/","blog",{"text":1286,"config":1287},"Demo Hub",{"href":1288,"dataGaName":1289,"dataGaLocation":1079},"/demo-hub/","demo hub",{"text":1291,"config":1292},"The Source",{"href":1293,"dataGaName":1284,"dataGaLocation":1079},"/the-source/",{"text":1295,"config":1296},"Remote",{"href":1297,"dataGaName":1298,"dataGaLocation":1079},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1300,"items":1301},"Connect",[1302,1307,1312,1317,1322,1327],{"text":1303,"config":1304},"GitLab Services",{"href":1305,"dataGaName":1306,"dataGaLocation":1079},"/services/","services",{"text":1308,"config":1309},"Contribute",{"href":1310,"dataGaName":1311,"dataGaLocation":1079},"https://contributors.gitlab.com","contribute",{"text":1313,"config":1314},"Community",{"href":1315,"dataGaName":1316,"dataGaLocation":1079},"/community/","community",{"text":1318,"config":1319},"Forum",{"href":1320,"dataGaName":1321,"dataGaLocation":1079},"https://forum.gitlab.com/","forum",{"text":1323,"config":1324},"Events",{"href":1325,"dataGaName":1326,"dataGaLocation":1079},"/events/","events",{"text":1328,"config":1329},"Partners",{"href":1330,"dataGaName":1331,"dataGaLocation":1079},"/partners/","partners",{"config":1333,"title":1336,"text":1337,"link":1338},{"background":1334,"textColor":1335},"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":1339,"config":1340},"Read the latest",{"href":1341,"dataGaName":1342,"dataGaLocation":1079},"/whats-new/","whats new",{"text":1344,"config":1345,"menu":1347},"Company",{"dataNavLevelOne":1346},"company",{"type":1130,"columns":1348},[1349],{"items":1350},[1351,1356,1362,1364,1369,1374,1379,1384,1389,1394],{"text":1352,"config":1353},"About",{"href":1354,"dataGaName":1355,"dataGaLocation":1079},"/company/","about",{"text":1357,"config":1358,"footerGa":1361},"Jobs",{"href":1359,"dataGaName":1360,"dataGaLocation":1079},"/jobs/","jobs",{"dataGaName":1360},{"text":1323,"config":1363},{"href":1325,"dataGaName":1326,"dataGaLocation":1079},{"text":1365,"config":1366},"Leadership",{"href":1367,"dataGaName":1368,"dataGaLocation":1079},"/company/team/e-group/","leadership",{"text":1370,"config":1371},"Handbook",{"href":1372,"dataGaName":1373,"dataGaLocation":1079},"https://handbook.gitlab.com/","handbook",{"text":1375,"config":1376},"Investor relations",{"href":1377,"dataGaName":1378,"dataGaLocation":1079},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1380,"config":1381},"Trust Center",{"href":1382,"dataGaName":1383,"dataGaLocation":1079},"/security/","trust center",{"text":1385,"config":1386},"AI Transparency Center",{"href":1387,"dataGaName":1388,"dataGaLocation":1079},"/ai-transparency-center/","ai transparency center",{"text":1390,"config":1391},"Newsletter",{"href":1392,"dataGaName":1393,"dataGaLocation":1079},"/company/contact/#contact-forms","newsletter",{"text":1395,"config":1396},"Press",{"href":1397,"dataGaName":1398,"dataGaLocation":1079},"/press/","press",{"text":1400,"config":1401,"menu":1402},"Contact us",{"dataNavLevelOne":1346},{"type":1130,"columns":1403},[1404],{"items":1405},[1406,1411,1416],{"text":1407,"config":1408},"Talk to sales",{"href":1409,"dataGaName":1410,"dataGaLocation":1079},"/sales/","talk to sales",{"text":1412,"config":1413},"Support portal",{"href":1414,"dataGaName":1415,"dataGaLocation":1079},"https://support.gitlab.com/hc/en-us","support portal",{"text":1417,"config":1418},"Customer portal",{"href":1419,"dataGaName":1420,"dataGaLocation":1079},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1422,"login":1423,"suggestions":1430},"Close",{"text":1424,"link":1425},"To search repositories and projects, login to",{"text":1426,"config":1427},"gitlab.com",{"href":1093,"dataGaName":1428,"dataGaLocation":1429},"search login","search",{"text":1431,"default":1432},"Suggestions",[1433,1435,1439,1441,1445,1449],{"text":1110,"config":1434},{"href":1115,"dataGaName":1110,"dataGaLocation":1429},{"text":1436,"config":1437},"Code Suggestions (AI)",{"href":1438,"dataGaName":1436,"dataGaLocation":1429},"/solutions/code-suggestions/",{"text":1146,"config":1440},{"href":1148,"dataGaName":1146,"dataGaLocation":1429},{"text":1442,"config":1443},"GitLab on AWS",{"href":1444,"dataGaName":1442,"dataGaLocation":1429},"/partners/technology-partners/aws/",{"text":1446,"config":1447},"GitLab on Google Cloud",{"href":1448,"dataGaName":1446,"dataGaLocation":1429},"/partners/technology-partners/google-cloud-platform/",{"text":1450,"config":1451},"Why GitLab?",{"href":1123,"dataGaName":1450,"dataGaLocation":1429},{"freeTrial":1453,"mobileIcon":1458,"desktopIcon":1463,"secondaryButton":1466},{"text":1454,"config":1455},"Start free trial",{"href":1456,"dataGaName":1084,"dataGaLocation":1457},"https://gitlab.com/-/trials/new/","nav",{"altText":1459,"config":1460},"Gitlab Icon",{"src":1461,"dataGaName":1462,"dataGaLocation":1457},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1459,"config":1464},{"src":1465,"dataGaName":1462,"dataGaLocation":1457},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1467,"config":1468},"Get Started",{"href":1469,"dataGaName":1470,"dataGaLocation":1457},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1472,"mobileIcon":1476,"desktopIcon":1478},{"text":1473,"config":1474},"Learn more about GitLab Duo",{"href":1115,"dataGaName":1475,"dataGaLocation":1457},"gitlab duo",{"altText":1459,"config":1477},{"src":1461,"dataGaName":1462,"dataGaLocation":1457},{"altText":1459,"config":1479},{"src":1465,"dataGaName":1462,"dataGaLocation":1457},{"button":1481,"mobileIcon":1486,"desktopIcon":1488},{"text":1482,"config":1483},"/switch",{"href":1484,"dataGaName":1485,"dataGaLocation":1457},"#contact","switch",{"altText":1459,"config":1487},{"src":1461,"dataGaName":1462,"dataGaLocation":1457},{"altText":1459,"config":1489},{"src":1490,"dataGaName":1462,"dataGaLocation":1457},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1492,"mobileIcon":1497,"desktopIcon":1499},{"text":1493,"config":1494},"Back to pricing",{"href":1227,"dataGaName":1495,"dataGaLocation":1457,"icon":1496},"back to pricing","GoBack",{"altText":1459,"config":1498},{"src":1461,"dataGaName":1462,"dataGaLocation":1457},{"altText":1459,"config":1500},{"src":1465,"dataGaName":1462,"dataGaLocation":1457},{"title":1502,"titleMobile":1503,"button":1504,"config":1509},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":1121,"config":1505},{"href":1506,"dataGaName":1507,"dataGaLocation":1508},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1510,"disabled":1059},"release",{"data":1512},{"text":1513,"source":1514,"edit":1520,"contribute":1525,"config":1530,"items":1535,"minimal":1739},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1515,"config":1516},"View page source",{"href":1517,"dataGaName":1518,"dataGaLocation":1519},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1521,"config":1522},"Edit this page",{"href":1523,"dataGaName":1524,"dataGaLocation":1519},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1526,"config":1527},"Please contribute",{"href":1528,"dataGaName":1529,"dataGaLocation":1519},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1531,"facebook":1532,"youtube":1533,"linkedin":1534},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1536,1583,1631,1675,1707],{"title":1225,"links":1537,"subMenu":1552},[1538,1542,1547],{"text":1539,"config":1540},"View plans",{"href":1227,"dataGaName":1541,"dataGaLocation":1519},"view plans",{"text":1543,"config":1544},"Why Premium?",{"href":1545,"dataGaName":1546,"dataGaLocation":1519},"/pricing/premium/","why premium",{"text":1548,"config":1549},"Why Ultimate?",{"href":1550,"dataGaName":1551,"dataGaLocation":1519},"/pricing/ultimate/","why ultimate",[1553],{"title":1554,"links":1555},"Contact Us",[1556,1559,1561,1563,1568,1573,1578],{"text":1557,"config":1558},"Contact sales",{"href":1409,"dataGaName":1089,"dataGaLocation":1519},{"text":1412,"config":1560},{"href":1414,"dataGaName":1415,"dataGaLocation":1519},{"text":1417,"config":1562},{"href":1419,"dataGaName":1420,"dataGaLocation":1519},{"text":1564,"config":1565},"Status",{"href":1566,"dataGaName":1567,"dataGaLocation":1519},"https://status.gitlab.com/","status",{"text":1569,"config":1570},"Terms of use",{"href":1571,"dataGaName":1572,"dataGaLocation":1519},"/terms/","terms of use",{"text":1574,"config":1575},"Privacy statement",{"href":1576,"dataGaName":1577,"dataGaLocation":1519},"/privacy/","privacy statement",{"text":1579,"config":1580},"Cookie preferences",{"dataGaName":1581,"dataGaLocation":1519,"id":1582,"isOneTrustButton":601},"cookie preferences","ot-sdk-btn",{"title":1126,"links":1584,"subMenu":1593},[1585,1589],{"text":1586,"config":1587},"DevSecOps platform",{"href":1108,"dataGaName":1588,"dataGaLocation":1519},"devsecops platform",{"text":1590,"config":1591},"AI-Assisted Development",{"href":1115,"dataGaName":1592,"dataGaLocation":1519},"ai-assisted development",[1594],{"title":1595,"links":1596},"Topics",[1597,1601,1606,1609,1614,1616,1621,1626],{"text":1598,"config":1599},"CICD",{"href":26,"dataGaName":1600,"dataGaLocation":1519},"cicd",{"text":1602,"config":1603},"GitOps",{"href":1604,"dataGaName":1605,"dataGaLocation":1519},"/topics/gitops/","gitops",{"text":19,"config":1607},{"href":18,"dataGaName":1608,"dataGaLocation":1519},"devops",{"text":1610,"config":1611},"Version Control",{"href":1612,"dataGaName":1613,"dataGaLocation":1519},"/topics/version-control/","version control",{"text":41,"config":1615},{"href":40,"dataGaName":82,"dataGaLocation":1519},{"text":1617,"config":1618},"Cloud Native",{"href":1619,"dataGaName":1620,"dataGaLocation":1519},"/topics/cloud-native/","cloud native",{"text":1622,"config":1623},"AI for Coding",{"href":1624,"dataGaName":1625,"dataGaLocation":1519},"/topics/devops/ai-for-coding/","ai for coding",{"text":1627,"config":1628},"Agentic AI",{"href":1629,"dataGaName":1630,"dataGaLocation":1519},"/topics/agentic-ai/","agentic ai",{"title":1632,"links":1633},"Solutions",[1634,1636,1638,1643,1647,1650,1654,1657,1659,1662,1665,1670],{"text":1169,"config":1635},{"href":90,"dataGaName":1169,"dataGaLocation":1519},{"text":1159,"config":1637},{"href":1142,"dataGaName":1143,"dataGaLocation":1519},{"text":1639,"config":1640},"Agile development",{"href":1641,"dataGaName":1642,"dataGaLocation":1519},"/solutions/agile-delivery/","agile delivery",{"text":1644,"config":1645},"SCM",{"href":1155,"dataGaName":1646,"dataGaLocation":1519},"source code management",{"text":1598,"config":1648},{"href":1148,"dataGaName":1649,"dataGaLocation":1519},"continuous integration & delivery",{"text":1651,"config":1652},"Value stream management",{"href":1197,"dataGaName":1653,"dataGaLocation":1519},"value stream management",{"text":1602,"config":1655},{"href":1656,"dataGaName":1605,"dataGaLocation":1519},"/solutions/gitops/",{"text":1207,"config":1658},{"href":1210,"dataGaName":1211,"dataGaLocation":1519},{"text":1660,"config":1661},"Small business",{"href":1216,"dataGaName":1217,"dataGaLocation":1519},{"text":1663,"config":1664},"Public sector",{"href":1222,"dataGaName":1223,"dataGaLocation":1519},{"text":1666,"config":1667},"Education",{"href":1668,"dataGaName":1669,"dataGaLocation":1519},"/solutions/education/","education",{"text":1671,"config":1672},"Financial services",{"href":1673,"dataGaName":1674,"dataGaLocation":1519},"/solutions/finance/","financial services",{"title":1230,"links":1676},[1677,1679,1681,1683,1686,1688,1691,1693,1695,1697,1699,1701,1703,1705],{"text":1243,"config":1678},{"href":1245,"dataGaName":1246,"dataGaLocation":1519},{"text":1248,"config":1680},{"href":1250,"dataGaName":1251,"dataGaLocation":1519},{"text":1253,"config":1682},{"href":1255,"dataGaName":1256,"dataGaLocation":1519},{"text":1258,"config":1684},{"href":1260,"dataGaName":1685,"dataGaLocation":1519},"docs",{"text":1281,"config":1687},{"href":1283,"dataGaName":1284,"dataGaLocation":1519},{"text":1689,"config":1690},"What's new",{"href":1341,"dataGaName":1342,"dataGaLocation":1519},{"text":1276,"config":1692},{"href":1278,"dataGaName":1279,"dataGaLocation":1519},{"text":1295,"config":1694},{"href":1297,"dataGaName":1298,"dataGaLocation":1519},{"text":1303,"config":1696},{"href":1305,"dataGaName":1306,"dataGaLocation":1519},{"text":1308,"config":1698},{"href":1310,"dataGaName":1311,"dataGaLocation":1519},{"text":1313,"config":1700},{"href":1315,"dataGaName":1316,"dataGaLocation":1519},{"text":1318,"config":1702},{"href":1320,"dataGaName":1321,"dataGaLocation":1519},{"text":1323,"config":1704},{"href":1325,"dataGaName":1326,"dataGaLocation":1519},{"text":1328,"config":1706},{"href":1330,"dataGaName":1331,"dataGaLocation":1519},{"title":1344,"links":1708},[1709,1711,1713,1715,1717,1719,1723,1728,1730,1732,1734],{"text":1352,"config":1710},{"href":1354,"dataGaName":1346,"dataGaLocation":1519},{"text":1357,"config":1712},{"href":1359,"dataGaName":1360,"dataGaLocation":1519},{"text":1365,"config":1714},{"href":1367,"dataGaName":1368,"dataGaLocation":1519},{"text":1370,"config":1716},{"href":1372,"dataGaName":1373,"dataGaLocation":1519},{"text":1375,"config":1718},{"href":1377,"dataGaName":1378,"dataGaLocation":1519},{"text":1720,"config":1721},"Sustainability",{"href":1722,"dataGaName":1720,"dataGaLocation":1519},"/sustainability/",{"text":1724,"config":1725},"Diversity, inclusion and belonging (DIB)",{"href":1726,"dataGaName":1727,"dataGaLocation":1519},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1380,"config":1729},{"href":1382,"dataGaName":1383,"dataGaLocation":1519},{"text":1390,"config":1731},{"href":1392,"dataGaName":1393,"dataGaLocation":1519},{"text":1395,"config":1733},{"href":1397,"dataGaName":1398,"dataGaLocation":1519},{"text":1735,"config":1736},"Modern Slavery Transparency Statement",{"href":1737,"dataGaName":1738,"dataGaLocation":1519},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1740},[1741,1744,1747],{"text":1742,"config":1743},"Terms",{"href":1571,"dataGaName":1572,"dataGaLocation":1519},{"text":1745,"config":1746},"Cookies",{"dataGaName":1581,"dataGaLocation":1519,"id":1582,"isOneTrustButton":601},{"text":1748,"config":1749},"Privacy",{"href":1576,"dataGaName":1577,"dataGaLocation":1519},[1751],{"id":1752,"title":7,"body":1058,"config":1753,"content":1755,"description":1058,"extension":1758,"meta":1759,"navigation":601,"path":1760,"seo":1761,"stem":1762,"__hash__":1763},"blogAuthors/en-us/blog/authors/pierre-smeyers.yml",{"template":1754},"BlogAuthor",{"name":7,"config":1756},{"headshot":157,"ctfId":1757},"pismy","yml",{},"/en-us/blog/authors/pierre-smeyers",{},"en-us/blog/authors/pierre-smeyers","DTgQxV6Wti2HrjRbrOgE-OEQYIeEJOQjrDxqqBPV05I",[1765,1773,1781],{"title":1766,"description":1767,"heroImage":1768,"category":1054,"date":1769,"authors":1770,"slug":1772,"externalUrl":1058},"What's new in Git 2.55.0?","Learn about the new features and changes in Git 2.55, including a new git-history(1) fixup command, an fsmonitor daemon for Linux, pushing to remote groups, and more.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782732487/ztwgrvlolpifo01vj8qc.png","2026-06-29",[1771],"Toon Claes","whats-new-in-git-2-55-0",{"title":1774,"description":1775,"heroImage":1776,"category":1054,"date":1777,"authors":1778,"slug":1780,"externalUrl":1058},"GitLab AI Hackathon 2026: Meet the winners","Nearly 7,000 developers built 600+ AI agents and flows on GitLab Duo Agent Platform. Find out who won and what they created.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776457632/llddiylsgwuze0u1rjks.png","2026-04-22",[1779],"Nick Veenhof","gitlab-ai-hackathon-2026-meet-the-winners",{"title":1782,"description":1783,"heroImage":1784,"category":1054,"date":1785,"authors":1786,"slug":1788,"externalUrl":1058},"What’s new in Git 2.54.0?","Learn about release contributions, including new repository maintenance, a new command to edit commit history, a replacement for git-sizer(1), and more.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782734716/ztwgrvlolpifo01vj8qc.png","2026-04-20",[1787],"Patrick Steinhardt","whats-new-in-git-2-54-0",{"promotions":1790},[1791,1805,1817,1829],{"id":1792,"categories":1793,"header":1795,"text":1796,"button":1797,"image":1802},"ai-modernization",[1794],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1798,"config":1799},"Get your AI maturity score",{"href":1800,"dataGaName":1801,"dataGaLocation":1284},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1803},{"src":1804},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1806,"categories":1807,"header":1809,"text":1796,"button":1810,"image":1814},"devops-modernization",[1808,82],"product","Are you just managing tools or shipping innovation?",{"text":1811,"config":1812},"Get your DevOps maturity score",{"href":1813,"dataGaName":1801,"dataGaLocation":1284},"/assessments/devops-modernization-assessment/",{"config":1815},{"src":1816},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1818,"categories":1819,"header":1821,"text":1796,"button":1822,"image":1826},"security-modernization",[1820],"security","Are you trading speed for security?",{"text":1823,"config":1824},"Get your security maturity score",{"href":1825,"dataGaName":1801,"dataGaLocation":1284},"/assessments/security-modernization-assessment/",{"config":1827},{"src":1828},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1830,"paths":1831,"header":1834,"text":1835,"button":1836,"image":1841},"github-azure-migration",[1832,1833],"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":1837,"config":1838},"See how GitLab compares to GitHub",{"href":1839,"dataGaName":1840,"dataGaLocation":1284},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1842},{"src":1816},{"header":1844,"blurb":1845,"button":1846,"secondaryButton":1851},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1847,"config":1848},"Get your free trial",{"href":1849,"dataGaName":1084,"dataGaLocation":1850},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1557,"config":1852},{"href":1409,"dataGaName":1089,"dataGaLocation":1850},1786803771270]