CICD tools – Comparison
The term CICD is vast and implementation is challenging because of the options available as open source as well as licensed products. Here we try to explore the features of CI tools and some of the features to consider while implementing so that tools can “integrate” smoothly.
There are “n” number of options to cater to the needs of every project. Toolset must be concluded after exploring various features of relevant options.
What is CICD?
CICD expands as Continuous Integration and Continuous Delivery/Continuous Deployment. In “Good old days” of development, practice followed was integrating the code changes with the main stream would be done in a non-frequent manner which made the deployment or delivery a cumbersome process. This led to various issues in higher environments where we need to revisit the code and steps followed while promoting them. The changes or coding done during the entire period needs revision which in turn makes the project topsy-turvy. Definitely tough time, right?
So what difference Continuous integration can make life easier??? merging the changes to the main stream frequently in a day by the developer so that the code can be examined by building it.
Why CICD – A closer look!!
To avoid all such confusions, best solution is CICD. CICD is a DevOps practice, if followed religiously with right set of tools, assumptions, implementations and statistics, would make the lifecycle of a software easy and better. In turn, life is easier for every team that works with it (every team member!!! 😊).
CICD stresses on frequent and small commits of code to the main stream and eventually to the higher environments too which makes changes easy to adapt rather than an evolution overnight. CICD has pipeline to perform automated builds and tests. Issues could be found out almost immediately because only working/clean code which is tested thoroughly would be promoted to higher environments.
Bugs can be fixed by the development team in no time because the code is not “too old” when committed and built. Only the last change and build are to be revisited and fixed. It saves a lot of time and quality of the code would be better.
Other teams who work collaboratively like testing team, support team would get the same benefits from CICD. Instead of performing the same steps manually for multiple times, they can be automated.
Testing scripts and steps automation saves lot of time and avoid manual errors. Right set of tools must be chosen and teams must be having the same understanding on the functional and non-functional requirements.
Support team who promotes the code can also automate the processes like preparing archive files, applying environment specific properties, deployment in various environment, monitoring the builds, notifying the teams on failure etc. instead of working on the same steps manually because of someone else’s issue or miss would be tiresome and waste of time.
To avoid it, CICD implementation helps in overcoming all these pitfalls with just the right set of tools.
Criteria consideration for choosing the toolset:
- Continuous integration tool that easily integrates with the chosen repository and IDE
- Open source or licensed, in turn, limitations like individual as well as concurrent or group licenses limitations
- Built in options in CI tool to enable the CICD
- Scripting options the tool offers to automate the processes.
- Status of the deployment and ways of communication about what happened with the process.
Some of the CICD tools that are going to be explored or compared here are as follows:
Some are open source and others give trial versions followed by the purchase of the tool.
|Tools||License||GUI||Platform||Load distribution||OS||Scripts supported||Repository||Latest version|
|Bamboo||Trial license for 30 days||Simple and easy to work with||Java – Oracle JDK, Open JDK||No real load balancing present||Windows, Linux, Solaris, MacOS/OSX||Shell, Windows PowerShell, /bin/sh or cmd.exe
|CVS, Git, Subversion, Perforce, Mercurial||6.8|
|Jenkins||Open source||GUI is little crowded. console is available too||Cross – platform – Java SE||Linux, MacOS, windows, Fedora, OpenIndiana Hipster, Solaris, OmniOS, SmartOS||Ant, Shell scripts, Windows Batch commands||AccuRev, CVS, Subversion, Git, Mercurial, PerforceTD/OMS, ClearCase and RTC||2.173|
|TeamCity||Limited – 100 build configurations (free)||Moderately simple GUI to choose and option are available on left panel||Oracle Java 6-8. JDK 1.8. Open as well as Oracle JDK supported||Multiple agents can be configured on same machine. Recommended process is to run single agent per (virtual) machine to minimize builds cross-influence and making builds more predictable||Windows, Linux, Mac OS X and IBM z/OS, Solaris||Ant 1.6 -1.9, IntelliJ IDEA Project runner, MSBuild, NAnt, FXCop, NuGet, Powershell, CommandLine for shell script, Rake, Xcode||CVS, Git, Mercurial, Subversion, SourceGear and Perforce are fully supported. Limited support to CVS, Vault and ClearCase||9.1|
|TravisCI||Free for open source projects. Fee basis usage for private projects||Accessible GUI||.travis.yml is mandatory pre-requisite. It is written in Python||inability to adjust resources, and resorting to utilizing local machines just to speed up builds make bad load distribution||Windows, macOS, Xenial||In built Build matrix tool||Git, BitBucket, Mercurial||1.7.x|
|GoCD||Open Source||Simple and clean||Cross-Platform||GoCD and TLB – combo deals with load balancing based on ‘Mutual Exclusion’ & ‘Collective Exhaustion’||Linux, Windows, MacOS X||Ant, NAnt, Rake, Command line||Git, Mercurial, SubVersion, Perforce, Team Foundation Server||19.2.0|
|GitLabCI||Open Source||Accessible||OpenSUSE, Debian,Raspbian Stretch||Load distribution is added as feature proposal||Linux, MacOS, Windows||Shell, Docker, Parallels, SSH,||GitHub, BitBucket Cloud||11.10|
|CircleCI||4 Linux containers with no build limits to open source projects. on macOS, CircleCI also offers 500 build minutes per month to open source projects. For others, it is a billed tool||Accessible GUI||Python, Node.js, Ruby, Java, Go||Comparatively good load distribution for paid and free users||Ubuntu, macOS X||Shell scripts||Github, BitBucket||10.1|
|Codeship||Free for 100 builds||Web interface- simple to use||Jet is a prerequisite.||Caching and parallelism govern the builds||Mac OS X, Linux, Windows||SSH, FTP, SFTP, RSYNC, Custom script, Heroku, AWS,
Azure, Digital Ocean, Git Push etc.
|GitHub, GitLab, Bitbucket||11.x|
Continuous Delivery/Continuous Deployment – analysis
Well, will a process have only good things? Lets look into it in depth.
Continuous delivery is to promote the working code to higher environments – non-prod, so that code is always ready for production deployment. “Always ready” sounds fascinating, right?
It makes the main stream code efficient, performance intensive, maintainable, stable etc. and ready for code deployment. It makes the development team confident about the code and agile model is best practiced with CD. As the issues are fixed on time and in shorter duration, it saves time and in turn money. We all know time is money in any industry!!
Some of the barriers that might be faced while following CD could be initial learning curve and training time, installation costs, purchase of licenses, confidence while delivering continuously to the higher environments, getting used to the tools, business continuity while migration to the automated CICD processes, access issues etc. All must be weighed before implementation. It has must happen gradually and seamlessly. If benefits are considered, they are just barriers definitely, not cons.
Continuous deployment is the actual deployment of changes in production continuously or frequently when change is done and tested in lower environments. Most of the organizations who follow CICD performs the first two processes but hesitant to go with the third one due to various reasons which are specific to business and markets.
Why hesitation if it is “all good?”? Some applications or businesses do not want the product to change frequently which will make the customers/clients lose the “touch” or continuity. Ironical! In contrast, some of them like Facebook wants to release the changes rapidly as soon as it is tested and committed. Code deployment makes it possible for them. Production environment could be sensitive for domains like banking, healthcare etc. they might want to gradually introduce changes to the application. If we implement CD – delivery – in some UI application, if it changes daily, it would not leave a good impression on the service provider. Features must be introduced as per the customer needs and the trend in the market or according to the government rule change etc. Customer must be given what he/she needs, not the feature that are developed at first. Features planned in initial sprints might be needed to go later as per the market trend and vice versa. So, intervention might be necessary to plan for certain businesses or applications. Another scenario is if the application/product is evolving or naïve, the product owner might change requirements constantly. This will directly affect this implementation. If it changes, then the look and feel of the product will changed constantly with additional features or some might be rolled back. This might create some negative impression which must be properly balance by controlling it.
Code Quality – Quality code – really matters!!
Oh yes! Now we are aware of few tools available in market. This is not the end of the story! 😉
One more important practice must be followed to get the best out of CICD. That’s code quality! If we implement CICD and all our changes are getting built without failure is not just enough. The code must have the best standards so that maintenance should not become a challenge. Complexity of the code gets bigger when it grows. Now the question is how to avoid code smells from getting to the main stream? Well known answer is testing and code review – static code analysis.
Branching out from main stream is a common process in CI. Quality must be reviewed every time the code is pushed in to the main stream. It must pass the review rules or standards that are defined. This process should be automated for better results. It got a list of tools like the following: SonarQube, SonarLint, Coverity, Klocwork, Checkstyle, FindBugs, Lint, PMD etc. Few of them support review as many languages as 14 – Coverity. Every tool has its own pros and cons. Choosing the tool depends on what to test, when to test and where to test. Few other infrastructure factors like versions, cloud support, repository integration etc. Testing/reviewing must not hit application performance.
Analysis should cover areas like code consistency, nested loops, unclosed loops, syntax check etc. based on standard rules defined for the language. Most issues must be identified in the lower environments so that failing early will save time and money. Continuous feedback after automated testing and reviewing makes the code better because developers can get “enough” time to fix the code and they know the changes freshly. Analyzer can be configured in such a way that tests and reviews run when a check in is attempted. Check in must be proceeded with if review and testing have a pass percentage as 80 % or above.
Feedback on code smells and issues must be addressed before the code reaches main stream which ensures a good quality and reviewed code reaches mainstream. It will help us in maintaining a good code. It is not a nightmare code maintenance challenge anymore but just a quality code!!!
Few Important Terms:
Here are few terms which are very important in understanding CICD i.e. Pipeline, caching, parallelism, job, stage, task etc. They must be discussed to make the most of CICD tools’ features.
We are all familiar with the SDLC which comprises of requirement gathering, design, development, testing, deploy and code promotion to production. Similarly, we have stages in CICD too. Once the development is done and code is committed to repository, CICD takes over and starts the processes such as pulling the change or new commit, building the code, checking build whether successful or failure, taking next action based on it say, notifying persons concerned if failure or proceeding to deployment in servers configured and running automated testing scripts (if configured). Further deployment to higher environments could also be configured if required.
Testing is done as per the test cases configured in CICD tool used. Because of multiple testing, if any issue shows up, the code can be fixed and the same lifecycle repeats in CI tool.
This reduces the risk of fatal errors/issues in higher environments. It helps dev team to fix the code with multiple commits and improve code quality with help of frequent testing of the whole working code.
CICD tool calls this series of processes as pipeline and it is automated.
As the name implies, we must do certain steps parallelly. This saves time and improves the feedback time. Long waiting hours for getting feedback on the sequential testing for a software or code is tiresome and productivity would be hit badly. Instead, breaking the sequence into smaller and manageable chunks of steps and executing them parallelly will save time and improve the feedback time too. This is achieved in CICD tools. Example CircleCI etc.
Caching implies the functionality of loading the cache of the CI tool for reusable contents like libraries and external jars from internet. Few of the CI tools offer caching feature. It makes the pipeline to complete the process faster than the old methods of retrieving common data for every build. It reduces the build time and improves the feedback time. Cache can be loaded and cleared using simple steps and can be done as per the needs of the project. Cache is not a substitute of the environment specific artefacts like properties file. Example: GitLab, Codefresh etc. has caching.
Task, Job and Stage:
Tasks are the most granular component of CICD. While planning the pipeline for a code/software, multiple tasks are to be configured to execute various steps. For steps like performing various tests, multiple tasks can be configured or made. Related tasks are combined to make a job. Pipeline will have multiple jobs to execute in turn jobs will have multiple tasks.
Stage implies different environments where the code or software will be promoted or deployed. There could be many environments for every software. Respective servers will be contacted by the CICD tool, if configured, and deployment will be performed once successfully built and tested. With due permissions and configurations, code would be promoted to higher stages. Every stage will have its environmental properties configured.
To make the most of CICD we need to decide on the right toolset according to the requirements we have. Enable 2.0 – CAR tool is used to compare tools and the result is here.
|License||Open source||Trial license for 30 days||Limited – 100 build configurations (free)||Free for open source projects. Fee basis usage for private projects||Open source||Open source||4 Linux containers with no build limits to open source||Free for 100 builds|
|GUI||GUI is little crowded. console is available too||Simple and easy to work with||Moderately simple GUI to choose and option are available on left panel||Accessible GUI||Simple and clean||Accessible||Accessible GUI||Web interface- simple to use|
|Platform||Cross – platform – Java SE||Java – Oracle JDK, Open JDK||Oracle Java 6-8. JDK 1.8. Open as well as Oracle JDK supported||.travis.yml is mandatory pre-requisite. It is written in Python||Cross-Platform||OpenSUSE, Debian,Raspbian Stretch||Python, Node.js, Ruby, Java, Go||Jet is a prerequisite|
|Load Distribution||NA||No real load balancing present||Multiple agents can be configured on same machine. Recommended process is to run single agent per (virtual) machine to minimize builds cross-influence and making builds more predictable||inability to adjust resources, and resorting to utilizing local machines just to speed up builds make bad load distribution||GoCD and TLB – combo deals with load balancing based on ‘Mutual Exclusion’ & ‘Collective Exhaustion’||Load distribution is added as feature proposal||Comparatively good load distribution for paid and free users||Caching and parallelism govern the builds|
|OS||Linux, MacOS, windows, Fedora, OpenIndiana Hipster, Solaris, OmniOS, SmartOS||Windows, Linux, Solaris, MacOS/OSX||Windows, Linux, Mac OS X and IBM z/OS, Solaris||Windows, macOS, Xenial||Linux, Windows, MacOS X||Linux, MacOS, Windows||Ubuntu, macOS X||Mac OS X, Linux, Windows|
|Support for scripts||Ant, Shell scripts, Windows Batch commands||Shell, Windows PowerShell, /bin/sh or cmd.exe||Ant 1.6 -1.9, IntelliJ IDEA Project runner, MSBuild, NAnt, FXCop, NuGet, Powershell, CommandLine for shell script, Rake, Xcode||In built Build matrix tool||Ant, NAnt, Rake, Command line||Shell, Docker, Parallels, SSH||Shell scripts||SSH, FTP, SFTP, RSYNC, Custom script, Heroku, AWS,|
|Repository integration||AccuRev, CVS, Subversion, Git, Mercurial, PerforceTD/OMS, ClearCase and RTC||CVS, Git, Subversion, Perforce, Mercurial||CVS, Git, Mercurial, Subversion, SourceGear and Perforce are fully supported. Limited support to CVS, Vault and ClearCase||Git, BitBucket, Mercurial||Git, Mercurial, SubVersion, Perforce, Team Foundation Server||GitHub, BitBucket Cloud||Github, BitBucket||GitHub, GitLab, Bitbucket|
Conclusion of CAR analysis:
By comparing with few tools, we select Jenkins, Bamboo or Teamcity as our tools because it provide the following benefits:
1. Jenkins/Bamboo/Teamcity integrates with tools easily based on the supporting OS, repository supported and OS.
2. Many types of build scripts are supported.
3. Various Platforms must be supported
Once it is implemented, right practice will make the project lifecycle better and easier with lots of improvement in deliverable code quality. End of the day, quality deliverable matters!!!