CI/CD And Why It Matters?

Modern agile development practice demands visibility into the state (quality) of software under development.  This avoids some of the nasty surprises common to the old school, spec-driven, waterfall development.  The problem is that the desired level of visibility does not come cheap.  Traditional QA methods would take weeks to test and certify the output of waterfall driven teams.  Agile development effectively subdivides the waterfall into (typically) 2-week sprints, each of which terminates with a quality product, at some level of feature completeness. 

No intrepid team of QA staff is going to be able to keep up with this rate of change in features and code, and so automated testing became essential.  Of course, traditional QA testing also used automated tools, but discovering errors late is very expensive, and so the testing was moved into the software development process itself.  Engineers became tasked with writing tests for their own code, and the launching of tests became integrated with the software version control system.  This “continuous testing” is “continuous integration” (aka CI), and provides a measure of quality control at a high pace, at least assuming the tests are well written.

The next step beyond having frequently (continuously) tested code, is to automate the deployment process so users can get their hands on fixes and updates as quickly as possible.  The traditional release process to production was always a fairly lengthy, stressful, and thankless process performed by brave operations staff.  With the automation of production updates (often not a trivial task by any means), the terror of these events is eliminated, and the software quality and user experience greatly enhanced by the speed of fixes and improvements.  This is “continuous delivery” (aka CD), and while not usually quite as “continuous” as CI, it is still revolutionary compared to the status quo.

Jenkins

Jenkins is a free, open-source CI tool available on GitHub. It is by far the most mature solution of this bunch, with its roots in Sun Microsystems.  One virtue of its long tenure is a vast selection of plugins along with a large number of built-in features.  Unlike some tools reviewed here, Jenkins is an on-premises managed product, which can have security benefits.  Because it’s been around so long, there are a lot of videos and tutorials available for learning, both free and otherwise.

Jenkins isn’t limited to a particular software version control system and is compatible with git, subversion, and Mercurial.  It’s also scalable, to support parallel development using a master/slave architecture, and it supports defining CI/CD pipelines as “code” (textual) so build automation can be iterated like the rest of the code.  Jenkins is written in Java, making it platform-independent and easy to install with a simple command-line entry.  It’s also got a great community

CircleCI

CircleCI is a cloud and on premises-based CI server that is integrated with Github and Bitbucket, getting triggered to build and test software.  Circle CI can be configured to deploy to various cloud platforms including  AWS CodeDeploy, AWS EC2 Container Service (ECS), AWS S3, Google Kubernetes Engine (GKE), Microsoft Azure, and Heroku, as well as the ability integrate with deployment environments via shell scripts. AWS CodeDeploy, AWS EC2 Container Service (ECS), AWS S3, Google Kubernetes Engine (GKE), Microsoft Azure, and Heroku.

In its SaaS incarnation, CircleCI eliminates installation and server startup and maintenance.  Software updates occur automatically and the scale is open-ended. On the negative side, depending on your needs, having a hosted service may introduce unacceptable security risks.

The on-premises version (CircleCI Enterprise) deploys CircleCI in a HashiCorp Nomad cluster and provides an option for organizations that desire more control and security.

Github Actions CI/CD

Github Actions CI/CD is a service provided by Github built upon the Github Actions feature, which allows users to respond to events occurring in Github.  Github allows you to run builds, tests, and deployments on their cloud servers, or on your own servers using the hosted runners feature.

Github Actions CI/CD supports the most popular OSs and languages. It has an open marketplace for integrations that vary in quality.  It uses a YAML configuration file that defines jobs to be run when user selected event(s) within GitHub (a ‘push’ for example) occur.  It supports matrix builds that run multiple build configurations in parallel.

Github Actions CI/CD is free for public repositories, and pay as you go for private repositories, but of course, only works with Github.  Github also provides an on-premises server for those wanting more control.  Github Enterprise is delivered as a virtual appliance that can run in high availability (failover) mode if desired.

Also Read: Top Software Development Tools! Which One Is Your Favorite?

AWS CodeCommit

AWS CodeCommit is actually just a piece of the Amazon solution for CI/CD which also includes AWS CodeBuild, AWS CodeDeploy, and AWS CodePipeline.  Other AWS services involved include AWS CloudWatch, S3, and KMS. 

Somewhat like Github Actions, AWS CodeCommit (the git client compatible code repository) triggers build events received by CodePipeline.  These events (provided by CloudWatch) flow to CodeBuild which builds and runs tests, storing the artifact(s) produced on S3.  Then, assuming all is well, the artifact is deployed using CodeDeploy.  CodePipeline can also use S3 and Github as sources.

AWS CodeBuild supports Linux and Windows (in certain regions).  Deployments normally occur to AWS, but deploying to other environments is possible.  It is very much focussed on the AWS ecosystem, high quality integrations are built into the tool suite.

Also Read: 5 Tools for App Development in the Cloud

Summary

Of these four tools, Jenkins is the eldest, most complete, and most well tested, but requires self-installation and management.  All the other tools offer SaaS and on-prem versions.  Clearly, SaaS solutions offer their traditional cloud derived advantages of zero installation, managed operations, automatic updates, and scalability.  Among the cloud offerings, two are add on features to existing services, Github and AWS.  CircleCI rounds out the cloud offerings with an independent pedigree, but with integrations to the others.

So which to pick?  Jenkins is the safe option for users who want full control over their environments and aren’t swayed by the advantages of cloud-based offerings.  If you are already deeply invested in either the AWS or Github ecosystem, their products will be most convenient to use and operate.  Finally, if you want a more mature cloud-based offering, CircleCi offers an excellent feature set and integrates with the major platforms.  On the deployment side (CD), none of the tools provide great support for more complex cloud deployments, especially hybrid cloud deployments.  This leaves the task of integrating another orchestrator that can handle multi and hybrid cloud deployments, ideally using infrastructure as code approach.  All the tools in this roundup can support the integration of such an orchestrator.

– Originally Written By Niti Shalom, Cloudify