[{"data":1,"prerenderedAt":1522},["ShallowReactive",2],{"/blog/using-bazel-to-speed-up-gitlab-ci-builds":3,"navigation-en-us":738,"banner-en-us":1164,"footer-en-us":1174,"blog-post-authors-en-us-Jason Yavorska":1418,"blog-related-posts-en-us-using-bazel-to-speed-up-gitlab-ci-builds":1432,"blog-promotions-en-us":1458,"next-steps-en-us":1512},{"id":4,"title":5,"authors":6,"body":8,"category":718,"date":719,"description":720,"extension":721,"externalUrl":722,"faq":722,"featured":723,"heroImage":724,"meta":725,"navigation":108,"path":726,"seo":727,"slug":731,"stem":732,"tags":733,"template":736,"updatedDate":722,"__hash__":737},"blogPosts/en-us/blog/using-bazel-to-speed-up-gitlab-ci-builds.md","How to use Bazel with GitLab to speed up your builds",[7],"Jason Yavorska",{"type":9,"value":10,"toc":708},"minimark",[11,21,29,47,56,61,64,239,267,298,323,328,343,347,350,471,478,521,554,558,579,596,600,603,645,649,657,661,690,704],[12,13,14,20],"p",{},[15,16,19],"a",{"href":17,"rel":18},"https://bazel.build/",[],"Bazel"," is a useful tool that can be used with GitLab CI to push your build pipelines into overdrive.",[12,22,23,24,28],{},"For maximum correctness, ",[15,25,27],{"href":26},"/topics/ci-cd/","CI/CD"," systems will usually rebuild all of the artifacts from scratch on every run. This method is considered safer since artifacts from one pipeline won't negatively impact subsequent pipelines, and is a lesson learned from older CI tools where the agent state was persistent over time – so you never really knew if you could do a build from scratch. The problem with redoing everything every time though, is that it's slow. GitLab improves upon this by using caches and shared artifacts, but there's only so far that approach can take you.",[12,30,31,32,37,38,42,43,46],{},"Bazel is a good example of tackling things in a different way – it speeds up builds by only rebuilding what is necessary. On the surface, this might sound a lot like just having a cache and doing an incremental build. But the main difference is that Bazel is really good at not only being fast, but also ",[15,33,36],{"href":34,"rel":35},"https://docs.bazel.build/versions/3.4.0/guide.html#correct-incremental-rebuilds",[],"correct",". Bazel is much more reliable than traditional ",[39,40,41],"code",{},"Makefiles"," or build scripts, which are notorious for occasionally forcing you to ",[39,44,45],{},"make clean"," because they get into some inconsistent state they can't recover from.",[12,48,49,50,55],{},"As of now, Bazel supports building Java, C, C++, Python, and Objective-C, and can also produce packages for deployment on Android or iOS. More capabilities are being added all the time, as well as open source rule sets for other languages like Go, Scala and many more, so be sure to check their latest ",[15,51,54],{"href":52,"rel":53},"https://docs.bazel.build/versions/3.4.0/bazel-overview.html",[],"product overview"," for updates.",[57,58,60],"h2",{"id":59},"setting-up-bazel-builds-in-gitlab-ci","Setting up Bazel builds in GitLab CI",[12,62,63],{},"Setting up Bazel for builds is very straightforward. A job like the following does everything you need:",[65,66,71],"pre",{"className":67,"code":68,"language":69,"meta":70,"style":70},"language-yaml shiki shiki-themes github-light","variables:\n  BAZEL_DIGEST_VERSION: \"f670e9aec235aa23a5f068566352c5850a67eb93de8d7a2350240c68fcec3b25\" # Bazel 3.4.1\n\nbuild:\n  image:\n    name: gcr.io/cloud-marketplace-containers/google/bazel@sha256:$BAZEL_DIGEST_VERSION\n    entrypoint: [\"\"]\n  stage: build\n  script:\n    - bazel --output_base output build //main/...\n  artifacts:\n    paths:\n      - bazel-bin/main/hello-world\n  cache:\n    key: $BAZEL_DIGEST_VERSION\n    paths:\n      - output\n\n","yaml","",[39,72,73,86,103,110,118,126,137,152,163,171,180,188,196,205,213,224,231],{"__ignoreMap":70},[74,75,78,82],"span",{"class":76,"line":77},"line",1,[74,79,81],{"class":80},"shJU0","variables",[74,83,85],{"class":84},"sgsFI",":\n",[74,87,89,92,95,99],{"class":76,"line":88},2,[74,90,91],{"class":80},"  BAZEL_DIGEST_VERSION",[74,93,94],{"class":84},": ",[74,96,98],{"class":97},"sYBdl","\"f670e9aec235aa23a5f068566352c5850a67eb93de8d7a2350240c68fcec3b25\"",[74,100,102],{"class":101},"sAwPA"," # Bazel 3.4.1\n",[74,104,106],{"class":76,"line":105},3,[74,107,109],{"emptyLinePlaceholder":108},true,"\n",[74,111,113,116],{"class":76,"line":112},4,[74,114,115],{"class":80},"build",[74,117,85],{"class":84},[74,119,121,124],{"class":76,"line":120},5,[74,122,123],{"class":80},"  image",[74,125,85],{"class":84},[74,127,129,132,134],{"class":76,"line":128},6,[74,130,131],{"class":80},"    name",[74,133,94],{"class":84},[74,135,136],{"class":97},"gcr.io/cloud-marketplace-containers/google/bazel@sha256:$BAZEL_DIGEST_VERSION\n",[74,138,140,143,146,149],{"class":76,"line":139},7,[74,141,142],{"class":80},"    entrypoint",[74,144,145],{"class":84},": [",[74,147,148],{"class":97},"\"\"",[74,150,151],{"class":84},"]\n",[74,153,155,158,160],{"class":76,"line":154},8,[74,156,157],{"class":80},"  stage",[74,159,94],{"class":84},[74,161,162],{"class":97},"build\n",[74,164,166,169],{"class":76,"line":165},9,[74,167,168],{"class":80},"  script",[74,170,85],{"class":84},[74,172,174,177],{"class":76,"line":173},10,[74,175,176],{"class":84},"    - ",[74,178,179],{"class":97},"bazel --output_base output build //main/...\n",[74,181,183,186],{"class":76,"line":182},11,[74,184,185],{"class":80},"  artifacts",[74,187,85],{"class":84},[74,189,191,194],{"class":76,"line":190},12,[74,192,193],{"class":80},"    paths",[74,195,85],{"class":84},[74,197,199,202],{"class":76,"line":198},13,[74,200,201],{"class":84},"      - ",[74,203,204],{"class":97},"bazel-bin/main/hello-world\n",[74,206,208,211],{"class":76,"line":207},14,[74,209,210],{"class":80},"  cache",[74,212,85],{"class":84},[74,214,216,219,221],{"class":76,"line":215},15,[74,217,218],{"class":80},"    key",[74,220,94],{"class":84},[74,222,223],{"class":97},"$BAZEL_DIGEST_VERSION\n",[74,225,227,229],{"class":76,"line":226},16,[74,228,193],{"class":80},[74,230,85],{"class":84},[74,232,234,236],{"class":76,"line":233},17,[74,235,201],{"class":84},[74,237,238],{"class":97},"output\n",[12,240,241,242,244,245,248,249,254,255,260,261,266],{},"What this script does is define a job called ",[39,243,115],{}," which uses the official Google Bazel image. We track the digest version for two reasons: First, to ensure immutability (tags can be updated), and second to use it as a cache key so that the cache is invalidated whenever we upgrade the Bazel version. We also override the entry point because we want to pass our own parameters to our ",[39,246,247],{},"bazel"," invocation. The second parameter is the ",[15,250,253],{"href":251,"rel":252},"https://docs.bazel.build/versions/master/glossary.html#label",[],"label"," of the ",[15,256,259],{"href":257,"rel":258},"https://docs.bazel.build/versions/master/glossary.html#target",[],"target"," we want to build. A ",[15,262,265],{"href":263,"rel":264},"https://docs.bazel.build/versions/master/glossary.html#target-pattern",[],"target pattern"," can also be used here to tell Bazel to build multiple things (and what they depend on), rather than one thing (and what it depends on).",[12,268,269,270,273,274,279,280,283,284,287,288,293,294,297],{},"The first parameter (",[39,271,272],{},"--output_base output",") is to help Bazel work with a security feature of the GitLab runner. By default, the runner will ",[15,275,278],{"href":276,"rel":277},"https://docs.gitlab.com/ci/yaml/#artifactspaths",[],"not access files outside of the build dir",", but Bazel places its own cache outside by default. This parameter tells Bazel to place it inside, where the runner can access it. The next two sections (",[39,281,282],{},"artifacts"," and ",[39,285,286],{},"cache","), tell the runner where the output file you want to keep is, and importantly for Bazel, where the cache is that you want to persist. Note that until ",[15,289,292],{"href":290,"rel":291},"https://gitlab.com/gitlab-org/gitlab/-/issues/19746",[],"this issue to allow for traversing symlinks"," is resolved, you must give the full path to the specific outputs you want to keep within the ",[39,295,296],{},"bazel-bin"," folder.",[12,299,300,301,304,305,308,309,311,312,315,316,319,320,322],{},"When this job runs, it places the current cache (if it exists, and only for the current ",[39,302,303],{},"BAZEL_DIGEST_VERSION",") in the ",[39,306,307],{},"output"," folder, and then runs ",[39,310,247],{}," to build the ",[39,313,314],{},"main:hello-world"," target. It saves the artifact from ",[39,317,318],{},"bazel-bin/main/hello-world",", and then caches everything in ",[39,321,307],{}," for the next run.",[324,325,327],"h3",{"id":326},"bazel-notes-on-caching","Bazel: notes on caching",[12,329,330,331,336,337,342],{},"In this example we've set up Bazel to work with GitLab caching, and this is how we currently use it internally. If you already have Bazel remote cache (or even better, Bazel remote execution), there is no need to set up GitLab CI cache: It actually would likely make things slower since in that case there is no need to download and unpack the cache at all. Setting up remote caching or remote execution are more advanced and outside of the scope of this article, but are even better ways to speed up the build. Until then, using a GitLab cache can be a good interim step. If you're interested in learning more about remote cache/remote execution, this ",[15,332,335],{"href":333,"rel":334},"https://www.youtube.com/watch?v=MyuJRUwT5LI&t=1017s",[],"BazelCon video"," or Bazel's official ",[15,338,341],{"href":339,"rel":340},"https://docs.bazel.build/versions/master/remote-caching.html",[],"documentation on remote caching"," may be helpful.",[57,344,346],{"id":345},"building-and-testing-with-bazel","Building and testing with Bazel",[12,348,349],{},"Using Bazel to run your tests is just as easy, and there are nice benefits to doing so. If you can rely on accurately knowing what has changed, you can be more selective in doing incremental tests and have the confidence that tests that were skipped were truly unnecessary. This is also quite easy to set up using Bazel, but one thing to consider is that running builds and tests all at once (rather than splitting build and test into different jobs) is going to be more efficient. You can do that by using a build job that looks like this:",[65,351,353],{"className":67,"code":352,"language":69,"meta":70,"style":70},"variables:\n  BAZEL_DIGEST_VERSION: \"f670e9aec235aa23a5f068566352c5850a67eb93de8d7a2350240c68fcec3b25\" # 3.4.1\n\nbuild:\n  image:\n    name: gcr.io/cloud-marketplace-containers/google/bazel@sha256:$BAZEL_DIGEST_VERSION\n    entrypoint: [\"\"]\n  stage: build\n  script:\n    - bazel --output_base output test //main/...\n  artifacts:\n    paths:\n      - bazel-bin/main/hello-world\n  cache:\n    key: $BAZEL_DIGEST_VERSION\n    paths:\n      - output\n\n",[39,354,355,361,372,376,382,388,396,406,414,420,427,433,439,445,451,459,465],{"__ignoreMap":70},[74,356,357,359],{"class":76,"line":77},[74,358,81],{"class":80},[74,360,85],{"class":84},[74,362,363,365,367,369],{"class":76,"line":88},[74,364,91],{"class":80},[74,366,94],{"class":84},[74,368,98],{"class":97},[74,370,371],{"class":101}," # 3.4.1\n",[74,373,374],{"class":76,"line":105},[74,375,109],{"emptyLinePlaceholder":108},[74,377,378,380],{"class":76,"line":112},[74,379,115],{"class":80},[74,381,85],{"class":84},[74,383,384,386],{"class":76,"line":120},[74,385,123],{"class":80},[74,387,85],{"class":84},[74,389,390,392,394],{"class":76,"line":128},[74,391,131],{"class":80},[74,393,94],{"class":84},[74,395,136],{"class":97},[74,397,398,400,402,404],{"class":76,"line":139},[74,399,142],{"class":80},[74,401,145],{"class":84},[74,403,148],{"class":97},[74,405,151],{"class":84},[74,407,408,410,412],{"class":76,"line":154},[74,409,157],{"class":80},[74,411,94],{"class":84},[74,413,162],{"class":97},[74,415,416,418],{"class":76,"line":165},[74,417,168],{"class":80},[74,419,85],{"class":84},[74,421,422,424],{"class":76,"line":173},[74,423,176],{"class":84},[74,425,426],{"class":97},"bazel --output_base output test //main/...\n",[74,428,429,431],{"class":76,"line":182},[74,430,185],{"class":80},[74,432,85],{"class":84},[74,434,435,437],{"class":76,"line":190},[74,436,193],{"class":80},[74,438,85],{"class":84},[74,440,441,443],{"class":76,"line":198},[74,442,201],{"class":84},[74,444,204],{"class":97},[74,446,447,449],{"class":76,"line":207},[74,448,210],{"class":80},[74,450,85],{"class":84},[74,452,453,455,457],{"class":76,"line":215},[74,454,218],{"class":80},[74,456,94],{"class":84},[74,458,223],{"class":97},[74,460,461,463],{"class":76,"line":226},[74,462,193],{"class":80},[74,464,85],{"class":84},[74,466,467,469],{"class":76,"line":233},[74,468,201],{"class":84},[74,470,238],{"class":97},[12,472,473,474,477],{},"In a build that includes all tests, you typically want to run everything that changed. That's usually done using an invocation like ",[39,475,476],{},"bazel test //main/..."," which:",[479,480,481,512,515,518],"ol",{},[482,483,484,485,488,489,492,493,498,499,502,503,505,506,508,509,511],"li",{},"Finds all targets (referred to as ",[39,486,487],{},"...",") in the workspace location (",[39,490,491],{},"//"," denotes the root of the ",[15,494,497],{"href":495,"rel":496},"https://docs.bazel.build/versions/master/glossary.html#workspace",[],"workspace","), so we are referring to ",[39,500,501],{},"main"," relative to the root.) Note that you probably don't want to include a bare ",[39,504,491],{}," (without ",[39,507,501],{},"), since that will include the custom ",[39,510,307],{}," folder and that is probably not what you intended.",[482,513,514],{},"Builds usual targets.",[482,516,517],{},"Builds test targets.",[482,519,520],{},"Runs test targets.",[12,522,523,524,527,528,531,532,534,535,538,539,548,549,553],{},"Only using the ",[39,525,526],{},"test"," parameter works because ",[39,529,530],{},"bazel test"," not only runs tests, but also builds everything that matched the target pattern by default. Individual targets can be excluded from being matched by ",[39,533,487],{}," by applying a ",[39,536,537],{},"manual"," tag to them (",[15,540,543,544,547],{"href":541,"rel":542},"https://docs.bazel.build/versions/master/be/common-definitions.html#common-attributes",[],"see ",[39,545,546],{},"tags"," in the Bazel glossary table","). One callout - in the example project we're building (",[15,550,552],{"href":551},"#examples","details below","), there actually aren't any tests, so this fails because we requested a test pass and there weren't any. If your project has tests in it, it will work fine.",[57,555,557],{"id":556},"examples-using-bazel","Examples using Bazel",[12,559,560,561,566,567,572,573,578],{},"We're actually using Bazel here at GitLab to build our ",[15,562,565],{"href":563,"rel":564},"https://gitlab.com/gitlab-org/cluster-integration/gitlab-agent",[],"GitLab Agent for Kubernetes",". If you're interested in seeing a more complex, complete implementation using Bazel then that's a great one to explore. The simple example from this blog can be found live in ",[15,568,571],{"href":569,"rel":570},"https://gitlab.com/jyavorska/testbazel",[],"my own personal project",", and it is based on the ",[15,574,577],{"href":575,"rel":576},"https://docs.bazel.build/versions/3.4.0/tutorial/cpp.html",[],"stage three build tutorial"," from Bazel's own documentation.",[12,580,581,582,585,586,589,590,595],{},"Bazel itself is also highly configurable through its own ",[39,583,584],{},".bazelrc",", ",[39,587,588],{},"BUILD"," files, and more. The ",[15,591,594],{"href":592,"rel":593},"https://docs.bazel.build/versions/master/guide.html",[],"user documentation for Bazel"," contains several examples along with an exhaustive configuration reference.",[57,597,599],{"id":598},"whats-next-with-bazel","What's next with Bazel?",[12,601,602],{},"We are considering using Bazel in few more areas within GitLab:",[604,605,606,615,636],"ul",{},[482,607,608,609,614],{},"In an ideal world, after a minor change, the build and test should only take a few seconds to complete. When the jobs are fast enough, it could even be triggered via an editor on every change before being committed to git at all. This kind of capability could be integrated with the Web IDE, giving you immediate insight into the results of your change. We have an issue related to ",[15,610,613],{"href":611,"rel":612},"https://gitlab.com/gitlab-org/gitlab/-/issues/213604",[],"making it easier to run pipelines from the Web IDE"," that could take advantage of this.",[482,616,617,618,623,624,629,630,635],{},"By default, GitLab uses ",[15,619,622],{"href":620,"rel":621},"https://gitlab.com/gitlab-org/ci-cd/test_file_finder/",[],"a gem we created"," (which is available in this ",[15,625,628],{"href":626,"rel":627},"https://docs.gitlab.com/ci/testing/fail_fast_testing/",[],"template"," for test execution optimization, but all we're doing so far is running the riskiest tests first. As Bazel grows and adds support for more languages, it could potentially become a standard for this purpose, allowing you to run even fewer tests (and among those, the riskiest ones first). We have an ",[15,631,634],{"href":632,"rel":633},"https://gitlab.com/groups/gitlab-org/-/epics/4121",[],"epic"," where you can track progress toward this idea.",[482,637,638,639,644],{},"Finally, Bazel also supports distributed builds and caching, opening the door to autoscaling compilation and test capacity alongside runner capacity, or even sharing the same capacity for whatever jobs are needed at a given moment. This function would require managing your own capacity for this purpose, but in the future we could imagine this being added to GitLab. We have an ",[15,640,643],{"href":641,"rel":642},"https://gitlab.com/gitlab-org/gitlab-runner/-/issues/26663",[],"issue for exploring different ways Bazel could support distributed jobs"," using the GitLab Runner.",[57,646,648],{"id":647},"tell-us-your-bazel-success-stories","Tell us your Bazel success stories",[12,650,651,652,656],{},"Are you using Bazel with GitLab CI? We'd love your feedback on what features we could add to make things work better and hear about the performance gains you've found from the combo. Please let us know in the Meta issue below, or contact ",[15,653,7],{"href":654,"rel":655},"https://twitter.com/j4yav",[]," on Twitter.",[57,658,660],{"id":659},"related-content","Related content",[604,662,663,669,676,683],{},[482,664,665],{},[15,666,668],{"href":17,"rel":667},[],"Bazel website",[482,670,671],{},[15,672,675],{"href":673,"rel":674},"https://gitlab.com/gitlab-org/gitlab/-/issues/201484",[],"Meta issue for deeper integration in GitLab",[482,677,678],{},[15,679,682],{"href":680,"rel":681},"https://blog.bazel.build/2016/01/27/continuous-integration.html",[],"Bazel blog on integrating it with CI systems",[482,684,685],{},[15,686,689],{"href":687,"rel":688},"https://docs.gitlab.com/ci/quick_start/",[],"GitLab CI quick start",[12,691,692,693,698,699],{},"Cover image by ",[15,694,697],{"href":695,"rel":696},"https://unsplash.com/@switch_dtp_fotografie",[],"Lucas van Oort"," on ",[15,700,703],{"href":701,"rel":702},"https://unsplash.com",[],"Unsplash",[705,706,707],"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 pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}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":70,"searchDepth":88,"depth":88,"links":709},[710,713,714,715,716,717],{"id":59,"depth":88,"text":60,"children":711},[712],{"id":326,"depth":105,"text":327},{"id":345,"depth":88,"text":346},{"id":556,"depth":88,"text":557},{"id":598,"depth":88,"text":599},{"id":647,"depth":88,"text":648},{"id":659,"depth":88,"text":660},"engineering","2020-09-01","We explain why Bazel and GitLab CI are a great match to speed up your build times.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749667132/Blog/Hero%20Images/build-container-image-runner-fargate-codebuild-cover.jpg",{},"/en-us/blog/using-bazel-to-speed-up-gitlab-ci-builds",{"title":5,"description":720,"ogTitle":5,"ogDescription":720,"noIndex":723,"ogImage":724,"ogUrl":728,"ogSiteName":729,"ogType":730,"canonicalUrls":728},"https://about.gitlab.com/blog/using-bazel-to-speed-up-gitlab-ci-builds","https://about.gitlab.com","article","using-bazel-to-speed-up-gitlab-ci-builds","en-us/blog/using-bazel-to-speed-up-gitlab-ci-builds",[27,734,735],"integrations","tutorial","BlogPost","zERLYiGmhTfwuBOhH04eL7sxR1B_PAdM41aecNBjsSY",{"logo":739,"freeTrial":744,"sales":749,"login":754,"items":759,"search":1084,"minimal":1115,"duo":1134,"switchNav":1143,"pricingDeployment":1154},{"config":740},{"href":741,"dataGaName":742,"dataGaLocation":743},"/","gitlab logo","header",{"text":745,"config":746},"Get free trial",{"href":747,"dataGaName":748,"dataGaLocation":743},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":750,"config":751},"Request a demo",{"href":752,"dataGaName":753,"dataGaLocation":743},"/sales/?contact-topic=request-demo","sales",{"text":755,"config":756},"Sign in",{"href":757,"dataGaName":758,"dataGaLocation":743},"https://gitlab.com/users/sign_in/","sign in",[760,789,888,893,1006,1062],{"text":761,"config":762,"menu":764},"Platform",{"dataNavLevelOne":763},"platform",{"type":765,"columns":766},"cards",[767,773,781],{"title":761,"description":768,"link":769},"The intelligent orchestration platform for DevSecOps",{"text":770,"config":771},"Explore our Platform",{"href":772,"dataGaName":763,"dataGaLocation":743},"/platform/",{"title":774,"description":775,"link":776},"GitLab Duo Agent Platform","Agentic AI for the entire software lifecycle",{"text":777,"config":778},"Meet GitLab Duo",{"href":779,"dataGaName":780,"dataGaLocation":743},"/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":782,"description":783,"link":784},"Why GitLab","See the top reasons enterprises choose GitLab",{"text":785,"config":786},"Learn more",{"href":787,"dataGaName":788,"dataGaLocation":743},"/why-gitlab/","why gitlab",{"text":790,"left":108,"config":791,"menu":793},"Product",{"dataNavLevelOne":792},"solutions",{"type":794,"link":795,"columns":799,"feature":867},"lists",{"text":796,"config":797},"View all Solutions",{"href":798,"dataGaName":792,"dataGaLocation":743},"/solutions/",[800,823,846],{"title":801,"description":802,"link":803,"items":808},"Automation","CI/CD and automation to accelerate deployment",{"config":804},{"icon":805,"href":806,"dataGaName":807,"dataGaLocation":743},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[809,812,815,819],{"text":27,"config":810},{"href":811,"dataGaLocation":743,"dataGaName":27},"/solutions/continuous-integration/",{"text":774,"config":813},{"href":779,"dataGaLocation":743,"dataGaName":814},"gitlab duo agent platform - product menu",{"text":816,"config":817},"Source Code Management",{"href":818,"dataGaLocation":743,"dataGaName":816},"/solutions/source-code-management/",{"text":820,"config":821},"Automated Software Delivery",{"href":806,"dataGaLocation":743,"dataGaName":822},"Automated software delivery",{"title":824,"description":825,"link":826,"items":831},"Security","Deliver code faster without compromising security",{"config":827},{"href":828,"dataGaName":829,"dataGaLocation":743,"icon":830},"/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[832,836,841],{"text":833,"config":834},"Application Security Testing",{"href":828,"dataGaName":835,"dataGaLocation":743},"Application security testing",{"text":837,"config":838},"Software Supply Chain Security",{"href":839,"dataGaLocation":743,"dataGaName":840},"/solutions/supply-chain/","Software supply chain security",{"text":842,"config":843},"Software Compliance",{"href":844,"dataGaName":845,"dataGaLocation":743},"/solutions/software-compliance/","software compliance",{"title":847,"link":848,"items":853},"Measurement",{"config":849},{"icon":850,"href":851,"dataGaName":852,"dataGaLocation":743},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[854,858,862],{"text":855,"config":856},"Visibility & Measurement",{"href":851,"dataGaLocation":743,"dataGaName":857},"Visibility and Measurement",{"text":859,"config":860},"Value Stream Management",{"href":861,"dataGaLocation":743,"dataGaName":859},"/solutions/value-stream-management/",{"text":863,"config":864},"Analytics & Insights",{"href":865,"dataGaLocation":743,"dataGaName":866},"/solutions/analytics-and-insights/","Analytics and insights",{"title":868,"type":794,"items":869},"GitLab for",[870,876,882],{"text":871,"config":872},"Enterprise",{"icon":873,"href":874,"dataGaLocation":743,"dataGaName":875},"Building","/enterprise/","enterprise",{"text":877,"config":878},"Small Business",{"icon":879,"href":880,"dataGaLocation":743,"dataGaName":881},"Work","/small-business/","small business",{"text":883,"config":884},"Public Sector",{"icon":885,"href":886,"dataGaLocation":743,"dataGaName":887},"Organization","/solutions/public-sector/","public sector",{"text":889,"config":890},"Pricing",{"href":891,"dataGaName":892,"dataGaLocation":743,"dataNavLevelOne":892},"/pricing/","pricing",{"text":894,"config":895,"menu":897},"Resources",{"dataNavLevelOne":896},"resources",{"type":794,"link":898,"columns":902,"feature":995},{"text":899,"config":900},"View all resources",{"href":901,"dataGaName":896,"dataGaLocation":743},"/resources/",[903,935,962],{"title":904,"items":905},"Getting started",[906,911,916,921,926,931],{"text":907,"config":908},"Install",{"href":909,"dataGaName":910,"dataGaLocation":743},"/install/","install",{"text":912,"config":913},"Quick start guides",{"href":914,"dataGaName":915,"dataGaLocation":743},"/get-started/","quick setup checklists",{"text":917,"config":918},"Learn",{"href":919,"dataGaLocation":743,"dataGaName":920},"https://university.gitlab.com/","learn",{"text":922,"config":923},"Product documentation",{"href":924,"dataGaName":925,"dataGaLocation":743},"https://docs.gitlab.com/","product documentation",{"text":927,"config":928},"Best practice videos",{"href":929,"dataGaName":930,"dataGaLocation":743},"/getting-started-videos/","best practice videos",{"text":932,"config":933},"Integrations",{"href":934,"dataGaName":734,"dataGaLocation":743},"/integrations/",{"title":936,"items":937},"Discover",[938,943,948,953,957],{"text":939,"config":940},"Customer success stories",{"href":941,"dataGaName":942,"dataGaLocation":743},"/customers/","customer success stories",{"text":944,"config":945},"Blog",{"href":946,"dataGaName":947,"dataGaLocation":743},"/blog/","blog",{"text":949,"config":950},"Demo Hub",{"href":951,"dataGaName":952,"dataGaLocation":743},"/demo-hub/","demo hub",{"text":954,"config":955},"The Source",{"href":956,"dataGaName":947,"dataGaLocation":743},"/the-source/",{"text":958,"config":959},"Remote",{"href":960,"dataGaName":961,"dataGaLocation":743},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":963,"items":964},"Connect",[965,970,975,980,985,990],{"text":966,"config":967},"GitLab Services",{"href":968,"dataGaName":969,"dataGaLocation":743},"/services/","services",{"text":971,"config":972},"Contribute",{"href":973,"dataGaName":974,"dataGaLocation":743},"https://contributors.gitlab.com","contribute",{"text":976,"config":977},"Community",{"href":978,"dataGaName":979,"dataGaLocation":743},"/community/","community",{"text":981,"config":982},"Forum",{"href":983,"dataGaName":984,"dataGaLocation":743},"https://forum.gitlab.com/","forum",{"text":986,"config":987},"Events",{"href":988,"dataGaName":989,"dataGaLocation":743},"/events/","events",{"text":991,"config":992},"Partners",{"href":993,"dataGaName":994,"dataGaLocation":743},"/partners/","partners",{"config":996,"title":999,"text":1000,"link":1001},{"background":997,"textColor":998},"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":1002,"config":1003},"Read the latest",{"href":1004,"dataGaName":1005,"dataGaLocation":743},"/whats-new/","whats new",{"text":1007,"config":1008,"menu":1010},"Company",{"dataNavLevelOne":1009},"company",{"type":794,"columns":1011},[1012],{"items":1013},[1014,1019,1025,1027,1032,1037,1042,1047,1052,1057],{"text":1015,"config":1016},"About",{"href":1017,"dataGaName":1018,"dataGaLocation":743},"/company/","about",{"text":1020,"config":1021,"footerGa":1024},"Jobs",{"href":1022,"dataGaName":1023,"dataGaLocation":743},"/jobs/","jobs",{"dataGaName":1023},{"text":986,"config":1026},{"href":988,"dataGaName":989,"dataGaLocation":743},{"text":1028,"config":1029},"Leadership",{"href":1030,"dataGaName":1031,"dataGaLocation":743},"/company/team/e-group/","leadership",{"text":1033,"config":1034},"Handbook",{"href":1035,"dataGaName":1036,"dataGaLocation":743},"https://handbook.gitlab.com/","handbook",{"text":1038,"config":1039},"Investor relations",{"href":1040,"dataGaName":1041,"dataGaLocation":743},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1043,"config":1044},"Trust Center",{"href":1045,"dataGaName":1046,"dataGaLocation":743},"/security/","trust center",{"text":1048,"config":1049},"AI Transparency Center",{"href":1050,"dataGaName":1051,"dataGaLocation":743},"/ai-transparency-center/","ai transparency center",{"text":1053,"config":1054},"Newsletter",{"href":1055,"dataGaName":1056,"dataGaLocation":743},"/company/contact/#contact-forms","newsletter",{"text":1058,"config":1059},"Press",{"href":1060,"dataGaName":1061,"dataGaLocation":743},"/press/","press",{"text":1063,"config":1064,"menu":1065},"Contact us",{"dataNavLevelOne":1009},{"type":794,"columns":1066},[1067],{"items":1068},[1069,1074,1079],{"text":1070,"config":1071},"Talk to sales",{"href":1072,"dataGaName":1073,"dataGaLocation":743},"/sales/","talk to sales",{"text":1075,"config":1076},"Support portal",{"href":1077,"dataGaName":1078,"dataGaLocation":743},"https://support.gitlab.com/hc/en-us","support portal",{"text":1080,"config":1081},"Customer portal",{"href":1082,"dataGaName":1083,"dataGaLocation":743},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1085,"login":1086,"suggestions":1093},"Close",{"text":1087,"link":1088},"To search repositories and projects, login to",{"text":1089,"config":1090},"gitlab.com",{"href":757,"dataGaName":1091,"dataGaLocation":1092},"search login","search",{"text":1094,"default":1095},"Suggestions",[1096,1098,1102,1104,1108,1112],{"text":774,"config":1097},{"href":779,"dataGaName":774,"dataGaLocation":1092},{"text":1099,"config":1100},"Code Suggestions (AI)",{"href":1101,"dataGaName":1099,"dataGaLocation":1092},"/solutions/code-suggestions/",{"text":27,"config":1103},{"href":811,"dataGaName":27,"dataGaLocation":1092},{"text":1105,"config":1106},"GitLab on AWS",{"href":1107,"dataGaName":1105,"dataGaLocation":1092},"/partners/technology-partners/aws/",{"text":1109,"config":1110},"GitLab on Google Cloud",{"href":1111,"dataGaName":1109,"dataGaLocation":1092},"/partners/technology-partners/google-cloud-platform/",{"text":1113,"config":1114},"Why GitLab?",{"href":787,"dataGaName":1113,"dataGaLocation":1092},{"freeTrial":1116,"mobileIcon":1121,"desktopIcon":1126,"secondaryButton":1129},{"text":1117,"config":1118},"Start free trial",{"href":1119,"dataGaName":748,"dataGaLocation":1120},"https://gitlab.com/-/trials/new/","nav",{"altText":1122,"config":1123},"Gitlab Icon",{"src":1124,"dataGaName":1125,"dataGaLocation":1120},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1122,"config":1127},{"src":1128,"dataGaName":1125,"dataGaLocation":1120},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1130,"config":1131},"Get Started",{"href":1132,"dataGaName":1133,"dataGaLocation":1120},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/get-started/","get started",{"freeTrial":1135,"mobileIcon":1139,"desktopIcon":1141},{"text":1136,"config":1137},"Learn more about GitLab Duo",{"href":779,"dataGaName":1138,"dataGaLocation":1120},"gitlab duo",{"altText":1122,"config":1140},{"src":1124,"dataGaName":1125,"dataGaLocation":1120},{"altText":1122,"config":1142},{"src":1128,"dataGaName":1125,"dataGaLocation":1120},{"button":1144,"mobileIcon":1149,"desktopIcon":1151},{"text":1145,"config":1146},"/switch",{"href":1147,"dataGaName":1148,"dataGaLocation":1120},"#contact","switch",{"altText":1122,"config":1150},{"src":1124,"dataGaName":1125,"dataGaLocation":1120},{"altText":1122,"config":1152},{"src":1153,"dataGaName":1125,"dataGaLocation":1120},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1155,"mobileIcon":1160,"desktopIcon":1162},{"text":1156,"config":1157},"Back to pricing",{"href":891,"dataGaName":1158,"dataGaLocation":1120,"icon":1159},"back to pricing","GoBack",{"altText":1122,"config":1161},{"src":1124,"dataGaName":1125,"dataGaLocation":1120},{"altText":1122,"config":1163},{"src":1128,"dataGaName":1125,"dataGaLocation":1120},{"title":1165,"titleMobile":1166,"button":1167,"config":1172},"Duo Agent Platform delivers 400% ROI, per new Forrester Consulting study.","400% ROI: Forrester TEI for GitLab Duo",{"text":785,"config":1168},{"href":1169,"dataGaName":1170,"dataGaLocation":1171},"https://about.gitlab.com/blog/gitlab-duo-agent-platform-delivers-400-percent-roi/","forrester-tei-dap-banner","global-banner",{"layout":1173,"disabled":723},"release",{"data":1175},{"text":1176,"source":1177,"edit":1183,"contribute":1188,"config":1193,"items":1198,"minimal":1407},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":1178,"config":1179},"View page source",{"href":1180,"dataGaName":1181,"dataGaLocation":1182},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1184,"config":1185},"Edit this page",{"href":1186,"dataGaName":1187,"dataGaLocation":1182},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1189,"config":1190},"Please contribute",{"href":1191,"dataGaName":1192,"dataGaLocation":1182},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1194,"facebook":1195,"youtube":1196,"linkedin":1197},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1199,1246,1299,1343,1375],{"title":889,"links":1200,"subMenu":1215},[1201,1205,1210],{"text":1202,"config":1203},"View plans",{"href":891,"dataGaName":1204,"dataGaLocation":1182},"view plans",{"text":1206,"config":1207},"Why Premium?",{"href":1208,"dataGaName":1209,"dataGaLocation":1182},"/pricing/premium/","why premium",{"text":1211,"config":1212},"Why Ultimate?",{"href":1213,"dataGaName":1214,"dataGaLocation":1182},"/pricing/ultimate/","why ultimate",[1216],{"title":1217,"links":1218},"Contact Us",[1219,1222,1224,1226,1231,1236,1241],{"text":1220,"config":1221},"Contact sales",{"href":1072,"dataGaName":753,"dataGaLocation":1182},{"text":1075,"config":1223},{"href":1077,"dataGaName":1078,"dataGaLocation":1182},{"text":1080,"config":1225},{"href":1082,"dataGaName":1083,"dataGaLocation":1182},{"text":1227,"config":1228},"Status",{"href":1229,"dataGaName":1230,"dataGaLocation":1182},"https://status.gitlab.com/","status",{"text":1232,"config":1233},"Terms of use",{"href":1234,"dataGaName":1235,"dataGaLocation":1182},"/terms/","terms of use",{"text":1237,"config":1238},"Privacy statement",{"href":1239,"dataGaName":1240,"dataGaLocation":1182},"/privacy/","privacy statement",{"text":1242,"config":1243},"Cookie preferences",{"dataGaName":1244,"dataGaLocation":1182,"id":1245,"isOneTrustButton":108},"cookie preferences","ot-sdk-btn",{"title":790,"links":1247,"subMenu":1256},[1248,1252],{"text":1249,"config":1250},"DevSecOps platform",{"href":772,"dataGaName":1251,"dataGaLocation":1182},"devsecops platform",{"text":1253,"config":1254},"AI-Assisted Development",{"href":779,"dataGaName":1255,"dataGaLocation":1182},"ai-assisted development",[1257],{"title":1258,"links":1259},"Topics",[1260,1264,1269,1274,1279,1284,1289,1294],{"text":1261,"config":1262},"CICD",{"href":26,"dataGaName":1263,"dataGaLocation":1182},"cicd",{"text":1265,"config":1266},"GitOps",{"href":1267,"dataGaName":1268,"dataGaLocation":1182},"/topics/gitops/","gitops",{"text":1270,"config":1271},"DevOps",{"href":1272,"dataGaName":1273,"dataGaLocation":1182},"/topics/devops/","devops",{"text":1275,"config":1276},"Version Control",{"href":1277,"dataGaName":1278,"dataGaLocation":1182},"/topics/version-control/","version control",{"text":1280,"config":1281},"DevSecOps",{"href":1282,"dataGaName":1283,"dataGaLocation":1182},"/topics/devsecops/","devsecops",{"text":1285,"config":1286},"Cloud Native",{"href":1287,"dataGaName":1288,"dataGaLocation":1182},"/topics/cloud-native/","cloud native",{"text":1290,"config":1291},"AI for Coding",{"href":1292,"dataGaName":1293,"dataGaLocation":1182},"/topics/devops/ai-for-coding/","ai for coding",{"text":1295,"config":1296},"Agentic AI",{"href":1297,"dataGaName":1298,"dataGaLocation":1182},"/topics/agentic-ai/","agentic ai",{"title":1300,"links":1301},"Solutions",[1302,1304,1306,1311,1315,1318,1322,1325,1327,1330,1333,1338],{"text":833,"config":1303},{"href":828,"dataGaName":833,"dataGaLocation":1182},{"text":822,"config":1305},{"href":806,"dataGaName":807,"dataGaLocation":1182},{"text":1307,"config":1308},"Agile development",{"href":1309,"dataGaName":1310,"dataGaLocation":1182},"/solutions/agile-delivery/","agile delivery",{"text":1312,"config":1313},"SCM",{"href":818,"dataGaName":1314,"dataGaLocation":1182},"source code management",{"text":1261,"config":1316},{"href":811,"dataGaName":1317,"dataGaLocation":1182},"continuous integration & delivery",{"text":1319,"config":1320},"Value stream management",{"href":861,"dataGaName":1321,"dataGaLocation":1182},"value stream management",{"text":1265,"config":1323},{"href":1324,"dataGaName":1268,"dataGaLocation":1182},"/solutions/gitops/",{"text":871,"config":1326},{"href":874,"dataGaName":875,"dataGaLocation":1182},{"text":1328,"config":1329},"Small business",{"href":880,"dataGaName":881,"dataGaLocation":1182},{"text":1331,"config":1332},"Public sector",{"href":886,"dataGaName":887,"dataGaLocation":1182},{"text":1334,"config":1335},"Education",{"href":1336,"dataGaName":1337,"dataGaLocation":1182},"/solutions/education/","education",{"text":1339,"config":1340},"Financial services",{"href":1341,"dataGaName":1342,"dataGaLocation":1182},"/solutions/finance/","financial services",{"title":894,"links":1344},[1345,1347,1349,1351,1354,1356,1359,1361,1363,1365,1367,1369,1371,1373],{"text":907,"config":1346},{"href":909,"dataGaName":910,"dataGaLocation":1182},{"text":912,"config":1348},{"href":914,"dataGaName":915,"dataGaLocation":1182},{"text":917,"config":1350},{"href":919,"dataGaName":920,"dataGaLocation":1182},{"text":922,"config":1352},{"href":924,"dataGaName":1353,"dataGaLocation":1182},"docs",{"text":944,"config":1355},{"href":946,"dataGaName":947,"dataGaLocation":1182},{"text":1357,"config":1358},"What's new",{"href":1004,"dataGaName":1005,"dataGaLocation":1182},{"text":939,"config":1360},{"href":941,"dataGaName":942,"dataGaLocation":1182},{"text":958,"config":1362},{"href":960,"dataGaName":961,"dataGaLocation":1182},{"text":966,"config":1364},{"href":968,"dataGaName":969,"dataGaLocation":1182},{"text":971,"config":1366},{"href":973,"dataGaName":974,"dataGaLocation":1182},{"text":976,"config":1368},{"href":978,"dataGaName":979,"dataGaLocation":1182},{"text":981,"config":1370},{"href":983,"dataGaName":984,"dataGaLocation":1182},{"text":986,"config":1372},{"href":988,"dataGaName":989,"dataGaLocation":1182},{"text":991,"config":1374},{"href":993,"dataGaName":994,"dataGaLocation":1182},{"title":1007,"links":1376},[1377,1379,1381,1383,1385,1387,1391,1396,1398,1400,1402],{"text":1015,"config":1378},{"href":1017,"dataGaName":1009,"dataGaLocation":1182},{"text":1020,"config":1380},{"href":1022,"dataGaName":1023,"dataGaLocation":1182},{"text":1028,"config":1382},{"href":1030,"dataGaName":1031,"dataGaLocation":1182},{"text":1033,"config":1384},{"href":1035,"dataGaName":1036,"dataGaLocation":1182},{"text":1038,"config":1386},{"href":1040,"dataGaName":1041,"dataGaLocation":1182},{"text":1388,"config":1389},"Sustainability",{"href":1390,"dataGaName":1388,"dataGaLocation":1182},"/sustainability/",{"text":1392,"config":1393},"Diversity, inclusion and belonging (DIB)",{"href":1394,"dataGaName":1395,"dataGaLocation":1182},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1043,"config":1397},{"href":1045,"dataGaName":1046,"dataGaLocation":1182},{"text":1053,"config":1399},{"href":1055,"dataGaName":1056,"dataGaLocation":1182},{"text":1058,"config":1401},{"href":1060,"dataGaName":1061,"dataGaLocation":1182},{"text":1403,"config":1404},"Modern Slavery Transparency Statement",{"href":1405,"dataGaName":1406,"dataGaLocation":1182},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1408},[1409,1412,1415],{"text":1410,"config":1411},"Terms",{"href":1234,"dataGaName":1235,"dataGaLocation":1182},{"text":1413,"config":1414},"Cookies",{"dataGaName":1244,"dataGaLocation":1182,"id":1245,"isOneTrustButton":108},{"text":1416,"config":1417},"Privacy",{"href":1239,"dataGaName":1240,"dataGaLocation":1182},[1419],{"id":1420,"title":7,"body":722,"config":1421,"content":1423,"description":722,"extension":1426,"meta":1427,"navigation":108,"path":1428,"seo":1429,"stem":1430,"__hash__":1431},"blogAuthors/en-us/blog/authors/jason-yavorska.yml",{"template":1422},"BlogAuthor",{"name":7,"config":1424},{"headshot":70,"ctfId":1425},"jyavorska","yml",{},"/en-us/blog/authors/jason-yavorska",{},"en-us/blog/authors/jason-yavorska","eFtNS4VsB5vvAsfbNZ0pGZ1cC600ZgmmRzLEDxetiGk",[1433,1442,1450],{"title":1434,"description":1435,"heroImage":1436,"category":718,"date":1437,"authors":1438,"slug":1441,"externalUrl":722},"Confidential AI for GitLab Self-Hosted","Give developers AI coding agents in GitLab Duo without source code leaving a hardware-encrypted boundary — no GPUs needed.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png","2026-08-06",[1439,1440],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"title":1443,"description":1444,"heroImage":1445,"category":718,"date":1446,"authors":1447,"slug":1449,"externalUrl":722},"Green DevOps: Why carbon measurement belongs in your CI/CD pipeline","CI/CD pipelines have a hidden carbon cost. Here's why measuring it matters, and how you can get started with Eco CI and Carmen in GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-07-09",[1448],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1451,"description":1452,"heroImage":1453,"category":718,"date":1454,"authors":1455,"slug":1457,"externalUrl":722},"How to build CI/CD observability at scale","This practical guide to GitLab pipeline analytics helps self-managed users gain operational insights using Prometheus and Grafana.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-04-28",[1456],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"promotions":1459},[1460,1474,1486,1498],{"id":1461,"categories":1462,"header":1464,"text":1465,"button":1466,"image":1471},"ai-modernization",[1463],"ai","Is AI achieving its promise at scale?","Quiz will take 5 minutes or less",{"text":1467,"config":1468},"Get your AI maturity score",{"href":1469,"dataGaName":1470,"dataGaLocation":947},"/assessments/ai-modernization-assessment/","modernization assessment",{"config":1472},{"src":1473},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1475,"categories":1476,"header":1478,"text":1465,"button":1479,"image":1483},"devops-modernization",[1477,1283],"product","Are you just managing tools or shipping innovation?",{"text":1480,"config":1481},"Get your DevOps maturity score",{"href":1482,"dataGaName":1470,"dataGaLocation":947},"/assessments/devops-modernization-assessment/",{"config":1484},{"src":1485},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1487,"categories":1488,"header":1490,"text":1465,"button":1491,"image":1495},"security-modernization",[1489],"security","Are you trading speed for security?",{"text":1492,"config":1493},"Get your security maturity score",{"href":1494,"dataGaName":1470,"dataGaLocation":947},"/assessments/security-modernization-assessment/",{"config":1496},{"src":1497},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1499,"paths":1500,"header":1503,"text":1504,"button":1505,"image":1510},"github-azure-migration",[1501,1502],"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":1506,"config":1507},"See how GitLab compares to GitHub",{"href":1508,"dataGaName":1509,"dataGaLocation":947},"/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1511},{"src":1485},{"header":1513,"blurb":1514,"button":1515,"secondaryButton":1520},"Start building faster today","See what your team can do with the intelligent orchestration platform for DevSecOps.\n",{"text":1516,"config":1517},"Get your free trial",{"href":1518,"dataGaName":748,"dataGaLocation":1519},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":1220,"config":1521},{"href":1072,"dataGaName":753,"dataGaLocation":1519},1786803774692]