In general Gitlab is the most feature rich and most flexible currently, so I'd label it as the best.
However usually the best choice for a given project is what integrates the easiest with other services. So for example if your deploying on GCP, Cloud Build is the best simply because you have to work less to integrate it with the rest of GCP. It does lack more features then gitlab, but most of the time CI/CD just needs to be easy to use since its more of a "get it working and forget" type of utility rather then one that requires more and more capabilities.
I'm a Systems Reliability and DevOps engineer for Netdata Inc. When not working, I enjoy studying linguistics and history, playing video games, and cooking all kinds of international cuisine.
You can run the actual tasks on your own infrastructure if you want to (anything supported by .NET Core 3.1 right now, but there is talk that they may be moving to Go or Node.js for the runner code).
The pricing is sensible and easy to understand (free for public GitHub repositories, pro-rated per minute of build time for private repos once you exceed a quota of free minutes).
It provides very good integration with PR's on GitHub (each individual job gets it's own entry in the PR checks, as opposed to stuff like Travis or CircleCI which have a single entry for all of the stuff they run).
They don't appear to have random networking issues like some services do (this has been a big issue with Travis for my current employer).
The default concurrency limits are higher than many other hosted CI services.
You can choose whether to have it bail early when the first job in a set fails or run everything to completion.
On the other hand, it does have it's issues:
Actions run against PR's from forks owned by people who aren't listed as contributors to the repo the PR is against can't access any secrets at all and don't have any write access to anything to do with the repo. This is good from a security perspective, but it seriously limits what you can do (for example, you can't actually reliably label a PR from GitHub Actions, because anybody who isn't a collaborator won't have the actions running with the required permissions to manipulate the PR labels).
As mentioned above, self-hosted runners are currently limited to platforms supported by .NET Core 3.1. This means no support for anything other than Windows, macOS, or Linux, and no CPU architectures other than x86, x86_64, ARM, and ARM64. This doesn't affect some people, but it's a showstopper for others. You can, however, work around this just like is possible with any other decent CI/CD system (that is, either use QEMU or just call out to another machine to run the tasks).
I'm going to be a contrarian and say that I haven't any experience with Gitlabs or GitHub integrations, but Azure DevOps is a really capable platform. We're using it to run some really complex PowerShell/Terraform/C# tooling that populates entire AWS accounts from scratch, or updates them, and "it just works™" - really impressed and totally sold on the Azure DevOps environment (From someone who hated TFS, this is quite an admission)
GitHub actions is ridiculously simple to set up and works really well and of course is backed by Microsoft. I would be terrified right now if I were CircleCI or TravisCI.
I have a been using codefresh professionally for the past year. It's extremely feature rich and very powerful for docker-based workflows.
Glitlab is really great. I'm on their online free tier and still use CI/CD with a remote runner (it runs on a external Linode VPS). No costs or limitations so far.
I have no big or slow builds but I am able to run pipelines and deploy Docker images on my VPS.
I've been really liking gitlab. They have also been doing a good job making it better, though there is pricing scales for so nice things (I'm on the lowest self hosted paid service).
I didn't like Travis, Jenkins is changing but it doesn't look good to me, though I still need to use it for workflows that don't have a repository. Github seems generally powerful but it looks like it will have the Plugin challenge of Jenkins.
I think most CI/CD services are still quite immature. Whichever service you end up choosing depends on what compromises you are willing to accept.
For me, I usually end up with either:
GitHub Actions, if the project is open-source, public, and speed/build times are not prioritized issues.
CircleCI, for anything else, or when I suspect that SSH access to the build servers will be beneficial.
The only thing I'd recommend, regardless of use case, is to stay clear from Jenkins and TeamCity. Both these services have more drawbacks than upsides and are a pain in the butt to work with due to unnecessarily complicated workflows and/or maintenance.
"Best" will really depend on your team's needs. For an all-in-one solution, Azure DevOps is pretty good especially if you're in the Microsoft / Azure space. Personally, I've always preferred TeamCity + Octopus Deploy (disclosure, I work for Octopus Deploy but I've used the product since 2013). But with the lack of a cloud hosted TeamCity, I'd probably opt for Azure DevOps, CircleCI, or some other hosted CI service. Maybe BitBucket Pipelines if my team were using Atlassian tools heavily.
I've worked with many different services and I've learned that when they offer too much ui, then they become dangerous for the team. In my opinion, every project should have defined entry points for e.g. build, test, publish and all the rest are just a matter of driving them with any tool of preference. Then you also have portability from tool to tool.
I've seen a team struggling so bad with gitlabs to a point that I hated it because it offers this culture of just clicking sound that bad developers embrace. If of containing their complicated actions in the repo itself, they choose to implement complex paths outside because why should they code it? When the repo changes though, then the whole system breaks apart. If you are spending more time troubleshooting your ci, then you are doing something wrong.
Any tool should have a very clear change management process embedded in like yaml. I love Travis and appveyor because they allow the configuration and execution to be part of the branch with a very simple and readable format.
I've used GitHub actions, circle ci to some extent on my side projects but I've mostly used Azure DevOps and was really happy with it. Lots of integrations, very useful online assistants to create build definitions. I also have to say I've used in my working environment but there really wasn't anything I was unhappy about, it worked really well.
Polyglot, autodidact. OSS author and contributor. Addicted to writing code, seeking my next 'fix'. Love communicating with an audience whose eyes don't glaze over when I get to the 'good parts'.
In general Gitlab is the most feature rich and most flexible currently, so I'd label it as the best.
However usually the best choice for a given project is what integrates the easiest with other services. So for example if your deploying on GCP, Cloud Build is the best simply because you have to work less to integrate it with the rest of GCP. It does lack more features then gitlab, but most of the time CI/CD just needs to be easy to use since its more of a "get it working and forget" type of utility rather then one that requires more and more capabilities.
It very much depends on what your exact needs are.
I'm personally rather fond of GitHub Actions though, because:
On the other hand, it does have it's issues:
I'm going to be a contrarian and say that I haven't any experience with Gitlabs or GitHub integrations, but Azure DevOps is a really capable platform. We're using it to run some really complex PowerShell/Terraform/C# tooling that populates entire AWS accounts from scratch, or updates them, and "it just works™" - really impressed and totally sold on the Azure DevOps environment (From someone who hated TFS, this is quite an admission)
I'll second this. Repos, Build/Release Pipelines, Kanban boards, all in one place. It works well and is constantly being improved by Microsoft.
GitHub actions is ridiculously simple to set up and works really well and of course is backed by Microsoft. I would be terrified right now if I were CircleCI or TravisCI.
I have a been using codefresh professionally for the past year. It's extremely feature rich and very powerful for docker-based workflows.
Glitlab is really great. I'm on their online free tier and still use CI/CD with a remote runner (it runs on a external Linode VPS). No costs or limitations so far.
I have no big or slow builds but I am able to run pipelines and deploy Docker images on my VPS.
I've been really liking gitlab. They have also been doing a good job making it better, though there is pricing scales for so nice things (I'm on the lowest self hosted paid service).
I didn't like Travis, Jenkins is changing but it doesn't look good to me, though I still need to use it for workflows that don't have a repository. Github seems generally powerful but it looks like it will have the Plugin challenge of Jenkins.
I think most CI/CD services are still quite immature. Whichever service you end up choosing depends on what compromises you are willing to accept.
For me, I usually end up with either:
The only thing I'd recommend, regardless of use case, is to stay clear from Jenkins and TeamCity. Both these services have more drawbacks than upsides and are a pain in the butt to work with due to unnecessarily complicated workflows and/or maintenance.
"Best" will really depend on your team's needs. For an all-in-one solution, Azure DevOps is pretty good especially if you're in the Microsoft / Azure space. Personally, I've always preferred TeamCity + Octopus Deploy (disclosure, I work for Octopus Deploy but I've used the product since 2013). But with the lack of a cloud hosted TeamCity, I'd probably opt for Azure DevOps, CircleCI, or some other hosted CI service. Maybe BitBucket Pipelines if my team were using Atlassian tools heavily.
I've worked with many different services and I've learned that when they offer too much ui, then they become dangerous for the team. In my opinion, every project should have defined entry points for e.g. build, test, publish and all the rest are just a matter of driving them with any tool of preference. Then you also have portability from tool to tool.
I've seen a team struggling so bad with gitlabs to a point that I hated it because it offers this culture of just clicking sound that bad developers embrace. If of containing their complicated actions in the repo itself, they choose to implement complex paths outside because why should they code it? When the repo changes though, then the whole system breaks apart. If you are spending more time troubleshooting your ci, then you are doing something wrong.
Any tool should have a very clear change management process embedded in like yaml. I love Travis and appveyor because they allow the configuration and execution to be part of the branch with a very simple and readable format.
I've used GitHub actions, circle ci to some extent on my side projects but I've mostly used Azure DevOps and was really happy with it. Lots of integrations, very useful online assistants to create build definitions. I also have to say I've used in my working environment but there really wasn't anything I was unhappy about, it worked really well.
I've not used ci/cd that much, but Travis CI fits my needs perfectly
Gitlab CI/CD as we self-host gitlab on our servers, but we will switch to AWS.
Pretty happy with Gitlab until now.
GitHub Actions and GitLab CI are both fantastic
I have used most of the other popular CI platforms in the past. Nothing works better than a CI that integrates directly with the repo.
I ❤️ gitlab right from the beginning , I pulled all my company employees to use gitlab ci/cd. Currently every project is implementing this.