I've started moving all my projects away from Github in favor of Gitlab, and I haven't looked back.

I should say upfront that I'm not affiliated with nor employed by Gitlab. I haven't been paid, prompted, or asked by Gitlab to write this post. And, as far as I know, Gitlab has no idea I've written about them.

My favorite Gitlab Features

  • Unlimited free closed projects, like Bitbucket
  • Painless Github importer
  • Remove source branch after merge to master automatically
  • Merge branch when tests pass automatically
  • Create a branch from a issue in website; auto-resolve issue when branch is merged
  • Integrated approach to software development makes it easier see what's happening in my project
  • Excellent issue tracker / basic project management
  • Integrated CI with excellent documentation
  • Proper docker support in CI (not a forked build of docker)
  • Builtin Docker image registry
  • Build environment can be any docker image
  • Parallel builds in CI
  • API for CI
  • CI Deployments track where your code is deployed to (I use this feature to render previews of my blog on S3 on a per branch basis)

Gitlab is more innovative

Gitlab has pioneered a plethora of new features before Github, Bitbucket, Gogs or any of the other competitors in the space. Gitlab's commitment to open source product direction, incident response, and source code means that I have insight into the product roadmap as well as the ability to contribute my feedback and features.

By comparison, Github has more-or-less copied a few of the best project management features but still lags behind Gitlab in terms of basic features like "Merge on Test Pass" and "Remove Source Branch on Merge" features. Github itself is 100% closed source and notorious for its lack of transparency in terms of product direction. Github eventually added the ability to rebase-merge, and create issue templates months and months after Gitlab. By choosing to use Gitlab, you're getting the best new features right away.

GitlabCI is competitive

Let's talk about GitlabCI. Here's a quick comparison (due to age poorly) between the major continuous integration and continuous deployment options in the space:

CI/CD ServiceGitlabCITravisCICircleCICodeshipDroneCIJenkins
VCS Supportgitgitgitgitgitany via plugin
Github Supportno, but..yesyesyesYesplugin
Gitlab SupportgitlabnonoyesNoplugin
Bitbucket Supportno, but..noyesyesYesplugin
Open SourceYesYesNoNo?YesYes
Founded2011201120112011???2004 (as Hudson)
Documentation StyleReferenceTutorialTutorialTutorialReferenceTutorial
Documentation SearchNoNoYesYesNoNo
Cloud OptionYesYesYesYesNoCloudBees
On-premise OptionCE & EENoEENoYesYes
Local executionYesMaybe...NoYesMaybe...Docker
DebuggingLocalSSHSSHLocalWebNo
Linux Test envYesYesYesYesYesYes
OSX Test envNot CloudYesYesNot CloudNoYes
Windows Test envNot CloudNoNoNot CloudNoYes
Docker supportBEST EVERYesAwfulYesYesYes
Enterprise SupportYesYesYesYesNoProbably
Free Closed Source ProjectsYesNoNo1 projectOn premOn prem
Build APIYesNoYesYesNoYes
Manual TestYesNoNoNoNoNo
Source Controlled ConfigYesYesYesYesNoNo
Secrets managementWebYML & WebWebWeb&dockerWebWeb
ArtifactsNativeS3NativeS3/SFTPS3/Herokuplugins
Parallel Build "Steps"YesYesYesYesNoNo
Parallel step rerunNoYesNoNoNoNo
Parallel synchronizationYesNoYesYesNoNo
Build notificationsYesYesYesYesYesYes
Integrated Docker RegistryYesNoNoNoNoNo
Deployment targetsYes3rd party3rd party3rd Party3rd partyplugins
BadgesYesYesYesYesYesplugin
Integrated WebhooksYesNoNoYesNoNo

One of the key differentiators above is the ability to run the CI locally. This is really really handy for two reasons:

  • Increased fault tolerance: even if your remote CI infrastructure is down, you can still run builds and deployments.
  • Debugging: its potentially much faster to iterate on a broken test locally

Both GitlabCI and Codeship are designed to help with the second bullet point. GitlabCI also provides the increased fault tolerance that I often wanted when I relied on CircleCI.

For me, GitlabCI is the most exciting CI option available, especially in the build-on-mac-and-deploy-to-linux scenario.

Summary

Gitlab unifies all (or most) of the different services you previously relied on when using Github, but is flexible enough to work with other systems (via triggers, API, and webhooks) or simply does a better job than Github + other services. If you're thinking about making the switch, I'd encourage you to try out the gitlab.com for your next side project or open source project.