{"id":2041,"date":"2019-09-04T11:44:47","date_gmt":"2019-09-04T09:44:47","guid":{"rendered":"https:\/\/www.thecodecampus.de\/blog\/?p=2041"},"modified":"2025-11-04T11:22:18","modified_gmt":"2025-11-04T10:22:18","slug":"jenkins-vs-gitlab-ci","status":"publish","type":"post","link":"https:\/\/www.thecodecampus.de\/blog\/jenkins-vs-gitlab-ci\/","title":{"rendered":"Jenkins vs. Gitlab CI"},"content":{"rendered":"<p><a href=\"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/08\/Header.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2043\" src=\"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/08\/Header.jpg\" alt=\"\" width=\"483\" height=\"232\" srcset=\"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/08\/Header.jpg 483w, https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/08\/Header-300x144.jpg 300w\" sizes=\"auto, (max-width: 483px) 100vw, 483px\" \/><\/a><\/p>\n<p>With Gitlab CI going full steem ahead following their proclaimed vision, we want to have a look on it ourselves! Mostly working with the proven and beloved open source CI tool Jenkins, we are wondering, will Gitlab give us some new features and benefits or will it not be able to replace Jenkins as the number one CI-tool. Lets get into it.<\/p>\n<p>&nbsp;<\/p>\n<p style=\"padding: 2px 6px 4px; color: #555555; background-color: #eeeeee; border: 2px solid #dddddd; text-align: justify;\"><strong>TL;DR<\/strong><br \/>\nWe migrated some CI pipelines from Jenkins to Gitlab CI. We really like the visualization of the different jobs in Gitlab CI. It makes the build jobs more transparent and flexible to use. Performancewise there are no big differences with the medium sized projects we tested it on. For very big and complex projects, things might look a little bit different, as Gitlab stores the job artifacts online and therefore has to up- and download them for every job. So in conclusion it depends on the type of project, but Gitlab is definatly an option to consider.<\/p>\n<h3>Jenkins<\/h3>\n<p>To set up Jenkins you need an existing installation and a activated pipeline plug-in. The first step is of course the definition of the source-repo, as Jenkins doesn&#8217;t provide repositories and connects with other services like Gitlab or Github.<\/p>\n<p>The next step is the configuration of the pipline-stages. Jenkins needs a speciel file in the repository with the name of <em>jenkinsfile<\/em>. The phases and stages of the build configuration are maintained in this file. Here is an example of a configuration in this format:<\/p>\n<pre class=\"lang:xhtml decode:true\" title=\"Jenkinsfile\">pipeline {\r\n    agent any\r\n    stages {\r\n        stage('Build') {\r\n            steps {\r\n                echo 'Building..'\r\n                nodejs('node 10.9.0') {         \r\n                    dir('www.thetestcompany.de') {\r\n                        echo 'Building Job One'\r\n                    }\r\n                    dir('mail.thetestcompany.de') {\r\n                        echo 'Building Job Two'\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        stage('Test') {\r\n            steps {\r\n                echo 'Testing..'\r\n            }\r\n        }\r\n        stage('Deploy') {\r\n            steps {\r\n                echo 'Deploying....'\r\n                nodejs('node 10.9.0') {\r\n                    dir('mail.thetestcompany.de') {\r\n                        withCredentials([file(credentialsId: params.CREDENTIAL_ID, variable: 'ormconfig')]) {\r\n                            sh \"cp --update -rf \\$ormconfig ormconfig.json\"\r\n                            sh \"npm run migrate:run\"\r\n                        }\r\n                       echo 'Deploying Job One'\r\n                    }\r\n                    dir('www.thetestcompany.de') {\r\n                        echo 'Building Job Two'\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>A plus is, that the Jenkins script is quiet readable and well structured. Additionally it is possible to use plug-ins, like the withCredentials Command. This makes it possible to include hidden Authentification Credentials in the script.<\/p>\n<p>When the pipline runs through, we get to check if the stages passed or failed (in that case red colour) as a whole. Unfortunately we can&#8217;t see the status of the individual jobs in the graphical overiew. You can follow the progress in the terminal though.<\/p>\n<p><a href=\"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/09\/Jenkins.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2049\" src=\"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/09\/Jenkins.jpg\" alt=\"\" width=\"1122\" height=\"340\" srcset=\"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/09\/Jenkins.jpg 888w, https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/09\/Jenkins-300x91.jpg 300w, https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/09\/Jenkins-768x233.jpg 768w\" sizes=\"auto, (max-width: 1122px) 100vw, 1122px\" \/><\/a><\/p>\n<h3>Gitlab<\/h3>\n<p>Gitlab offers repositories. Hence the integration of Gitlab CI is pretty straight forward. Stages and jobs are described in the gitlab-ci.yml configuration file. If you look, the stages command includes a sequence of stages that will be executed in the specified order. After that, every job is described and configured with different options. Every job is part of a stage and will run parallel with other jobs in the same stage.<\/p>\n<pre class=\"lang:xhtml decode:true \">image: trion\/ng-cli-karma\r\n\r\nstages: \r\n - build step one \r\n - build step two \r\n - test - migrate \r\n - deploy \r\n\r\n# Extensions \r\n.ssh: \r\n before_script: \r\n   - mkdir -p ~\/.ssh \r\n   - chmod 700 ~\/.ssh \r\n   - echo -e \"Host *\\n\\tStrictHostKeyChecking no\\n\\n\" &gt; ~\/.ssh\/config \r\n   - echo \"$KEY_STAGING\" &gt; ~\/.ssh\/id_rsa \r\n   - chmod 600 ~\/.ssh\/id_rsa \r\n.runner_tags: \r\n  tags: \r\n   - docker \r\n   - linux \r\n#Build Stage \r\nbuild-www.thetestcompany.de: \r\n  extends: \r\n   - .runner_tags stage: \r\n  stage: build step one \r\n  before_script: \r\n    - cd www.thetestcompany.de \r\n  script: \r\n    - echo 'Build Step One' \r\n  after_script: \r\n    - cd .. \r\n  artifacts: \r\n   paths: \r\n    - www.thetestcompany.de\/ \r\n   name: \"Build TTC step one\" \r\n   expire_in: 1 week \r\n   when: on_success \r\n  cache: \r\n   paths: \r\n    - node_modules\/ \r\nbuild-www.mail.thetestcompany.de: \r\n  extends: \r\n   - .runner_tags stage: build step two \r\n  dependencies: [build-www.tcc-core.de] \r\n  needs: [build-www.tcc-core.de] \r\n  before_script: \r\n   - cd www.thecodecampus.de \r\n  script: \r\n   - echo 'Build Step Two' \r\n  after_script: \r\n   - cd .. \r\n  artifacts: \r\n   paths: \r\n    - www.mail.thetestcompany.de\/ \r\n   name: \"Build www.ttc.de\" \r\n   expire_in: 1 week \r\n   when: on_success \r\n\r\n#Test Stage \r\ntest: \r\n  stage: test \r\n  script: \r\n   - echo 'Testing..' \r\n  tags: \r\n   - docker \r\n   - linux \r\n\r\n#Migrate Stage - STAGING \r\nmigrate-www.mail.thetestcompany.de-STAGING: \r\n  extends: \r\n   - .runner_tags \r\n   - .ssh  \r\n  stage: migrate \r\n  image: kroniak\/ssh-client \r\n  script: \r\n   - echo 'Migrate DB' \r\n  after_script: \r\n   - cd .. \r\n  artifacts: \r\n   paths: \r\n    - www.mail.thetestcompany.de\/ \r\n  environment: staging \r\n  needs: \r\n   - www.mail.thetestcompany.de \r\n  dependencies: \r\n   - www.mail.thetestcompany.de \r\n \r\n#Migrate Stage - PROD \r\n\r\nmigrate-www.mail.thetestcompany.de: \r\n  extends:\r\n   - .runner_tags \r\n   - .ssh stage: migrate image: kroniak\/ssh-client script: \r\n   - echo 'Migrate DB' \r\n  after_script: \r\n   - cd .. \r\n  artifacts: \r\n   paths: \r\n    - www.mail.thetestcompany.de\/ \r\n  needs: \r\n   - build-www.mail.thetestcompany.de \r\n  dependencies: \r\n   - build-www.mail.thetestcompany.de \r\n  when: manual \r\n  only: \r\n   - master environment: staging \r\n\r\ndeploy-www.thetestcompany.de-STAGING: \r\n  extends: \r\n   - .runner_tags \r\n   - .ssh \r\n  stage: deploy \r\n  image: kroniak\/ssh-client \r\n  script: \r\n   - cd www.thetestcompany.de \r\n   - echo 'Deploy Job One' \r\n  after_script: \r\n   - cd .. environment: staging \r\n  needs: \r\n   - build-www.thetestcompany.de \r\n  dependencies: \r\n   - build-www.thetestcompany.de \r\n\r\ndeploy-www.mail.thetestcompany.de-STAGING:\r\n  extends: \r\n   - .runner_tags \r\n   - .ssh \r\n  stage: deploy \r\n  image: kroniak\/ssh-client \r\n  script: \r\n   - cd www.mail.thetestcompany.de \r\n   - echo 'Deploy Job Two' \r\n  after_script: \r\n   - cd .. \r\n  environment: staging needs: \r\n   - build-www.mail.thetestcompany.de \r\n  dependencies: \r\n   - build-www.mail.thetestcompany.de\r\n\r\ndeploy-www.thecodecampus.de: \r\n  stage: deploy \r\n  extends: \r\n   - .runner_tags \r\n   - .ssh \r\n  image: kroniak\/ssh-client \r\n  script: \r\n   - cd www.thetestcompany.de \r\n   - echo 'Deploy www.thetestcompany.de' \r\n  after_script: \r\n   - cd .. \r\n  environment: prod \r\n  needs: \r\n   - build-www.thecodecampus.de \r\n  dependencies: \r\n   - build-www.thecodecampus.de \r\n  only: \r\n   - master \r\n  when: manual \r\n\r\ndeploy-www.mail.thetestcompany.de: \r\n  extends: \r\n   - .runner_tags \r\n   - .ssh \r\n  stage: deploy \r\n  image: kroniak\/ssh-client \r\n  script: \r\n   - cd www.mail.thetestcompany.de \r\n   - echo 'Deploy www.mail.thetestcompany.de' \r\n  after_script: \r\n   - cd ..\r\n  environment: prod \r\n  needs: \r\n   - build-www.mail.thetestcompany.de \r\n  dependencies: \r\n   - build-www.mail.thetestcompany.de \r\n  only: \r\n   - master \r\n  when: manual<\/pre>\n<p>So now the jobs are configured and we are ready to run the Gitlab CI pipeline. The result will look like illustrated in the following picture. At first sight the major advantage of Gitlab CI, compared to Jenkins, jumps right into our eyes. It&#8217;s the smaller granularity of the job visualization. You see the status of every job you specified inside a stage. Therefore debugging is way more efficient. The granularity of this graph is completely up to you and how you define your jobs. Additionally Gitlab-CI offers functionalities to build up a <a href=\"https:\/\/docs.gitlab.com\/ee\/ci\/directed_acyclic_graph\/\">directed acyclic graph<\/a>. This opens up the possibility to start jobs of a following stage, even if not all of the jobs in the current stage finished. This is a very big advantage, as this increases performance of the pipeline significantly.<\/p>\n<h4><a href=\"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/09\/Gitlab-ci-1.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-2048\" src=\"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/09\/Gitlab-ci-1.jpg\" alt=\"\" width=\"1183\" height=\"297\" srcset=\"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/09\/Gitlab-ci-1.jpg 1078w, https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/09\/Gitlab-ci-1-300x75.jpg 300w, https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/09\/Gitlab-ci-1-768x193.jpg 768w, https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/09\/Gitlab-ci-1-1024x257.jpg 1024w\" sizes=\"auto, (max-width: 1183px) 100vw, 1183px\" \/><\/a><\/h4>\n<p>&nbsp;<\/p>\n<h3>Jenkins vs Gitlab Conclusion<\/h3>\n<p>So now we know how each of the CI Tools can be configured. Lets have a look at the Pros and Cons of each one:<\/p>\n<hr \/>\n<h4>Gitlab Pros<\/h4>\n<ul>\n<li>very good Docker integration<\/li>\n<li>parallel job execution within stages<\/li>\n<li>possibility of directed acyclic graph pipeline<\/li>\n<li>easy to add jobs<\/li>\n<li>merge request integration<\/li>\n<li>extremely scalable due to concurrent runners<\/li>\n<\/ul>\n<h4>Gitlab Cons<\/h4>\n<ul>\n<li>artifacts have to be defined and uploaded\/downloaded for every job<\/li>\n<li>testing the merged state of a branch is not possible before actual merge is done<\/li>\n<li>stages within stages are not yet supported<\/li>\n<\/ul>\n<hr \/>\n<h4>Jenkins Pros<\/h4>\n<ul>\n<li>selfhosted\u00a0 &#8211;&gt; full control over workspaces<\/li>\n<li>easier debugging of runners hence full workspace control<\/li>\n<li>very good management of credentials.<\/li>\n<li>big plugin library<\/li>\n<\/ul>\n<h4>Jenkins Cons<\/h4>\n<ul>\n<li>overhead for small projects as you have to setup by yourself<\/li>\n<li>complicated plugin integration<\/li>\n<li>new pipeline for every environment (e.g. Production\/Testing)<\/li>\n<\/ul>\n<hr \/>\n<h3>Timecomparison<\/h3>\n<p>The tests we ran when migrating jobs from Jenkins to Gitlab showed no big differences in pipeline-througput-times:<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Medium sized project with monorepo:<\/strong><\/p>\n<hr \/>\n<p>Jenkins: 6-7min<\/p>\n<p>Gitlab: 7-8min<\/p>\n<p>&nbsp;<\/p>\n<p><strong>Small sized project<\/strong><\/p>\n<hr \/>\n<p>Jenkins: 4min<\/p>\n<p>Gitlab: 3-5min<\/p>\n<h3>So which solution should I use?<\/h3>\n<p><strong>small \/ medium sized projects:<\/strong><\/p>\n<p>Definatly Gitlub CI. The fast setup time, the easy way to integrate new jobs and the flexibility of the tool makes it a ery powerful CI-option. Especially when the project has an agile character, the granularity of the graphic interface and the flexibility in adjustment are a big advantage.<\/p>\n<p><strong>large complex projects:<\/strong><\/p>\n<p>For large projects the decision might not be so easy! Gitlab still brings in all the advantages. Based on the granularity and the central configuration in the gitlab-ci.yml, the structure gets quite complex pretty fast though. So maybe the best way is to include it for quick testing and then switch to Jenkins for bigger standardized building and deployment jobs.<\/p>\n<h3>Future of Gitlab CI<\/h3>\n<p>Performancewise there are two very interesting features in the pipeline:<\/p>\n<ul>\n<li><strong>Stages in Stages<br \/>\n<\/strong>In near future it will be possible to define stages inside of stages. This opens up possibilities for further job encapsulation and more structured pipelines.<\/li>\n<li><strong>Empty needs declarator: needs:[&#8230;] &#8211; and needs inside stages<br \/>\n<\/strong>Also announced for next iterations is the manipulation of the needs declarator. It will be possible to define it for two jobs inside a stage (for now its only possible to reference a job of predecessing staages. Aditionally it will be possible to start jobs without a predecessor directly, without waiting by leaving the needs tag empty.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>With Gitlab CI going full steem ahead following their proclaimed vision, we want to have a look on it ourselves! Mostly working with the proven and beloved open source CI tool Jenkins, we are wondering, will Gitlab give us some new features and benefits or will it not be able to replace Jenkins as the [&#8230;]<br \/><a class=\"meta-big\" href=\"https:\/\/www.thecodecampus.de\/blog\/jenkins-vs-gitlab-ci\/\"> READ MORE<\/a><\/p>\n","protected":false},"author":23,"featured_media":2043,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[103,98,78,79,1],"tags":[],"class_list":["post-2041","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-gitlab-ci","category-node-js","category-testing","category-tooling","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>-1332<\/title>\n<meta name=\"description\" content=\"Compare Jenkins vs. GitLab CI effortlessly! Discover strengths, streamline workflows, and make informed decisions for optimal CI\/CD. Explore now!\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.thecodecampus.de\/blog\/jenkins-vs-gitlab-ci\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"-1332\" \/>\n<meta property=\"og:description\" content=\"Compare Jenkins vs. GitLab CI effortlessly! Discover strengths, streamline workflows, and make informed decisions for optimal CI\/CD. Explore now!\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.thecodecampus.de\/blog\/jenkins-vs-gitlab-ci\/\" \/>\n<meta property=\"og:site_name\" content=\"Web Development tips and tricks - theCodeCampus Blog\" \/>\n<meta property=\"article:published_time\" content=\"2019-09-04T09:44:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-04T10:22:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/08\/Header.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"483\" \/>\n\t<meta property=\"og:image:height\" content=\"232\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Janik Kessler\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Janik Kessler\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/jenkins-vs-gitlab-ci\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/jenkins-vs-gitlab-ci\\\/\"},\"author\":{\"name\":\"Janik Kessler\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/#\\\/schema\\\/person\\\/0dda62aeb98f2e9a89c2438b6f990101\"},\"headline\":\"Jenkins vs. Gitlab CI\",\"datePublished\":\"2019-09-04T09:44:47+00:00\",\"dateModified\":\"2025-11-04T10:22:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/jenkins-vs-gitlab-ci\\\/\"},\"wordCount\":961,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/jenkins-vs-gitlab-ci\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/08\\\/Header.jpg\",\"articleSection\":[\"Gitlab-CI\",\"Node.js\",\"Testing\",\"Tooling\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/jenkins-vs-gitlab-ci\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/jenkins-vs-gitlab-ci\\\/\",\"url\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/jenkins-vs-gitlab-ci\\\/\",\"name\":\"-1332\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/jenkins-vs-gitlab-ci\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/jenkins-vs-gitlab-ci\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/08\\\/Header.jpg\",\"datePublished\":\"2019-09-04T09:44:47+00:00\",\"dateModified\":\"2025-11-04T10:22:18+00:00\",\"description\":\"Compare Jenkins vs. GitLab CI effortlessly! Discover strengths, streamline workflows, and make informed decisions for optimal CI\\\/CD. Explore now!\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/jenkins-vs-gitlab-ci\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/jenkins-vs-gitlab-ci\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/jenkins-vs-gitlab-ci\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/08\\\/Header.jpg\",\"contentUrl\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/wp-content\\\/uploads\\\/2019\\\/08\\\/Header.jpg\",\"width\":483,\"height\":232},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/jenkins-vs-gitlab-ci\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Jenkins vs. Gitlab CI\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/\",\"name\":\"Web Development tips and tricks - theCodeCampus Blog\",\"description\":\"Tips, tricks, and experiences about developing web and mobile applications with Angular, TypeScript, and Testing.\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/#organization\",\"name\":\"theCodeCampus\",\"url\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/01\\\/TCC-Logo-Bildmarke-quadratisch.jpg\",\"contentUrl\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/01\\\/TCC-Logo-Bildmarke-quadratisch.jpg\",\"width\":156,\"height\":156,\"caption\":\"theCodeCampus\"},\"image\":{\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/#\\\/schema\\\/person\\\/0dda62aeb98f2e9a89c2438b6f990101\",\"name\":\"Janik Kessler\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/janik-kessler-tcc-author-96x96.png\",\"url\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/janik-kessler-tcc-author-96x96.png\",\"contentUrl\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/09\\\/janik-kessler-tcc-author-96x96.png\",\"caption\":\"Janik Kessler\"},\"description\":\"Hi, I'm Janik. I'm a web development enthusiast and love to share my experiences. As a software trainer and engineer, I always seek to exchange ideas with other developers. I've been part of the theCodeCampus team since 2019 and have had the opportunity to meet many exciting engineers, learning a great deal from their experiences.\",\"sameAs\":[\"https:\\\/\\\/thecodecampus.de\\\/ueber-uns\\\/trainer\\\/janik-kessler\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/janik-kessler-615034233\\\/\"],\"url\":\"https:\\\/\\\/www.thecodecampus.de\\\/blog\\\/author\\\/jhorst\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"-1332","description":"Compare Jenkins vs. GitLab CI effortlessly! Discover strengths, streamline workflows, and make informed decisions for optimal CI\/CD. Explore now!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.thecodecampus.de\/blog\/jenkins-vs-gitlab-ci\/","og_locale":"en_US","og_type":"article","og_title":"-1332","og_description":"Compare Jenkins vs. GitLab CI effortlessly! Discover strengths, streamline workflows, and make informed decisions for optimal CI\/CD. Explore now!","og_url":"https:\/\/www.thecodecampus.de\/blog\/jenkins-vs-gitlab-ci\/","og_site_name":"Web Development tips and tricks - theCodeCampus Blog","article_published_time":"2019-09-04T09:44:47+00:00","article_modified_time":"2025-11-04T10:22:18+00:00","og_image":[{"width":483,"height":232,"url":"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/08\/Header.jpg","type":"image\/jpeg"}],"author":"Janik Kessler","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Janik Kessler","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.thecodecampus.de\/blog\/jenkins-vs-gitlab-ci\/#article","isPartOf":{"@id":"https:\/\/www.thecodecampus.de\/blog\/jenkins-vs-gitlab-ci\/"},"author":{"name":"Janik Kessler","@id":"https:\/\/www.thecodecampus.de\/blog\/#\/schema\/person\/0dda62aeb98f2e9a89c2438b6f990101"},"headline":"Jenkins vs. Gitlab CI","datePublished":"2019-09-04T09:44:47+00:00","dateModified":"2025-11-04T10:22:18+00:00","mainEntityOfPage":{"@id":"https:\/\/www.thecodecampus.de\/blog\/jenkins-vs-gitlab-ci\/"},"wordCount":961,"commentCount":0,"publisher":{"@id":"https:\/\/www.thecodecampus.de\/blog\/#organization"},"image":{"@id":"https:\/\/www.thecodecampus.de\/blog\/jenkins-vs-gitlab-ci\/#primaryimage"},"thumbnailUrl":"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/08\/Header.jpg","articleSection":["Gitlab-CI","Node.js","Testing","Tooling"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.thecodecampus.de\/blog\/jenkins-vs-gitlab-ci\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.thecodecampus.de\/blog\/jenkins-vs-gitlab-ci\/","url":"https:\/\/www.thecodecampus.de\/blog\/jenkins-vs-gitlab-ci\/","name":"-1332","isPartOf":{"@id":"https:\/\/www.thecodecampus.de\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.thecodecampus.de\/blog\/jenkins-vs-gitlab-ci\/#primaryimage"},"image":{"@id":"https:\/\/www.thecodecampus.de\/blog\/jenkins-vs-gitlab-ci\/#primaryimage"},"thumbnailUrl":"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/08\/Header.jpg","datePublished":"2019-09-04T09:44:47+00:00","dateModified":"2025-11-04T10:22:18+00:00","description":"Compare Jenkins vs. GitLab CI effortlessly! Discover strengths, streamline workflows, and make informed decisions for optimal CI\/CD. Explore now!","breadcrumb":{"@id":"https:\/\/www.thecodecampus.de\/blog\/jenkins-vs-gitlab-ci\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.thecodecampus.de\/blog\/jenkins-vs-gitlab-ci\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.thecodecampus.de\/blog\/jenkins-vs-gitlab-ci\/#primaryimage","url":"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/08\/Header.jpg","contentUrl":"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2019\/08\/Header.jpg","width":483,"height":232},{"@type":"BreadcrumbList","@id":"https:\/\/www.thecodecampus.de\/blog\/jenkins-vs-gitlab-ci\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.thecodecampus.de\/blog\/"},{"@type":"ListItem","position":2,"name":"Jenkins vs. Gitlab CI"}]},{"@type":"WebSite","@id":"https:\/\/www.thecodecampus.de\/blog\/#website","url":"https:\/\/www.thecodecampus.de\/blog\/","name":"Web Development tips and tricks - theCodeCampus Blog","description":"Tips, tricks, and experiences about developing web and mobile applications with Angular, TypeScript, and Testing.","publisher":{"@id":"https:\/\/www.thecodecampus.de\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.thecodecampus.de\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.thecodecampus.de\/blog\/#organization","name":"theCodeCampus","url":"https:\/\/www.thecodecampus.de\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.thecodecampus.de\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2024\/01\/TCC-Logo-Bildmarke-quadratisch.jpg","contentUrl":"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2024\/01\/TCC-Logo-Bildmarke-quadratisch.jpg","width":156,"height":156,"caption":"theCodeCampus"},"image":{"@id":"https:\/\/www.thecodecampus.de\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.thecodecampus.de\/blog\/#\/schema\/person\/0dda62aeb98f2e9a89c2438b6f990101","name":"Janik Kessler","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2024\/09\/janik-kessler-tcc-author-96x96.png","url":"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2024\/09\/janik-kessler-tcc-author-96x96.png","contentUrl":"https:\/\/www.thecodecampus.de\/blog\/wp-content\/uploads\/2024\/09\/janik-kessler-tcc-author-96x96.png","caption":"Janik Kessler"},"description":"Hi, I'm Janik. I'm a web development enthusiast and love to share my experiences. As a software trainer and engineer, I always seek to exchange ideas with other developers. I've been part of the theCodeCampus team since 2019 and have had the opportunity to meet many exciting engineers, learning a great deal from their experiences.","sameAs":["https:\/\/thecodecampus.de\/ueber-uns\/trainer\/janik-kessler","https:\/\/www.linkedin.com\/in\/janik-kessler-615034233\/"],"url":"https:\/\/www.thecodecampus.de\/blog\/author\/jhorst\/"}]}},"_links":{"self":[{"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/posts\/2041","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/users\/23"}],"replies":[{"embeddable":true,"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/comments?post=2041"}],"version-history":[{"count":24,"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/posts\/2041\/revisions"}],"predecessor-version":[{"id":3579,"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/posts\/2041\/revisions\/3579"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/media\/2043"}],"wp:attachment":[{"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/media?parent=2041"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/categories?post=2041"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.thecodecampus.de\/blog\/wp-json\/wp\/v2\/tags?post=2041"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}