[{"data":1,"prerenderedAt":718},["ShallowReactive",2],{"/en-us/blog/jenkins-to-gitlab-migration-made-easy/":3,"navigation-en-us":36,"banner-en-us":463,"footer-en-us":480,"Fernando Diaz":690,"next-steps-en-us":703},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":8,"content":16,"config":25,"_id":29,"_type":30,"title":31,"_source":32,"_file":33,"_stem":34,"_extension":35},"/en-us/blog/jenkins-to-gitlab-migration-made-easy","blog",false,"",{"title":9,"description":10,"ogTitle":9,"ogDescription":10,"noIndex":6,"ogImage":11,"ogUrl":12,"ogSiteName":13,"ogType":14,"canonicalUrls":12,"schema":15},"Jenkins-to-GitLab migration made easy","Learn why and how to migrate from Jenkins to GitLab with ease by following this step-by-step guide.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663019/Blog/Hero%20Images/AdobeStock_519147119.jpg","https://about.gitlab.com/blog/jenkins-to-gitlab-migration-made-easy","https://about.gitlab.com","article","\n                        {\n        \"@context\": \"https://schema.org\",\n        \"@type\": \"Article\",\n        \"headline\": \"Jenkins-to-GitLab migration made easy\",\n        \"author\": [{\"@type\":\"Person\",\"name\":\"Fernando Diaz\"}],\n        \"datePublished\": \"2024-02-01\",\n      }",{"title":9,"description":10,"authors":17,"heroImage":11,"date":19,"body":20,"category":21,"tags":22},[18],"Fernando Diaz","2024-02-01","GitLab is the most comprehensive AI-powered DevSecOps platform. This means\nthat GitLab provides everything needed to plan, develop, and deliver secure\nsoftware faster, all within one tool.\n\n\nPlatforms take away the pains and struggles of integrating various tools\n(DIY DevOps) to enable the software development lifecycle (SDLC). Since\nJenkins is not a platform, additional tools are required to complete the\nSDLC. This DIY DevOps approach introduces toolchain complexity, which\ncreates the following drawbacks:\n\n\n- Custom support is required for the integration and orchestration of tools\n\n- Difficulty maintaining/upgrading/securing separate tools\n\n- Inefficiency in measuring organizational transformation\n\n- Poor developer experience\n\n- Additional management/time/budget costs\n\n- Loss of productivity\n\n- Context switching and collaboration inefficiencies\n\n\n\u003Ccenter>\n\n\u003Cfigure>\n   \u003Cimg src=\"https://res.cloudinary.com/about-gitlab-com/image/upload/v1752175993/Blog/ikr97sr9jclddeqdg7ew.png\" alt=\"Import project selection\">\n   \u003Cfigcaption>DIY DevOps vs. DevSecOps Platform\u003C/figcaption>\n\u003C/figure>\n\n\u003C/center>\n\n\u003Cp>\u003C/p>\n\n\nFor these reasons, many Jenkins teams are considering migrating to a\nDevSecOps platform. If you are looking for a more powerful, reliable, and\nsecure solution, GitLab is your best option! GitLab is free to get started\nwith and offers different subscription tiers based on the needs of your\norganization. To learn more about our offerings and features, check out our\n[pricing page](https://about.gitlab.com/pricing/).\n\n\nIn this blog, you will learn:\n\n- How to plan for a migration\n\n- How to migrate repositories from other source code management (SCM) tools\nto GitLab\n\n- How to migrate CI/CD pipelines from Jenkins to GitLab\n\n- Additional migration considerations\n\n\n### Planning for a migration\n\n\nBefore starting a migration from another tool to GitLab CI/CD, you should\nbegin by developing a migration plan. A migration plan is an important\ntechnical step for setting expectations. CI/CD tools differ in approach,\nstructure, and technical specifics, meaning that migrations are not just 1:1\nmappings of data. A migration plan will provide the following benefits:\n\n- Sets and communicates a clear vision of what your migration goals are,\nwhich helps your users understand why the effort is worth it. The value is\nclear when the work is done, but people need to be aware while it’s in\nprogress too.\n\n- Provides sponsorship and alignment from the relevant leadership teams\nhelps with the point above.\n\n- Spends time educating users on what’s different.\n\n- Finds ways to sequence or delay parts of the migration and prevent\nnon-migrated (or partially migrated) states for too long.\n\n- Documents advantages of the improvements that GitLab CI/CD offers, and\nupdates your implementation as part of the transition.\n\n\nA migration plan will allow you to put a process in place where you can\nslowly migrate to GitLab with minimal disruption. This may include running\nboth Jenkins and GitLab, while certain projects are moved to GitLab and\noffloaded from Jenkins.\n\n\n### Defining a change management process\n\n\nThe migration plan should define an effective change management process.\nDevelopers, IT Operations, Cloud Administrators, Security, and Quality\nEngineers may not have experience with GitLab and they may not know why you\nor your leadership have decided to move in this direction.\n\n\nThe people this is impacting need to know:\n\n- __Why__ the change is being made\n\n- __What__ the future state looks like\n\n- __How__ the company intends to get there from here\n\n- __Where__ to go for more information or help \n\n\nTo this end, you should consider the following steps to manage change across\nthese functional roles: \n\n- __Analyze the current state__: Document the current state of processes.\nGather metrics as a baseline. Identify what's working and not working with\nCI/CD by interviewing key team members. Document the challenges you uncover\nboth quantitatively and qualitatively. You’re going to have to sell the\nvision and reason for the change, so the more clearly you can define the\nproblem set, the easier it will be to gain buy-in from across the business. \n\n- __Establish a vision__: Now that you have current pain points outlined\nquantitatively with baseline metrics and qualitatively (in the words of your\nteam members), communicate a vision of the future state. Explain why it's\nimportant (tie this to business success metrics). Provide live and recorded\ndemonstrations of what good looks like and compare it to the current state.\nReinforce this message through multiple channels and media — chat groups,\nall-hands meetings, email notifications, banner notifications on GitLab,\netc.\n\n- __Educate the workforce__: Invest in [GitLab CI/CD\nTraining](https://about.gitlab.com/services/education/gitlab-ci/) delivered\nby a GitLab expert. Measure knowledge acquisition and retention using\n[GitLab Certifications](https://levelup.gitlab.com/pages/certifications). \n\n- __Communicate roadmap and resources__: Communicate to your team members\nthe intended timeline, available resources to help them transition, and\ncommunity resources like chat groups, Q&A boards, or GitLab Influencer\noffice hours so they can ask questions and get help. Bonus points for\nbuilding a reward system to incentivize teams to transition early and share\ntheir experience with their peer application groups!\n\n\nIf you have these elements in place as you begin this transition, you will\nhave a framework for success. \n\n\n### Establishing migration goals\n\nBefore performing a migration, you should have a good understanding of your\ngoals and how to meet them. For example, some questions you should have\nanswers to are as follows:\n\n- What is your timeline to migrate?\n\n- How is your Jenkins server currently configured?\n\n- How many projects must be migrated?\n\n- What is the complexity of your pipeline?\n\n- Does it require external dependencies, multiple pipeline triggers,\nparallel builds, etc.?\n\n- How/Where do you deploy your code?\n\n- What is the release/review process for deploying code?\n\n- Is it integrated into Jenkins, or a separate workflow triggered by\nJenkins?\n\n- Which build artifacts or binaries are required for pipeline success?\n\n- Which plugins are used by jobs in Jenkins today?\n\n- Which software is installed on the Jenkins agents?\n\n- What SCM solution are you currently using?\n\n- Are there any shared libraries in use within your Jenkins jobs?\n\n- Which authentication method is used for Jenkins (Basic auth, LDAP/AD,\nSSO)?\n\n- Are there other projects that you need to access from your pipeline?\n\n- Are there credentials in Jenkins used to access outside services?\n\n\nBy answering these questions you’ll know how to proceed with the migration,\nhow long it will take, and where to start. Once you have built a plan and\nare confident of the expectations and possible pitfalls, you can begin the\nmigration process.\n\n\n### Prerequisites for migration\n\nOnce you have created a migration plan and addressed all the expectations of\nthe migration, you can begin to set up GitLab. Some of the prerequisites\nsuggested for migration are as follows:\n\n- Get familiar with GitLab. Read about the [key GitLab CI/CD\nfeatures](https://docs.gitlab.com/ee/ci/index.html).\n\n- Follow tutorials to create your first [GitLab\npipeline](https://docs.gitlab.com/ee/ci/quick_start/index.html) and [more\ncomplex pipelines](https://docs.gitlab.com/ee/ci/quick_start/tutorial.html)\nthat build, test, and deploy a static site.\n\n- Review the [.gitlab-ci.yml keyword\nreference](https://docs.gitlab.com/ee/ci/yaml/index.html).\n\n- Set up and configure GitLab.\n\n- Test your GitLab instance.\n\n\nOnce you understand GitLab and an instance has been configured, you can work\nthrough your migration plan and begin to move projects from Jenkins over to\nGitLab. Make sure your GitLab instance has been properly set up using GitLab\nbest practices and [reference\narchitectures](https://docs.gitlab.com/ee/administration/reference_architectures/).\n\n\n### Migrating repositories to GitLab\n\nOne of the main drawbacks of Jenkins is that it does not provide an SCM\nsolution. If you are using Jenkins, your code must be stored in a separate\nSCM solution which Jenkins must have access to. Because GitLab has built-in\nSCM, migrating away from Jenkins also allows you to migrate from the SCM\nsolution you were leveraging, bringing forth an additional reduction in\ncosts.\n\n\nGitLab provides tools to allow you to easily move your repository and its\nmetadata into GitLab. The following importers are included to assist in\nmigrating your projects to GitLab:\n\n\n- [GitHub](https://docs.gitlab.com/ee/user/project/import/github.html)\n\n- [Another GitLab\ninstance](https://docs.gitlab.com/ee/user/project/settings/import_export.html)\n\n- [Bitbucket\nCloud](https://docs.gitlab.com/ee/user/project/import/bitbucket.html)\n\n- [Bitbucket\nServer](https://docs.gitlab.com/ee/user/project/import/bitbucket_server.html)\n\n- [FogBugz](https://docs.gitlab.com/ee/user/project/import/fogbugz.html)\n\n- [Gitea](https://docs.gitlab.com/ee/user/project/import/gitea.html)\n\n- [Jira (Issues\nonly)](https://docs.gitlab.com/ee/user/project/import/jira.html)\n\n- [Repo by manifest\nfile](https://docs.gitlab.com/ee/user/project/import/manifest.html)\n\n- [Repo by\nURL](https://docs.gitlab.com/ee/user/project/import/repo_by_url.html)\n\n\n\u003Ccenter>\n\n\u003Cfigure>\n   \u003Cimg src=\"https://res.cloudinary.com/about-gitlab-com/image/upload/v1752176002/Blog/ie2xrexhbcoq6m8rnhit.png\" alt=\"GitHub to GitLab Repo Exporter\">\n   \u003Cfigcaption>GitHub to GitLab Repo Exporter\u003C/figcaption>\n\u003C/figure>\n\n\u003C/center>\n\n\u003Cp>\u003C/p>\n\n\nEach importer imports different data from a project. Read the [import and\nmigrate projects\ndocumentation](https://docs.gitlab.com/ee/user/project/import/) to learn\nmore about the provided importers to see what data is migrated to GitLab.\nAdditionally, you can [automate group and project\nimport](https://docs.gitlab.com/ee/user/project/import/#automate-group-and-project-import)\nand build a custom solution to further suit the needs of your organization:\n\n\n- [Professional Services](https://about.gitlab.com/services/)\n\n- [Migration\nUtilities](https://gitlab.com/gitlab-org/professional-services-automation/tools/migration/congregate/-/blob/master/docs/using-congregate.md#quick-start)\n\n- [Frequently Asked Migration\nQuestions](https://gitlab.com/gitlab-org/professional-services-automation/tools/migration/congregate/-/blob/master/customer/famq.md)\n\n\n### How to migrate a repository\n\nMigrating a repository to GitLab is easy using our built-in importers. In\nthis example, I’ll show how to copy a repo from GitHub to GitLab along with\n[its\nresources](https://docs.gitlab.com/ee/user/project/import/github.html#imported-data)\n(Issues, Pull Requests, Milestones, etc.). In order to migrate a repository\nfrom another GitHub to GitLab, you can follow the steps below:\n\n\n1. On the left sidebar, at the top, select **Create new (+)**.\n\n2. Select **New project/repository** under the In GitLab section.\n\n3. Select **Import project**.\n\n\n\u003Ccenter>\n\n\u003Cfigure>\n   \u003Cimg src=\"https://res.cloudinary.com/about-gitlab-com/image/upload/v1752176017/Blog/boowmmaqhbredxa3g92s.png\" alt=\"Import project selection\">\n   \u003Cfigcaption>Import project selection\u003C/figcaption>\n\u003C/figure>\n\n\u003C/center>\n\n\u003Cp>\u003C/p>\n\n\n4. Click the **GitHub** button.\n    - If using GitLab self-managed, then you must [enable the GitHub importer](https://docs.gitlab.com/ee/administration/settings/import_and_export_settings.html#configure-allowed-import-sources).\n    - Note that other importers can be initiated in the same way.\n5. Now you can either:\n    - Authorize with GitHub OAuth: Select **Authorize with GitHub**.\n    - Or, use a GitHub personal access token:\n       - Go to [https://github.com/settings/tokens/new](https://github.com/settings/tokens/new).\n       - In the **Note** field, enter a token description.\n       - Select the repo scope.\n       - Optionally to import collaborators, select the              **read:org** scope.\n       - Click the **Generate token** button.\n       - On the GitLab import page, in the Personal Access Token field, paste the GitHub personal access token.\n6. Click the **Authenticate** button.\n\n7. Select the items you wish to migrate.\n\n8. Select the projects you wish to migrate and to where.\n\n9. Press the **Import** button.\n\n\nNow you should have the imported project in your workspace. For additional\nguidance on migrating from GitHub to GitLab you can watch this video:\n\n\n\u003C!-- blank line -->\n\n\u003Cfigure class=\"video_container\">\n  \u003Ciframe src=\"https://www.youtube.com/embed/0Id5oMl1Kqs?si=TQ5HI9aMwtzJMiMi\" frameborder=\"0\" allowfullscreen=\"true\"> \u003C/iframe>\n\u003C/figure>\n\n\u003C!-- blank line -->\n\n\nOnce you have completed the repository migration, you can set your Jenkins\npipeline to leverage the Jenkinsfile within GitLab. This can be done by\nsetting the repository URL via to your newly imported project via the Jenkin\npipeline configuration menu:\n\n\n\u003Ccenter>\n\n\u003Cfigure>\n   \u003Cimg src=\"https://res.cloudinary.com/about-gitlab-com/image/upload/v1752176020/Blog/mu475liw66abcxbu2g6g.png\" alt=\"Jenkins Pipeline SCM settings\">\n   \u003Cfigcaption>Jenkins Pipeline SCM settings\u003C/figcaption>\n\u003C/figure>\n\n\u003C/center>\n\n\u003Cp>\u003C/p>\n\n\nThis is useful for the initial repo migration phase and allows you to use\nboth Jenkins and GitLab in parallel, preventing service disruptions while\nyou work on migrating the CI/CD functionality.\n\n\nAdditionally, you can leverage the [GitLab Jenkins\nplugin](https://plugins.jenkins.io/gitlab-plugin/) to assist with migration.\nThis plugin allows GitLab to trigger and obtain the status of Jenkins\nbuilds.\n\n\n### Migrating CI/CD pipelines\n\nOnce you have migrated your repositories to GitLab, you can proceed to\nmigrate your Jenkins pipelines to GitLab. This process can be fairly\nstraightforward, but requires an understanding of both Jenkins and GitLab\nconcepts and syntax.\n\n\nJenkins provides two different types of syntax for defining pipelines,\nDeclarative and Scripted. In this guide we will be covering migrating from\nDeclarative pipelines since they are the most commonly used.\n\n\n### Step-by-step pipeline migration\n\nIn this tutorial we will analyze a Jenkinsfile (Groovy) alongside a GitLab\nCI/CD configuration file (YAML) that builds, tests, and deploys a\nmicroservice written in Golang. We will then proceed to enable the pipeline\nwithin GitLab and see its results. The pipeline will:\n\n\n- Use the golang container image with the **alpine** tag\n\n- Run a job for building the Golang code into an executable binary\n   - Stores the built executable as an artifact\n- Run a job to run unit tests\n\n- Run a job to deploy to staging\n   - Only executes if the commit targets the **staging** branch\n   - Starts after the **test** stage succeeds\n   - Uses the built executable artifact from the earlier job\n\nBelow you can see Jenkins and GitLab pipeline definitions along with\ndescriptive comments. You can see the pipeline in action in the [Meow\nMigration\nproject](https://gitlab.com/gitlab-de/projects/blogs/meow-migration).\n\n\nLet's take a look at a Jenkinsfile written in Groovy:\n\n\n```  \n\n// The top-level of the declarative\n\n// pipeline.\n\npipeline {\n\n  // Defines the default agent to use\n  // when it is not explicitly defined\n  // in a job.\n    agent any\n\n  // Defines the stages that will run\n  // in numerical order. Each stage\n  // only runs one job.\n    stages {\n\n    // Defines the name of the stage\n        stage('build') {\n      // Defines the container image to\n      // use for this job, overwriting\n      // the default 'agent any'.\n      // The Jenkins Docker plugin\n      // must be configured for this\n      // to run.\n            agent { docker 'golang:alpine' }\n\n      // Defines the sequence of steps\n      // to execute when the stage is\n      // run.\n            steps {\n                sh 'go build -o bin/meow-micro'\n                sh 'chmod +x bin/meow-micro'\n            }\n\n      // The steps to run after the\n      // stage completes.\n            post {\n              always {\n\n        // Stores the stage artifacts\n        // generated for use in another\n        // job.\n                archiveArtifacts artifacts: 'bin/meow-micro'\n                onlyIfSuccessful: true\n              }\n            }\n        }\n\n    stage('test') {\n            agent { docker 'golang:alpine' }\n            steps {\n                sh 'go test .'\n            }\n        }\n\n        stage('deploy') {\n      // Defines conditions which must\n      // be met in order for the job to\n      // execute. In this case the\n      // deploy job will only run on the \n      // staging branch.\n            when {\n              branch 'staging'\n            }\n            steps {\n                echo 'Deploying meow-micro to staging'\n        // Uses the artifact stored in\n        // the build stage.\n                sh './bin/meow-micro'\n            }\n        }\n    }\n}\n\n```\n\n\nNow, let's see how to create the same functionality in GitLab:\n\n\n```\n\n# Defines the default image to use\n\n# when it is not explicitly defined in\n\n# a job.\n\ndefault:\n  image: alpine:latest\n\n# Defines the order to run the stages.\n\n# Each stage can have multiple jobs.\n\nstages:\n  - build\n  - test\n  - deploy\n\n# Defines the name of the job\n\ncreate-binary:\n # Defines the stage the job will run in\n  stage: build\n # Defines the container image to use\n # for this job, overwriting default.\n  image: golang:alpine\n # Defines the sequence of steps to\n # execute when the job is run.\n  script:\n    - go build -o bin/meow-micro\n    - chmod +x bin/meow-micro\n # Stores the job artifacts generated\n # for use in another job.\n  artifacts:\n    paths:\n      - bin/meow-micro\n    expire_in: 1 week\n\nunit-tests:\n  stage: test\n  image: golang:alpine\n  script:\n    - go test .\n # Defines commands to run after the\n # job.\n after_script:\n  - echo \"Tests Complete\"\n\nstaging-deploy:\n  stage: deploy\n # Defines commands to run before the\n # actual job.\n  before_script:\n    - apk update\n  script:\n    - echo \"Deploying meow-micro to staging environment\"\n    - ./bin/meow-micro\n # Defines conditions which must be met\n # in order for this job to execute. In\n # this case the staging-deploy job will \n # only run on the staging branch.\n  rules:\n    - if: $CI_COMMIT_BRANCH == 'staging'\n # Allows the artifact stored in the\n # build job to be used in this job.\n  artifacts:\n    paths:\n      - bin/meow-micro\n```\n\n\nAs you may have observed, there are many similarities between both Jenkins\nand GitLab in terms of syntax, making pipeline migration straightforward.\nWhile the above provides a basic example, be sure to read the comprehensive\nlist of [feature and concept\ncomparisons](https://docs.gitlab.com/ee/ci/migration/jenkins.html#comparison-of-features-and-concepts)\nbetween both tools.\n\n\nNow that we have an understanding of how to map Jenkins to GitLab we can\nstart creating a pipeline with the same functionality in GitLab. In order to\nperform the migration of CI/CD, you can go through the following steps:\n\n\n##### 1. Open the repository you migrated to GitLab in the section above.\n\n- On the left sidebar, at the top, select **Search or go to…**.\n\n- Locate your project.\n\n\n##### 2. Open the [Pipeline\nEditor](https://docs.gitlab.com/ee/ci/pipeline_editor/).\n\n- On the left sidebar, Select **Build > Pipeline editor**.\n\n\u003Ccenter>\n\n\u003Cfigure>\n   \u003Cimg src=\"https://res.cloudinary.com/about-gitlab-com/image/upload/v1752176026/Blog/ecp4jh7epho2oxuegaor.png\" alt=\"Pipeline editor menu\">\n   \u003Cfigcaption>Pipeline editor menu\u003C/figcaption>\n\u003C/figure>\n\n\u003C/center>\n\n\u003Cp>\u003C/p>\n\n\n- Click the **Configure pipeline** button.\n\n\n\u003Ccenter>\n\n\u003Cfigure>\n   \u003Cimg src=\"https://res.cloudinary.com/about-gitlab-com/image/upload/v1752176029/Blog/nypfh01zhwgvzqc0xz3v.png\" alt=\"Configure pipeline selection\">\n   \u003Cfigcaption>Configure pipeline selection\u003C/figcaption>\n\u003C/figure>\n\n\u003C/center>\n\n\u003Cp>\u003C/p>\n\n\n##### 3. Populate the [.gitlab-ci.yml](https://docs.gitlab.com/ee/ci/yaml/).\n\n- Add the GitLab CI pipeline code. \n\n\u003Ccenter>\n\n\u003Cfigure>\n   \u003Cimg src=\"https://res.cloudinary.com/about-gitlab-com/image/upload/v1752176031/Blog/nxi6uxxispyyoiiyvxyg.png\" alt=\"Pipeline editor input\">\n   \u003Cfigcaption>Pipeline editor input\u003C/figcaption>\n\u003C/figure>\n\n\u003C/center>\n\n\u003Cp>\u003C/p>\n\n\n- Verify that the syntax is correct.\n\n\n\u003Ccenter>\n\n\u003Cfigure>\n   \u003Cimg src=\"https://res.cloudinary.com/about-gitlab-com/image/upload/v1752176037/Blog/x3d4utfsnymye0lvphtf.png\" alt=\"Pipeline syntax validation\">\n   \u003Cfigcaption>Pipeline syntax validation\u003C/figcaption>\n\u003C/figure>\n\n\u003C/center>\n\n\u003Cp>\u003C/p>\n\n\n- Visualize the pipeline.\n\n\n\u003Ccenter>\n\n\u003Cfigure>\n   \u003Cimg src=\"https://res.cloudinary.com/about-gitlab-com/image/upload/v1752176043/Blog/hipzofpyywjxf62edzfv.png\" alt=\"Pipeline visualization\">\n   \u003Cfigcaption>Pipeline visualization\u003C/figcaption>\n\u003C/figure>\n\n\u003C/center>\n\n\u003Cp>\u003C/p>\n\n\n##### 4. Commit the file to the main branch.\n\n- Add a commit message.\n\n- Make sure the branch is set to main.\n\n- Click the Commit changes button.\n\n\n\u003Ccenter>\n\n\u003Cfigure>\n   \u003Cimg src=\"https://res.cloudinary.com/about-gitlab-com/image/upload/v1752176048/Blog/nn8bl7rdysabccoycfrk.png\" alt=\"Commit changes dialog\">\n   \u003Cfigcaption>Commit changes dialog\u003C/figcaption>\n\u003C/figure>\n\n\u003C/center>\n\n\u003Cp>\u003C/p>\n\n\nOnce the file has been merged, the defined pipeline will kick off. You can\ngo back to your project and [view the\npipeline](https://docs.gitlab.com/ee/ci/pipelines/#view-pipelines) in action\nby selecting it under your project’s **Build > Pipelines** page. Since it\nwas run on the **main** branch, you will see only the **create-binary** and\nunit-tests jobs; the **staging-deploy** job only runs on the staging branch.\n\n\n\u003Ccenter>\n\n\u003Cfigure>\n   \u003Cimg src=\"https://res.cloudinary.com/about-gitlab-com/image/upload/v1752176051/Blog/wfb4k8nkzpg28kpf2pzz.png\" alt=\"Pipeline running on main branch\">\n   \u003Cfigcaption>Pipeline running on main branch\u003C/figcaption>\n\u003C/figure>\n\n\u003C/center>\n\n\u003Cp>\u003C/p>\n\n\nIf we create a staging branch, we can see that the following pipeline is\ninitiated.\n\n\n\u003Ccenter>\n\n\u003Cfigure>\n   \u003Cimg src=\"https://res.cloudinary.com/about-gitlab-com/image/upload/v1752176053/Blog/e2jxedpolaniotgixpby.png\" alt=\"Pipeline running on staging branch\">\n   \u003Cfigcaption>Pipeline running on staging branch\u003C/figcaption>\n\u003C/figure>\n\n\u003C/center>\n\n\u003Cp>\u003C/p>\n\n\nWhen clicking on a job we can see its output:   \n\n\n\u003Ccenter>\n\n\u003Cfigure>\n   \u003Cimg src=\"https://res.cloudinary.com/about-gitlab-com/image/upload/v1752176056/Blog/fywzwbzkwcvc9zzakilh.png\" alt=\"create-binary job output\">\n   \u003Cfigcaption>create-binary job output\u003C/figcaption>\n\u003C/figure>\n\n\u003C/center>\n\n\u003Cp>\u003C/p>\n\n\n\u003Ccenter>\n\n\u003Cfigure>\n   \u003Cimg src=\"https://res.cloudinary.com/about-gitlab-com/image/upload/v1752176061/Blog/ekmpd8ecanwwiena9xi9.png\" alt=\"unit-tests job output input\">\n   \u003Cfigcaption>unit-tests job output input\u003C/figcaption>\n\u003C/figure>\n\n\u003C/center>\n\n\u003Cp>\u003C/p>\n\n\n\u003Ccenter>\n\n\u003Cfigure>\n   \u003Cimg src=\"https://res.cloudinary.com/about-gitlab-com/image/upload/v1752176065/Blog/h7nqxszy50xdmnvhalfq.png\" alt=\"staging-deploy job output\">\n   \u003Cfigcaption>staging-deploy job output\u003C/figcaption>\n\u003C/figure>\n\n\u003C/center>\n\n\u003Cp>\u003C/p>\n\n\nYou can see how the artifact is stored in the create-binary job and used in\nthe staging-deploy job. And that's how easy it is to migrate a pipeline from\nJenkins to GitLab!\n\n\n### Additional considerations when migrating\n\nSome helpful considerations we’ve found to make the deployment process more\nstraightforward are as follows:\n\n\n- Don't try to replicate tasks into GitLab jobs 1:1. Take some inventory and\ntime to understand what the current pipeline is doing, and which problem it\nis solving.\n\n\n- Some Jenkins jobs may be too complex to move over to GitLab right away.\nFor this reason, it may be beneficial to use the [GitLab Jenkins\nplugin](https://plugins.jenkins.io/gitlab-plugin/) to initiate Jenkins\npipelines and view their results directly from GitLab. This allows you to\nslowly migrate certain actions to GitLab until the whole pipeline can be\nmoved.\n\n\n- Implement [security scanners and code\nquality](https://docs.gitlab.com/ee/user/application_security/) using\nbuilt-in templates provided by GitLab from the start. This will allow you to\nshift security left, reducing the potential for a breach.\n\nDon't overcomplicate the CI/CD config and try to use every feature advantage\nat once. Modularize code and implement it in small iterations.\n\n\n- Implement monitoring and governance from the start.\n\n\n- Understand that the GitLab Runner (Go) might behave differently than the\nJenkins agent (Java). CPU usage and memory consumption might differ — make\nsure to compare over time.\n\n\n- Consider investing in auto-scaling mechanisms, and shut down unneeded\nresources on the weekend, or outside of working hours.\n\n\n- Modernize application development by containerizing your jobs. Jenkins\njobs are not executed on a container today but on a Jenkins agent running as\na VM.\n\n\nWhile this list is not exhaustive, it does provide a good start on some\nconsiderations to take note of. If you need additional help, GitLab provides\n[professional services](https://about.gitlab.com/get-help/) to support your\nmigration journey.\n\n\n### Learn more\n\nThanks for reading! I hope this guide has helped you get a clear\nunderstanding of why and how to migrate from Jenkins to GitLab. Not\nconvinced? [Give GitLab a try with our free\ntrial](https://about.gitlab.com/free-trial/), and see the value of a\nDevSecOps platform!\n\n\nHere are a few resources where you can learn more about GitLab, the benefits\nof using a DevSecOps platform, and migrating from Jenkins:\n\n\n- [Migrating from\nJenkins](https://docs.gitlab.com/ee/ci/migration/jenkins.html)\n\n- [Planning a\nmigration](https://docs.gitlab.com/ee/ci/migration/plan_a_migration.html)\n\n- [GitLab Project\nImporters](https://docs.gitlab.com/ee/user/project/import/)\n\n- [Tutorial: GitHub to GitLab migration the easy\nway](https://about.gitlab.com/blog/github-to-gitlab-migration-made-easy/)\n\n- [Video: GitHub to GitLab migration the easy\nway](https://youtu.be/0Id5oMl1Kqs?feature=shared)\n\n- [Jenkins to GitLab: The ultimate guide to modernizing your CI/CD\nenvironment](https://about.gitlab.com/blog/jenkins-gitlab-ultimate-guide-to-modernizing-cicd-environment/)\n","devsecops",[23,24],"CI/CD","DevSecOps",{"slug":26,"featured":27,"template":28},"jenkins-to-gitlab-migration-made-easy",true,"BlogPost","content:en-us:blog:jenkins-to-gitlab-migration-made-easy.yml","yaml","Jenkins To Gitlab Migration Made Easy","content","en-us/blog/jenkins-to-gitlab-migration-made-easy.yml","en-us/blog/jenkins-to-gitlab-migration-made-easy","yml",{"_path":37,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"data":39,"_id":459,"_type":30,"title":460,"_source":32,"_file":461,"_stem":462,"_extension":35},"/shared/en-us/main-navigation","en-us",{"logo":40,"freeTrial":45,"sales":50,"login":55,"items":60,"search":390,"minimal":421,"duo":440,"pricingDeployment":449},{"config":41},{"href":42,"dataGaName":43,"dataGaLocation":44},"/","gitlab logo","header",{"text":46,"config":47},"Get free trial",{"href":48,"dataGaName":49,"dataGaLocation":44},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":51,"config":52},"Talk to sales",{"href":53,"dataGaName":54,"dataGaLocation":44},"/sales/","sales",{"text":56,"config":57},"Sign in",{"href":58,"dataGaName":59,"dataGaLocation":44},"https://gitlab.com/users/sign_in/","sign in",[61,105,201,206,311,371],{"text":62,"config":63,"cards":65,"footer":88},"Platform",{"dataNavLevelOne":64},"platform",[66,72,80],{"title":62,"description":67,"link":68},"The most comprehensive AI-powered DevSecOps Platform",{"text":69,"config":70},"Explore our Platform",{"href":71,"dataGaName":64,"dataGaLocation":44},"/platform/",{"title":73,"description":74,"link":75},"GitLab Duo (AI)","Build software faster with AI at every stage of development",{"text":76,"config":77},"Meet GitLab Duo",{"href":78,"dataGaName":79,"dataGaLocation":44},"/gitlab-duo/","gitlab duo ai",{"title":81,"description":82,"link":83},"Why GitLab","10 reasons why Enterprises choose GitLab",{"text":84,"config":85},"Learn more",{"href":86,"dataGaName":87,"dataGaLocation":44},"/why-gitlab/","why gitlab",{"title":89,"items":90},"Get started with",[91,96,101],{"text":92,"config":93},"Platform Engineering",{"href":94,"dataGaName":95,"dataGaLocation":44},"/solutions/platform-engineering/","platform engineering",{"text":97,"config":98},"Developer Experience",{"href":99,"dataGaName":100,"dataGaLocation":44},"/developer-experience/","Developer experience",{"text":102,"config":103},"MLOps",{"href":104,"dataGaName":102,"dataGaLocation":44},"/topics/devops/the-role-of-ai-in-devops/",{"text":106,"left":27,"config":107,"link":109,"lists":113,"footer":183},"Product",{"dataNavLevelOne":108},"solutions",{"text":110,"config":111},"View all Solutions",{"href":112,"dataGaName":108,"dataGaLocation":44},"/solutions/",[114,138,162],{"title":115,"description":116,"link":117,"items":122},"Automation","CI/CD and automation to accelerate deployment",{"config":118},{"icon":119,"href":120,"dataGaName":121,"dataGaLocation":44},"AutomatedCodeAlt","/solutions/delivery-automation/","automated software delivery",[123,126,130,134],{"text":23,"config":124},{"href":125,"dataGaLocation":44,"dataGaName":23},"/solutions/continuous-integration/",{"text":127,"config":128},"AI-Assisted Development",{"href":78,"dataGaLocation":44,"dataGaName":129},"AI assisted development",{"text":131,"config":132},"Source Code Management",{"href":133,"dataGaLocation":44,"dataGaName":131},"/solutions/source-code-management/",{"text":135,"config":136},"Automated Software Delivery",{"href":120,"dataGaLocation":44,"dataGaName":137},"Automated software delivery",{"title":139,"description":140,"link":141,"items":146},"Security","Deliver code faster without compromising security",{"config":142},{"href":143,"dataGaName":144,"dataGaLocation":44,"icon":145},"/solutions/security-compliance/","security and compliance","ShieldCheckLight",[147,152,157],{"text":148,"config":149},"Application Security Testing",{"href":150,"dataGaName":151,"dataGaLocation":44},"/solutions/application-security-testing/","Application security testing",{"text":153,"config":154},"Software Supply Chain Security",{"href":155,"dataGaLocation":44,"dataGaName":156},"/solutions/supply-chain/","Software supply chain security",{"text":158,"config":159},"Software Compliance",{"href":160,"dataGaName":161,"dataGaLocation":44},"/solutions/software-compliance/","software compliance",{"title":163,"link":164,"items":169},"Measurement",{"config":165},{"icon":166,"href":167,"dataGaName":168,"dataGaLocation":44},"DigitalTransformation","/solutions/visibility-measurement/","visibility and measurement",[170,174,178],{"text":171,"config":172},"Visibility & Measurement",{"href":167,"dataGaLocation":44,"dataGaName":173},"Visibility and Measurement",{"text":175,"config":176},"Value Stream Management",{"href":177,"dataGaLocation":44,"dataGaName":175},"/solutions/value-stream-management/",{"text":179,"config":180},"Analytics & Insights",{"href":181,"dataGaLocation":44,"dataGaName":182},"/solutions/analytics-and-insights/","Analytics and insights",{"title":184,"items":185},"GitLab for",[186,191,196],{"text":187,"config":188},"Enterprise",{"href":189,"dataGaLocation":44,"dataGaName":190},"/enterprise/","enterprise",{"text":192,"config":193},"Small Business",{"href":194,"dataGaLocation":44,"dataGaName":195},"/small-business/","small business",{"text":197,"config":198},"Public Sector",{"href":199,"dataGaLocation":44,"dataGaName":200},"/solutions/public-sector/","public sector",{"text":202,"config":203},"Pricing",{"href":204,"dataGaName":205,"dataGaLocation":44,"dataNavLevelOne":205},"/pricing/","pricing",{"text":207,"config":208,"link":210,"lists":214,"feature":298},"Resources",{"dataNavLevelOne":209},"resources",{"text":211,"config":212},"View all resources",{"href":213,"dataGaName":209,"dataGaLocation":44},"/resources/",[215,248,270],{"title":216,"items":217},"Getting started",[218,223,228,233,238,243],{"text":219,"config":220},"Install",{"href":221,"dataGaName":222,"dataGaLocation":44},"/install/","install",{"text":224,"config":225},"Quick start guides",{"href":226,"dataGaName":227,"dataGaLocation":44},"/get-started/","quick setup checklists",{"text":229,"config":230},"Learn",{"href":231,"dataGaLocation":44,"dataGaName":232},"https://university.gitlab.com/","learn",{"text":234,"config":235},"Product documentation",{"href":236,"dataGaName":237,"dataGaLocation":44},"https://docs.gitlab.com/","product documentation",{"text":239,"config":240},"Best practice videos",{"href":241,"dataGaName":242,"dataGaLocation":44},"/getting-started-videos/","best practice videos",{"text":244,"config":245},"Integrations",{"href":246,"dataGaName":247,"dataGaLocation":44},"/integrations/","integrations",{"title":249,"items":250},"Discover",[251,256,260,265],{"text":252,"config":253},"Customer success stories",{"href":254,"dataGaName":255,"dataGaLocation":44},"/customers/","customer success stories",{"text":257,"config":258},"Blog",{"href":259,"dataGaName":5,"dataGaLocation":44},"/blog/",{"text":261,"config":262},"Remote",{"href":263,"dataGaName":264,"dataGaLocation":44},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"text":266,"config":267},"TeamOps",{"href":268,"dataGaName":269,"dataGaLocation":44},"/teamops/","teamops",{"title":271,"items":272},"Connect",[273,278,283,288,293],{"text":274,"config":275},"GitLab Services",{"href":276,"dataGaName":277,"dataGaLocation":44},"/services/","services",{"text":279,"config":280},"Community",{"href":281,"dataGaName":282,"dataGaLocation":44},"/community/","community",{"text":284,"config":285},"Forum",{"href":286,"dataGaName":287,"dataGaLocation":44},"https://forum.gitlab.com/","forum",{"text":289,"config":290},"Events",{"href":291,"dataGaName":292,"dataGaLocation":44},"/events/","events",{"text":294,"config":295},"Partners",{"href":296,"dataGaName":297,"dataGaLocation":44},"/partners/","partners",{"backgroundColor":299,"textColor":300,"text":301,"image":302,"link":306},"#2f2a6b","#fff","Insights for the future of software development",{"altText":303,"config":304},"the source promo card",{"src":305},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758208064/dzl0dbift9xdizyelkk4.svg",{"text":307,"config":308},"Read the latest",{"href":309,"dataGaName":310,"dataGaLocation":44},"/the-source/","the source",{"text":312,"config":313,"lists":315},"Company",{"dataNavLevelOne":314},"company",[316],{"items":317},[318,323,329,331,336,341,346,351,356,361,366],{"text":319,"config":320},"About",{"href":321,"dataGaName":322,"dataGaLocation":44},"/company/","about",{"text":324,"config":325,"footerGa":328},"Jobs",{"href":326,"dataGaName":327,"dataGaLocation":44},"/jobs/","jobs",{"dataGaName":327},{"text":289,"config":330},{"href":291,"dataGaName":292,"dataGaLocation":44},{"text":332,"config":333},"Leadership",{"href":334,"dataGaName":335,"dataGaLocation":44},"/company/team/e-group/","leadership",{"text":337,"config":338},"Team",{"href":339,"dataGaName":340,"dataGaLocation":44},"/company/team/","team",{"text":342,"config":343},"Handbook",{"href":344,"dataGaName":345,"dataGaLocation":44},"https://handbook.gitlab.com/","handbook",{"text":347,"config":348},"Investor relations",{"href":349,"dataGaName":350,"dataGaLocation":44},"https://ir.gitlab.com/","investor relations",{"text":352,"config":353},"Trust Center",{"href":354,"dataGaName":355,"dataGaLocation":44},"/security/","trust center",{"text":357,"config":358},"AI Transparency Center",{"href":359,"dataGaName":360,"dataGaLocation":44},"/ai-transparency-center/","ai transparency center",{"text":362,"config":363},"Newsletter",{"href":364,"dataGaName":365,"dataGaLocation":44},"/company/contact/","newsletter",{"text":367,"config":368},"Press",{"href":369,"dataGaName":370,"dataGaLocation":44},"/press/","press",{"text":372,"config":373,"lists":374},"Contact us",{"dataNavLevelOne":314},[375],{"items":376},[377,380,385],{"text":51,"config":378},{"href":53,"dataGaName":379,"dataGaLocation":44},"talk to sales",{"text":381,"config":382},"Get help",{"href":383,"dataGaName":384,"dataGaLocation":44},"/support/","get help",{"text":386,"config":387},"Customer portal",{"href":388,"dataGaName":389,"dataGaLocation":44},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":391,"login":392,"suggestions":399},"Close",{"text":393,"link":394},"To search repositories and projects, login to",{"text":395,"config":396},"gitlab.com",{"href":58,"dataGaName":397,"dataGaLocation":398},"search login","search",{"text":400,"default":401},"Suggestions",[402,404,408,410,414,418],{"text":73,"config":403},{"href":78,"dataGaName":73,"dataGaLocation":398},{"text":405,"config":406},"Code Suggestions (AI)",{"href":407,"dataGaName":405,"dataGaLocation":398},"/solutions/code-suggestions/",{"text":23,"config":409},{"href":125,"dataGaName":23,"dataGaLocation":398},{"text":411,"config":412},"GitLab on AWS",{"href":413,"dataGaName":411,"dataGaLocation":398},"/partners/technology-partners/aws/",{"text":415,"config":416},"GitLab on Google Cloud",{"href":417,"dataGaName":415,"dataGaLocation":398},"/partners/technology-partners/google-cloud-platform/",{"text":419,"config":420},"Why GitLab?",{"href":86,"dataGaName":419,"dataGaLocation":398},{"freeTrial":422,"mobileIcon":427,"desktopIcon":432,"secondaryButton":435},{"text":423,"config":424},"Start free trial",{"href":425,"dataGaName":49,"dataGaLocation":426},"https://gitlab.com/-/trials/new/","nav",{"altText":428,"config":429},"Gitlab Icon",{"src":430,"dataGaName":431,"dataGaLocation":426},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":428,"config":433},{"src":434,"dataGaName":431,"dataGaLocation":426},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":436,"config":437},"Get Started",{"href":438,"dataGaName":439,"dataGaLocation":426},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/compare/gitlab-vs-github/","get started",{"freeTrial":441,"mobileIcon":445,"desktopIcon":447},{"text":442,"config":443},"Learn more about GitLab Duo",{"href":78,"dataGaName":444,"dataGaLocation":426},"gitlab duo",{"altText":428,"config":446},{"src":430,"dataGaName":431,"dataGaLocation":426},{"altText":428,"config":448},{"src":434,"dataGaName":431,"dataGaLocation":426},{"freeTrial":450,"mobileIcon":455,"desktopIcon":457},{"text":451,"config":452},"Back to pricing",{"href":204,"dataGaName":453,"dataGaLocation":426,"icon":454},"back to pricing","GoBack",{"altText":428,"config":456},{"src":430,"dataGaName":431,"dataGaLocation":426},{"altText":428,"config":458},{"src":434,"dataGaName":431,"dataGaLocation":426},"content:shared:en-us:main-navigation.yml","Main Navigation","shared/en-us/main-navigation.yml","shared/en-us/main-navigation",{"_path":464,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"title":465,"button":466,"image":471,"config":475,"_id":477,"_type":30,"_source":32,"_file":478,"_stem":479,"_extension":35},"/shared/en-us/banner","is now in public beta!",{"text":467,"config":468},"Try the Beta",{"href":469,"dataGaName":470,"dataGaLocation":44},"/gitlab-duo/agent-platform/","duo banner",{"altText":472,"config":473},"GitLab Duo Agent Platform",{"src":474},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1753720689/somrf9zaunk0xlt7ne4x.svg",{"layout":476},"release","content:shared:en-us:banner.yml","shared/en-us/banner.yml","shared/en-us/banner",{"_path":481,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"data":482,"_id":686,"_type":30,"title":687,"_source":32,"_file":688,"_stem":689,"_extension":35},"/shared/en-us/main-footer",{"text":483,"source":484,"edit":490,"contribute":495,"config":500,"items":505,"minimal":678},"Git is a trademark of Software Freedom Conservancy and our use of 'GitLab' is under license",{"text":485,"config":486},"View page source",{"href":487,"dataGaName":488,"dataGaLocation":489},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":491,"config":492},"Edit this page",{"href":493,"dataGaName":494,"dataGaLocation":489},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":496,"config":497},"Please contribute",{"href":498,"dataGaName":499,"dataGaLocation":489},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":501,"facebook":502,"youtube":503,"linkedin":504},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[506,529,585,614,648],{"title":62,"links":507,"subMenu":512},[508],{"text":509,"config":510},"DevSecOps platform",{"href":71,"dataGaName":511,"dataGaLocation":489},"devsecops platform",[513],{"title":202,"links":514},[515,519,524],{"text":516,"config":517},"View plans",{"href":204,"dataGaName":518,"dataGaLocation":489},"view plans",{"text":520,"config":521},"Why Premium?",{"href":522,"dataGaName":523,"dataGaLocation":489},"/pricing/premium/","why premium",{"text":525,"config":526},"Why Ultimate?",{"href":527,"dataGaName":528,"dataGaLocation":489},"/pricing/ultimate/","why ultimate",{"title":530,"links":531},"Solutions",[532,537,539,541,546,551,555,558,562,567,569,572,575,580],{"text":533,"config":534},"Digital transformation",{"href":535,"dataGaName":536,"dataGaLocation":489},"/topics/digital-transformation/","digital transformation",{"text":148,"config":538},{"href":150,"dataGaName":148,"dataGaLocation":489},{"text":137,"config":540},{"href":120,"dataGaName":121,"dataGaLocation":489},{"text":542,"config":543},"Agile development",{"href":544,"dataGaName":545,"dataGaLocation":489},"/solutions/agile-delivery/","agile delivery",{"text":547,"config":548},"Cloud transformation",{"href":549,"dataGaName":550,"dataGaLocation":489},"/topics/cloud-native/","cloud transformation",{"text":552,"config":553},"SCM",{"href":133,"dataGaName":554,"dataGaLocation":489},"source code management",{"text":23,"config":556},{"href":125,"dataGaName":557,"dataGaLocation":489},"continuous integration & delivery",{"text":559,"config":560},"Value stream management",{"href":177,"dataGaName":561,"dataGaLocation":489},"value stream management",{"text":563,"config":564},"GitOps",{"href":565,"dataGaName":566,"dataGaLocation":489},"/solutions/gitops/","gitops",{"text":187,"config":568},{"href":189,"dataGaName":190,"dataGaLocation":489},{"text":570,"config":571},"Small business",{"href":194,"dataGaName":195,"dataGaLocation":489},{"text":573,"config":574},"Public sector",{"href":199,"dataGaName":200,"dataGaLocation":489},{"text":576,"config":577},"Education",{"href":578,"dataGaName":579,"dataGaLocation":489},"/solutions/education/","education",{"text":581,"config":582},"Financial services",{"href":583,"dataGaName":584,"dataGaLocation":489},"/solutions/finance/","financial services",{"title":207,"links":586},[587,589,591,593,596,598,600,602,604,606,608,610,612],{"text":219,"config":588},{"href":221,"dataGaName":222,"dataGaLocation":489},{"text":224,"config":590},{"href":226,"dataGaName":227,"dataGaLocation":489},{"text":229,"config":592},{"href":231,"dataGaName":232,"dataGaLocation":489},{"text":234,"config":594},{"href":236,"dataGaName":595,"dataGaLocation":489},"docs",{"text":257,"config":597},{"href":259,"dataGaName":5,"dataGaLocation":489},{"text":252,"config":599},{"href":254,"dataGaName":255,"dataGaLocation":489},{"text":261,"config":601},{"href":263,"dataGaName":264,"dataGaLocation":489},{"text":274,"config":603},{"href":276,"dataGaName":277,"dataGaLocation":489},{"text":266,"config":605},{"href":268,"dataGaName":269,"dataGaLocation":489},{"text":279,"config":607},{"href":281,"dataGaName":282,"dataGaLocation":489},{"text":284,"config":609},{"href":286,"dataGaName":287,"dataGaLocation":489},{"text":289,"config":611},{"href":291,"dataGaName":292,"dataGaLocation":489},{"text":294,"config":613},{"href":296,"dataGaName":297,"dataGaLocation":489},{"title":312,"links":615},[616,618,620,622,624,626,628,632,637,639,641,643],{"text":319,"config":617},{"href":321,"dataGaName":314,"dataGaLocation":489},{"text":324,"config":619},{"href":326,"dataGaName":327,"dataGaLocation":489},{"text":332,"config":621},{"href":334,"dataGaName":335,"dataGaLocation":489},{"text":337,"config":623},{"href":339,"dataGaName":340,"dataGaLocation":489},{"text":342,"config":625},{"href":344,"dataGaName":345,"dataGaLocation":489},{"text":347,"config":627},{"href":349,"dataGaName":350,"dataGaLocation":489},{"text":629,"config":630},"Sustainability",{"href":631,"dataGaName":629,"dataGaLocation":489},"/sustainability/",{"text":633,"config":634},"Diversity, inclusion and belonging (DIB)",{"href":635,"dataGaName":636,"dataGaLocation":489},"/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":352,"config":638},{"href":354,"dataGaName":355,"dataGaLocation":489},{"text":362,"config":640},{"href":364,"dataGaName":365,"dataGaLocation":489},{"text":367,"config":642},{"href":369,"dataGaName":370,"dataGaLocation":489},{"text":644,"config":645},"Modern Slavery Transparency Statement",{"href":646,"dataGaName":647,"dataGaLocation":489},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":649,"links":650},"Contact Us",[651,654,656,658,663,668,673],{"text":652,"config":653},"Contact an expert",{"href":53,"dataGaName":54,"dataGaLocation":489},{"text":381,"config":655},{"href":383,"dataGaName":384,"dataGaLocation":489},{"text":386,"config":657},{"href":388,"dataGaName":389,"dataGaLocation":489},{"text":659,"config":660},"Status",{"href":661,"dataGaName":662,"dataGaLocation":489},"https://status.gitlab.com/","status",{"text":664,"config":665},"Terms of use",{"href":666,"dataGaName":667,"dataGaLocation":489},"/terms/","terms of use",{"text":669,"config":670},"Privacy statement",{"href":671,"dataGaName":672,"dataGaLocation":489},"/privacy/","privacy statement",{"text":674,"config":675},"Cookie preferences",{"dataGaName":676,"dataGaLocation":489,"id":677,"isOneTrustButton":27},"cookie preferences","ot-sdk-btn",{"items":679},[680,682,684],{"text":664,"config":681},{"href":666,"dataGaName":667,"dataGaLocation":489},{"text":669,"config":683},{"href":671,"dataGaName":672,"dataGaLocation":489},{"text":674,"config":685},{"dataGaName":676,"dataGaLocation":489,"id":677,"isOneTrustButton":27},"content:shared:en-us:main-footer.yml","Main Footer","shared/en-us/main-footer.yml","shared/en-us/main-footer",[691],{"_path":692,"_dir":693,"_draft":6,"_partial":6,"_locale":7,"content":694,"config":698,"_id":700,"_type":30,"title":18,"_source":32,"_file":701,"_stem":702,"_extension":35},"/en-us/blog/authors/fernando-diaz","authors",{"name":18,"config":695},{"headshot":696,"ctfId":697},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659556/Blog/Author%20Headshots/fern_diaz.png","fjdiaz",{"template":699},"BlogAuthor","content:en-us:blog:authors:fernando-diaz.yml","en-us/blog/authors/fernando-diaz.yml","en-us/blog/authors/fernando-diaz",{"_path":704,"_dir":38,"_draft":6,"_partial":6,"_locale":7,"header":705,"eyebrow":706,"blurb":707,"button":708,"secondaryButton":712,"_id":714,"_type":30,"title":715,"_source":32,"_file":716,"_stem":717,"_extension":35},"/shared/en-us/next-steps","Start shipping better software faster","50%+ of the Fortune 100 trust GitLab","See what your team can do with the intelligent\n\n\nDevSecOps platform.\n",{"text":46,"config":709},{"href":710,"dataGaName":49,"dataGaLocation":711},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":51,"config":713},{"href":53,"dataGaName":54,"dataGaLocation":711},"content:shared:en-us:next-steps.yml","Next Steps","shared/en-us/next-steps.yml","shared/en-us/next-steps",1758326258781]