What is Azure Pipelines and what are its top alternatives?
Azure Pipelines is a continuous integration and continuous deployment (CI/CD) service provided by Microsoft as part of Azure DevOps Services. It allows developers to automatically build, test, and deploy their code to any platform. Key features of Azure Pipelines include support for multiple languages and frameworks, integrations with popular development tools, flexible deployment options, and scalability. However, a limitation of Azure Pipelines is its pricing structure based on concurrent pipelines and minutes included in the free tier.
- Jenkins: Jenkins is an open-source automation server that can be used to automate all sorts of tasks related to building, testing, and delivering software. Key features include extensive plugin ecosystem, support for various programming languages, and flexibility in configuration. Pros: Free and open-source, large community support. Cons: Steeper learning curve than Azure Pipelines.
- CircleCI: CircleCI is a cloud-based CI/CD tool that automates the software development process. It provides support for various languages, integrations with popular tools, and scalability for projects of any size. Pros: Easy setup, fast builds. Cons: Pricing can be expensive for larger projects.
- GitLab CI/CD: GitLab CI/CD is part of the GitLab platform and offers a comprehensive DevOps toolset, including source code management, CI/CD, and Docker container registry. Key features include easy setup, powerful auto devops feature, and integration with GitLab's other tools. Pros: All-in-one platform, free tier available. Cons: User interface may feel cluttered.
- Travis CI: Travis CI is a cloud-based CI/CD service that integrates with GitHub repositories to automatically build and test code changes. It offers support for various languages and provides customizable builds with configuration files. Pros: Easy integration with GitHub, free tier available. Cons: Limited concurrency in the free tier.
- Bamboo: Bamboo is a CI/CD tool from Atlassian that integrates with their suite of development tools. It offers features like automated builds, test environments, and deployment pipelines. Pros: Seamless integration with Atlassian products, scalable for large projects. Cons: Higher cost compared to some other options.
- TeamCity: TeamCity is a CI/CD tool from JetBrains that offers powerful build automation features and integrations with popular version control systems. It provides support for various languages and comes with advanced build management capabilities. Pros: Great user interface, easy to set up. Cons: Requires licensing fees for larger projects.
- Drone: Drone is an open-source CI/CD platform built on container technology. It offers lightweight and flexible pipelines, support for multiple version control systems, and allows for easy scalability. Pros: Free and open-source, simple configuration. Cons: Limited official support compared to commercial options.
- GoCD: GoCD is an open-source continuous delivery tool that focuses on streamlining the deployment process. It provides support for complex pipelines, visualization of the entire workflow, and can be easily extended with custom plugins. Pros: Highly customizable, easy to visualize pipeline steps. Cons: Steeper learning curve for beginners.
- Codeship: Codeship is a cloud-based CI/CD tool that offers fast and reliable build processes for software development. It supports various languages and frameworks, integrates with popular tools, and provides easy setup for continuous integration. Pros: Easy to use, fast build times. Cons: Limited customization options compared to other tools.
- Bitbucket Pipelines: Bitbucket Pipelines is a CI/CD service integrated into Bitbucket, Atlassian's source code management platform. It offers easy setup with configuration files, seamless integration with Bitbucket repositories, and customizable pipelines for different workflows. Pros: Easy integration with Bitbucket, scalable for small to medium projects. Cons: Limited customization options compared to standalone CI/CD tools.
Top Alternatives to Azure Pipelines
- Jenkins
In a nutshell Jenkins CI is the leading open-source continuous integration server. Built with Java, it provides over 300 plugins to support building and testing virtually any project. ...
- AWS Data Pipeline
AWS Data Pipeline is a web service that provides a simple management system for data-driven workflows. Using AWS Data Pipeline, you define a pipeline composed of the “data sources” that contain your data, the “activities” or business logic such as EMR jobs or SQL queries, and the “schedule” on which your business logic executes. For example, you could define a job that, every hour, runs an Amazon Elastic MapReduce (Amazon EMR)–based analysis on that hour’s Amazon Simple Storage Service (Amazon S3) log data, loads the results into a relational database for future lookup, and then automatically sends you a daily summary email. ...
- Travis CI
Free for open source projects, our CI environment provides multiple runtimes (e.g. Node.js or PHP versions), data stores and so on. Because of this, hosting your project on travis-ci.com means you can effortlessly test your library or applications against multiple runtimes and data stores without even having all of them installed locally. ...
- AWS CodePipeline
CodePipeline builds, tests, and deploys your code every time there is a code change, based on the release process models you define. ...
- Azure Data Factory
It is a service designed to allow developers to integrate disparate data sources. It is a platform somewhat like SSIS in the cloud to manage the data you have both on-prem and in the cloud. ...
- CircleCI
Continuous integration and delivery platform helps software teams rapidly release code with confidence by automating the build, test, and deploy process. Offers a modern software development platform that lets teams ramp. ...
- Azure DevOps
Azure DevOps provides unlimited private Git hosting, cloud build for continuous integration, agile planning, and release management for continuous delivery to the cloud and on-premises. Includes broad IDE support. ...
- GitLab CI
GitLab offers a continuous integration service. If you add a .gitlab-ci.yml file to the root directory of your repository, and configure your GitLab project to use a Runner, then each merge request or push triggers your CI pipeline. ...
Azure Pipelines alternatives & related posts
- Hosted internally523
- Free open source469
- Great to build, deploy or launch anything async318
- Tons of integrations243
- Rich set of plugins with good documentation211
- Has support for build pipelines111
- Easy setup68
- It is open-source66
- Workflow plugin53
- Configuration as code13
- Very powerful tool12
- Many Plugins11
- Continuous Integration10
- Great flexibility10
- Git and Maven integration is better9
- 100% free and open source8
- Github integration7
- Slack Integration (plugin)7
- Easy customisation6
- Self-hosted GitLab Integration (plugin)6
- Docker support5
- Pipeline API5
- Fast builds4
- Platform idnependency4
- Hosted Externally4
- Excellent docker integration4
- It`w worked3
- Customizable3
- Can be run as a Docker container3
- It's Everywhere3
- JOBDSL3
- AWS Integration3
- Easily extendable with seamless integration2
- PHP Support2
- Build PR Branch Only2
- NodeJS Support2
- Ruby/Rails Support2
- Universal controller2
- Loose Coupling2
- Workarounds needed for basic requirements13
- Groovy with cumbersome syntax10
- Plugins compatibility issues8
- Lack of support7
- Limited abilities with declarative pipelines7
- No YAML syntax5
- Too tied to plugins versions4
related Jenkins posts
Often enough I have to explain my way of going about setting up a CI/CD pipeline with multiple deployment platforms. Since I am a bit tired of yapping the same every single time, I've decided to write it up and share with the world this way, and send people to read it instead ;). I will explain it on "live-example" of how the Rome got built, basing that current methodology exists only of readme.md and wishes of good luck (as it usually is ;)).
It always starts with an app, whatever it may be and reading the readmes available while Vagrant and VirtualBox is installing and updating. Following that is the first hurdle to go over - convert all the instruction/scripts into Ansible playbook(s), and only stopping when doing a clear vagrant up
or vagrant reload
we will have a fully working environment. As our Vagrant environment is now functional, it's time to break it! This is the moment to look for how things can be done better (too rigid/too lose versioning? Sloppy environment setup?) and replace them with the right way to do stuff, one that won't bite us in the backside. This is the point, and the best opportunity, to upcycle the existing way of doing dev environment to produce a proper, production-grade product.
I should probably digress here for a moment and explain why. I firmly believe that the way you deploy production is the same way you should deploy develop, shy of few debugging-friendly setting. This way you avoid the discrepancy between how production work vs how development works, which almost always causes major pains in the back of the neck, and with use of proper tools should mean no more work for the developers. That's why we start with Vagrant as developer boxes should be as easy as vagrant up
, but the meat of our product lies in Ansible which will do meat of the work and can be applied to almost anything: AWS, bare metal, docker, LXC, in open net, behind vpn - you name it.
We must also give proper consideration to monitoring and logging hoovering at this point. My generic answer here is to grab Elasticsearch, Kibana, and Logstash. While for different use cases there may be better solutions, this one is well battle-tested, performs reasonably and is very easy to scale both vertically (within some limits) and horizontally. Logstash rules are easy to write and are well supported in maintenance through Ansible, which as I've mentioned earlier, are at the very core of things, and creating triggers/reports and alerts based on Elastic and Kibana is generally a breeze, including some quite complex aggregations.
If we are happy with the state of the Ansible it's time to move on and put all those roles and playbooks to work. Namely, we need something to manage our CI/CD pipelines. For me, the choice is obvious: TeamCity. It's modern, robust and unlike most of the light-weight alternatives, it's transparent. What I mean by that is that it doesn't tell you how to do things, doesn't limit your ways to deploy, or test, or package for that matter. Instead, it provides a developer-friendly and rich playground for your pipelines. You can do most the same with Jenkins, but it has a quite dated look and feel to it, while also missing some key functionality that must be brought in via plugins (like quality REST API which comes built-in with TeamCity). It also comes with all the common-handy plugins like Slack or Apache Maven integration.
The exact flow between CI and CD varies too greatly from one application to another to describe, so I will outline a few rules that guide me in it: 1. Make build steps as small as possible. This way when something breaks, we know exactly where, without needing to dig and root around. 2. All security credentials besides development environment must be sources from individual Vault instances. Keys to those containers should exist only on the CI/CD box and accessible by a few people (the less the better). This is pretty self-explanatory, as anything besides dev may contain sensitive data and, at times, be public-facing. Because of that appropriate security must be present. TeamCity shines in this department with excellent secrets-management. 3. Every part of the build chain shall consume and produce artifacts. If it creates nothing, it likely shouldn't be its own build. This way if any issue shows up with any environment or version, all developer has to do it is grab appropriate artifacts to reproduce the issue locally. 4. Deployment builds should be directly tied to specific Git branches/tags. This enables much easier tracking of what caused an issue, including automated identifying and tagging the author (nothing like automated regression testing!).
Speaking of deployments, I generally try to keep it simple but also with a close eye on the wallet. Because of that, I am more than happy with AWS or another cloud provider, but also constantly peeking at the loads and do we get the value of what we are paying for. Often enough the pattern of use is not constantly erratic, but rather has a firm baseline which could be migrated away from the cloud and into bare metal boxes. That is another part where this approach strongly triumphs over the common Docker and CircleCI setup, where you are very much tied in to use cloud providers and getting out is expensive. Here to embrace bare-metal hosting all you need is a help of some container-based self-hosting software, my personal preference is with Proxmox and LXC. Following that all you must write are ansible scripts to manage hardware of Proxmox, similar way as you do for Amazon EC2 (ansible supports both greatly) and you are good to go. One does not exclude another, quite the opposite, as they can live in great synergy and cut your costs dramatically (the heavier your base load, the bigger the savings) while providing production-grade resiliency.
Releasing new versions of our services is done by Travis CI. Travis first runs our test suite. Once it passes, it publishes a new release binary to GitHub.
Common tasks such as installing dependencies for the Go project, or building a binary are automated using plain old Makefiles. (We know, crazy old school, right?) Our binaries are compressed using UPX.
Travis has come a long way over the past years. I used to prefer Jenkins in some cases since it was easier to debug broken builds. With the addition of the aptly named “debug build” button, Travis is now the clear winner. It’s easy to use and free for open source, with no need to maintain anything.
#ContinuousIntegration #CodeCollaborationVersionControl
AWS Data Pipeline
- Easy to create DAG and execute it1
related AWS Data Pipeline posts
Travis CI
- Github integration506
- Free for open source388
- Easy to get started271
- Nice interface191
- Automatic deployment162
- Tutorials for each programming language72
- Friendly folks40
- Support for multiple ruby versions29
- Osx support28
- Easy handling of secret keys24
- Fast builds6
- Support for students4
- The best tool for Open Source CI3
- Hosted3
- Build Matrices3
- Github Pull Request build2
- Straightforward Github/Coveralls integration2
- Easy of Usage2
- Integrates with everything2
- Caching resolved artifacts1
- Docker support1
- Great Documentation1
- Build matrix1
- No-brainer for CI1
- Debug build workflow1
- Ubuntu trusty is not supported1
- Free for students1
- Configuration saved with project repository1
- Multi-threaded run1
- Hipchat Integration1
- Perfect0
- Can't be hosted insternally8
- Feature lacking3
- Unstable3
- Incomplete documentation for all platforms2
related Travis CI posts
Releasing new versions of our services is done by Travis CI. Travis first runs our test suite. Once it passes, it publishes a new release binary to GitHub.
Common tasks such as installing dependencies for the Go project, or building a binary are automated using plain old Makefiles. (We know, crazy old school, right?) Our binaries are compressed using UPX.
Travis has come a long way over the past years. I used to prefer Jenkins in some cases since it was easier to debug broken builds. With the addition of the aptly named “debug build” button, Travis is now the clear winner. It’s easy to use and free for open source, with no need to maintain anything.
#ContinuousIntegration #CodeCollaborationVersionControl
We are in the process of building a modern content platform to deliver our content through various channels. We decided to go with Microservices architecture as we wanted scale. Microservice architecture style is an approach to developing an application as a suite of small independently deployable services built around specific business capabilities. You can gain modularity, extensive parallelism and cost-effective scaling by deploying services across many distributed servers. Microservices modularity facilitates independent updates/deployments, and helps to avoid single point of failure, which can help prevent large-scale outages. We also decided to use Event Driven Architecture pattern which is a popular distributed asynchronous architecture pattern used to produce highly scalable applications. The event-driven architecture is made up of highly decoupled, single-purpose event processing components that asynchronously receive and process events.
To build our #Backend capabilities we decided to use the following: 1. #Microservices - Java with Spring Boot , Node.js with ExpressJS and Python with Flask 2. #Eventsourcingframework - Amazon Kinesis , Amazon Kinesis Firehose , Amazon SNS , Amazon SQS, AWS Lambda 3. #Data - Amazon RDS , Amazon DynamoDB , Amazon S3 , MongoDB Atlas
To build #Webapps we decided to use Angular 2 with RxJS
#Devops - GitHub , Travis CI , Terraform , Docker , Serverless
AWS CodePipeline
- Simple to set up13
- Managed service8
- GitHub integration4
- Parallel Execution3
- Automatic deployment2
- Manual Steps Available0
- No project boards2
- No integration with "Power" 365 tools1
related AWS CodePipeline posts
I'm the CTO of a marketing automation SaaS. Because of the continuously increasing load we moved to the AWSCloud. We are using more and more features of AWS: Amazon CloudWatch, Amazon SNS, Amazon CloudFront, Amazon Route 53 and so on.
Our main Database is MySQL but for the hundreds of GB document data we use MongoDB more and more. We started to use Redis for cache and other time sensitive operations.
On the front-end we use jQuery UI + Smarty but now we refactor our app to use Vue.js with Vuetify. Because our app is relatively complex we need to use vuex as well.
On the development side we use GitHub as our main repo, Docker for local and server environment and Jenkins and AWS CodePipeline for Continuous Integration.
We recently added new APIs to Jira to associate information about Builds and Deployments to Jira issues.
The new APIs were developed using a spec-first API approach for speed and sanity. The details of this approach are described in this blog post, and we relied on using Swagger and associated tools like Swagger UI.
A new service was created for managing the data. It provides a REST API for external use, and an internal API based on GraphQL. The service is built using Kotlin for increased developer productivity and happiness, and the Spring-Boot framework. PostgreSQL was chosen for the persistence layer, as we have non-trivial requirements that cannot be easily implemented on top of a key-value store.
The front-end has been built using React and querying the back-end service using an internal GraphQL API. We have plans of providing a public GraphQL API in the future.
New Jira Integrations: Bitbucket CircleCI AWS CodePipeline Octopus Deploy jFrog Azure Pipelines
related Azure Data Factory posts
Trying to establish a data lake(or maybe puddle) for my org's Data Sharing project. The idea is that outside partners would send cuts of their PHI data, regardless of format/variables/systems, to our Data Team who would then harmonize the data, create data marts, and eventually use it for something. End-to-end, I'm envisioning:
- Ingestion->Secure, role-based, self service portal for users to upload data (1a. bonus points if it can preform basic validations/masking)
- Storage->Amazon S3 seems like the cheapest. We probably won't need very big, even at full capacity. Our current storage is a secure Box folder that has ~4GB with several batches of test data, code, presentations, and planning docs.
- Data Catalog-> AWS Glue? Azure Data Factory? Snowplow? is the main difference basically based on the vendor? We also will have Data Dictionaries/Codebooks from submitters. Where would they fit in?
- Partitions-> I've seen Cassandra and YARN mentioned, but have no experience with either
- Processing-> We want to use SAS if at all possible. What will work with SAS code?
- Pipeline/Automation->The check-in and verification processes that have been outlined are rather involved. Some sort of automated messaging or approval workflow would be nice
- I have very little guidance on what a "Data Mart" should look like, so I'm going with the idea that it would be another "experimental" partition. Unless there's an actual mart-building paradigm I've missed?
- An end user might use the catalog to pull certain de-identified data sets from the marts. Again, role-based access and self-service gui would be preferable. I'm the only full-time tech person on this project, but I'm mostly an OOP, HTML, JavaScript, and some SQL programmer. Most of this is out of my repertoire. I've done a lot of research, but I can't be an effective evangelist without hands-on experience. Since we're starting a new year of our grant, they've finally decided to let me try some stuff out. Any pointers would be appreciated!
We are a young start-up with 2 developers and a team in India looking to choose our next ETL tool. We have a few processes in Azure Data Factory but are looking to switch to a better platform. We were debating Trifacta and Airflow. Or even staying with Azure Data Factory. The use case will be to feed data to front-end APIs.
- Github integration226
- Easy setup177
- Fast builds153
- Competitively priced94
- Slack integration74
- Docker support55
- Awesome UI45
- Great customer support33
- Ios support18
- Hipchat integration14
- SSH debug access13
- Free for Open Source11
- Mobile support6
- Nodejs support5
- Bitbucket integration5
- YAML configuration5
- AWS CodeDeploy integration4
- Free for Github private repo3
- Great support3
- Clojurescript2
- Continuous Deployment2
- Parallelism2
- Clojure2
- OSX support2
- Simple, clean UI2
- Unstable1
- Ci1
- Favorite1
- Helpful documentation1
- Autoscaling1
- Extremely configurable1
- Works1
- Android support1
- Fair pricing1
- All inclusive testing1
- Japanese in rspec comment appears OK1
- Build PR Branch Only1
- So circular1
- Easy setup, easy to understand, fast and reliable1
- Parallel builds for slow test suites1
- Easy setup. 2.0 is fast!1
- Easy to deploy to private servers1
- Really easy to use1
- Stable0
- Unstable12
- Scammy pricing structure6
- Aggressive Github permissions0
related CircleCI posts
StackShare Feed is built entirely with React, Glamorous, and Apollo. One of our objectives with the public launch of the Feed was to enable a Server-side rendered (SSR) experience for our organic search traffic. When you visit the StackShare Feed, and you aren't logged in, you are delivered the Trending feed experience. We use an in-house Node.js rendering microservice to generate this HTML. This microservice needs to run and serve requests independent of our Rails web app. Up until recently, we had a mono-repo with our Rails and React code living happily together and all served from the same web process. In order to deploy our SSR app into a Heroku environment, we needed to split out our front-end application into a separate repo in GitHub. The driving factor in this decision was mostly due to limitations imposed by Heroku specifically with how processes can't communicate with each other. A new SSR app was created in Heroku and linked directly to the frontend repo so it stays in-sync with changes.
Related to this, we need a way to "deploy" our frontend changes to various server environments without building & releasing the entire Ruby application. We built a hybrid Amazon S3 Amazon CloudFront solution to host our Webpack bundles. A new CircleCI script builds the bundles and uploads them to S3. The final step in our rollout is to update some keys in Redis so our Rails app knows which bundles to serve. The result of these efforts were significant. Our frontend team now moves independently of our backend team, our build & release process takes only a few minutes, we are now using an edge CDN to serve JS assets, and we have pre-rendered React pages!
#StackDecisionsLaunch #SSR #Microservices #FrontEndRepoSplit
Our whole DevOps stack consists of the following tools:
- GitHub (incl. GitHub Pages/Markdown for Documentation, GettingStarted and HowTo's) for collaborative review and code management tool
- Respectively Git as revision control system
- SourceTree as Git GUI
- Visual Studio Code as IDE
- CircleCI for continuous integration (automatize development process)
- Prettier / TSLint / ESLint as code linter
- SonarQube as quality gate
- Docker as container management (incl. Docker Compose for multi-container application management)
- VirtualBox for operating system simulation tests
- Kubernetes as cluster management for docker containers
- Heroku for deploying in test environments
- nginx as web server (preferably used as facade server in production environment)
- SSLMate (using OpenSSL) for certificate management
- Amazon EC2 (incl. Amazon S3) for deploying in stage (production-like) and production environments
- PostgreSQL as preferred database system
- Redis as preferred in-memory database/store (great for caching)
The main reason we have chosen Kubernetes over Docker Swarm is related to the following artifacts:
- Key features: Easy and flexible installation, Clear dashboard, Great scaling operations, Monitoring is an integral part, Great load balancing concepts, Monitors the condition and ensures compensation in the event of failure.
- Applications: An application can be deployed using a combination of pods, deployments, and services (or micro-services).
- Functionality: Kubernetes as a complex installation and setup process, but it not as limited as Docker Swarm.
- Monitoring: It supports multiple versions of logging and monitoring when the services are deployed within the cluster (Elasticsearch/Kibana (ELK), Heapster/Grafana, Sysdig cloud integration).
- Scalability: All-in-one framework for distributed systems.
- Other Benefits: Kubernetes is backed by the Cloud Native Computing Foundation (CNCF), huge community among container orchestration tools, it is an open source and modular tool that works with any OS.
Azure DevOps
- Complete and powerful56
- Huge extension ecosystem32
- Azure integration27
- Flexible and powerful26
- One Stop Shop For Build server, Project Mgt, CDCI26
- Everything I need. Simple and intuitive UI15
- Support Open Source13
- Integrations8
- GitHub Integration7
- Cost free for Stakeholders6
- One 4 all6
- Crap6
- Project Mgmt Features6
- Runs in the cloud5
- Agent On-Premise(Linux - Windows)3
- Aws integration2
- Link Test Cases to Stories2
- Jenkins Integration2
- GCP Integration1
- Still dependant on C# for agents8
- Half Baked5
- Many in devops disregard MS altogether5
- Not a requirements management tool4
- Jack of all trades, master of none4
- Capacity across cross functional teams not visibile4
- Poor Jenkins integration3
- Tedious for test plan/case creation2
- Switching accounts is impossible1
related Azure DevOps posts
Visual Studio Azure DevOps Azure Functions Azure Websites #Azure #AzureKeyVault #AzureAD #AzureApps
#Azure Cloud Since Amazon is potentially our competitor then we need a different cloud vendor, also our programmers are microsoft oriented so the choose were obviously #Azure for us.
Azure DevOps Because we need to be able to develop a neww pipeline into Azure environment ina few minutes.
Azure Kubernetes Service We already in #Azure , also need to use K8s , so let's use AKS as it's a manged Kubernetes in the #Azure
I use Azure DevOps because for me it gradually walk me from private Git repositories to simplest free option for CI/CD pipelines at the time. I spend 0$ initially to manager CI/CD for my small private projects. No need to go into two different places to setup integration, once I have git repository, I could deploy projects. Right now this is not the case since CI/CD is default for me, so I use it now from memories of old good days. I'm not yet need complexity on the projects, so I don't even consider other options with "more choices". I carefully limit my set of options during development, that's why Azure DevOps (VSTS)
- Robust CI with awesome Docker support22
- Simple configuration13
- All in one solution9
- Source Control and CI in one place7
- Integrated with VCS on commit5
- Free and open source5
- Easy to configure own build server i.e. GitLab-Runner5
- Hosted internally2
- Built-in Docker Registry1
- Built-in support of Review Apps1
- Pipeline could be started manually1
- Enable or disable pipeline by using env variables1
- Gitlab templates could be shared across logical group1
- Easy to setup the dedicated runner to particular job1
- Built-in support of Kubernetes1
- Works best with GitLab repositories2
related GitLab CI posts
I have got a small radio service running on Node.js. Front end is written with React and packed with Webpack . I use Docker for my #DeploymentWorkflow along with Docker Swarm and GitLab CI on a single Google Compute Engine instance, which is also a runner itself. Pretty unscalable decision but it works great for tiny projects. The project is available on https://fridgefm.com
We use GitLab CI because of the great native integration as a part of the GitLab framework and the linting-capabilities it offers. The visualization of complex pipelines and the embedding within the project overview made Gitlab CI even more convenient. We use it for all projects, all deployments and as a part of GitLab Pages.
While we initially used the Shell-executor, we quickly switched to the Docker-executor and use it exclusively now.
We formerly used Jenkins but preferred to handle everything within GitLab . Aside from the unification of our infrastructure another motivation was the "configuration-in-file"-approach, that Gitlab CI offered, while Jenkins support of this concept was very limited and users had to resort to using the webinterface. Since the file is included within the repository, it is also version controlled, which was a huge plus for us.