CI/CD and It's best Practices
Tags: devops, jenkins, agile, cicd
Published: 2020-09-01 13:17:45

Continuous Integration, Delivery, and Deployment known collectively as CI/CD is a very common buzzword in IT Industry. It is an integral part of modern development intended to reduce errors during integration while increasing productivity.
So now we know that CI/CD is so important let's understand what it is:
**CI (Continuous Integration)**
This is a practice followed by the developers to merge their code changes in the master repository as often as possible. 
The change is then validated by automated build and Test Cases.  This avoids the integration blunder that usually happens when people wait for release day to merge their changes into the release branch.
Continuous integration puts a great emphasis on Automation testing to check that the application is not broken whenever new commits are integrated into the main branch.


**Continuous Delivery**
Continuous Delivery makes sure that the release can be made in Production after Testing. This means that Continuous delivery is not only about automated testing but also an automated release process that deploys your application at any point in time by clicking on a button.
If you truly want to get the benefits of continuous delivery, you should deploy to production as early as possible to make sure that you release small batches that are easy to troubleshoot in case of a problem.

**Continuous Deployment**
Continuous Deployment is a step ahead of Continuos delivery. With this practice, every change that passes all stages of the production pipeline is released to the customers. every step is automated and only a failed test will prevent a new change to be deployed to production.
The entire CI/CD process is a boon for business

So now we know that CI/CD can help the developers a lot and they can now focus on important agenda instead of bugging on release day. Successful implementation of CI/CD is required to get the best out of it and hence it is important to follow the best CI/CD practices. 

Here are some of the mandatory practices to follow in CI/CD for the best result:

**1. Securing and isolating the CI/CD environment**

In this era where security threats can lead to a massive reputation and financial losses to businesses. Stressing on the importance of security is very important. Since the CI/CD system offers access to the codebase and credentials to deploy in various environments, it is often the prime target. Shielding all external access to the servers and tightly controlling the types of internal access allowed will help reduce the risk of your CI/CD system being compromised.

**2. Commit daily and reduce branching in the Version Control**

Committing changes daily can make integration with the master branch really easier. This can save a massive amount of time invested in Version Control.

**3. Run Tests Locally Before Committing to the CI/CD Pipeline**

Discovering failures early is an important criterion. Changes must be tested in the Dev environment thoroughly before finally committing to the PROD environment. The local developer environment should have the entire test cases as in the production environment.

To ensure that developers can test effectively on their own, the testing environment should be runnable with a single command that can be run from any environment. This is often achieved by providing a shell script or makefile to automate running the testing tools.

**4. Keep the Pipelines Fast**

CI/CD pipelines help changes through automated testing cycles, UAT environments, and finally to production. The testing Pipeline must be more comprehensive to avoid unforeseen situations in production deployment. Since all the change must go through this process, keeping the pipelines fast is incredibly important to not inhibit development speed.

Now how can we speed up the process in the  Pipeline?
Steps that you can take to improve speed are scaling CI/CD infrastructure and optimizing tests. 

Two broad categories of tests that can be automated are:

Tests that are executed on a frequent basis 
If such tests are executed ‘manually’ by testers, it may be prone to errors since the productivity may reduce as the testers have to execute the same test multiple times in a day. Hence Automating these Test cases can definitely boost up the Deployment.

Tests that require knowledge & have the dependency on a specific set of testers
Dependency on a developers/testers that only have the domain knowledge required for test execution can be risky during a critical phase of the project. Their absence can impact the overall project deliverables. Such situations can be avoided by incorporating test automation in the CI/CD pipeline, so that project deadlines are not adversely affected

There could be many other scenarios where automation testing can be used and the intent should be to make use of tools & test platforms (which are scalable) that can help you to achieve the required goal.

**5. Decide which processes and tests to automate first**

In many projects that when it comes to testing automation for CI/CD pipeline, we often forget to prioritize our test case in a systematic approach. Here is what I mean! As a best practice of CI/CD, it is always recommended to execute your smaller and simple test cases before your long and complex ones.

This way you could be sure of individual test case coverage and performance with respect to functionality testing in an isolated manner. Complex test cases where you design test cases to check the interaction between multiple modules can come later!

PS: Hope this article is useful. Feel free to add Valuable points!