Software application delivery is a complex and time-consuming undertaking. The disjoint functioning of various teams often leads to long release cycles that not only affect the quality of the application but also increase the overall cost of delivery. Add to it the need to constantly incorporate new and improved features to meet the evolving needs of the market.
Complex applications with multiple components involve integration at multiple levels leading to layered Continuous Integration (CI) implementations. CI is an initial step towards successful Continuous Delivery or DevOps implementation. It aims at integrating the efforts of multiple developers early and often in the life cycle. When integration is done frequently, the end result is faster feedback loops, quick and early detection of issues, and improved quality and testability.
What’s more, CI contributes to :
· Smoother integration process
· Regular working releases
· Better visibility and transparency
· Constant availability of a build for testing, demo, or release purposes
· Reduced chaos at release date
· Frequent code check-in results in less complex code
· Quicker time-to-market
· Fully automated builds
· Integration across the product lifecycle
Levels of CI
For any software product (/application), internally, there could be multiple projects running in parallel; there could also be multiple product versions released to the users, which need to be supported. Getting exposure at the project as well as application level is extremely important to ensure efforts are directed in the right direction.
CI needs to be carried out at different levels:
Developer level integration: Developer’s story level integration helps in continuously validating the developer’s code and its compatibility with the mainstream/parent branch. Every commit/push done by the developer on his respective branch will be built and unit tested to provide feedback to the developers. This way, issues get detected and fixed early. With every developer branch built on every change, CI at this level helps in smooth integrations at component and system levels.
Component level integration: Every software application is made of several distinct components that need to work well by themselves, as well as in relation to one another. Since software components may be specified at different times by different specification teams, their functionalities may be dependent on each other. Component-level integration makes sure that all the pieces work well together in tandem. It also plays a vital role in finding bugs at the component level. Any bugs that go undetected at this stage can result in more significant issues at the product or system level – which are very difficult to identify and rectify.
System-level integration: For developing a good quality software application, it is essential that all the sub-systems and sub-modules are brought together to work as one single system and the overall system is able to deliver the overarching functionality. System-level integration focuses on detecting the regression and system level issues while increasing the value to the end customer through improved quality and performance. At the same time, it helps in reducing operational costs and improving response times. System-level integration can either be achieved by integrating subsystems according to their functionality, integrating each subsystem to each of the remaining subsystems or dedicating a single subsystem to communicate between other subsystems.
The fine line between CI and CD
While the primary goal of CI is to make the process of integration a simple, easily-repeatable task to reduce overall build costs and reveal defects early in the cycle. The primary goal of CD (Continuous Deployment) is to keep the software build deployable at any point; it aims to deploy software in quick iterations so new features can be delivered quickly, safely and reliably.
While CI drives developers to carry out integration sooner and more frequently, rather than at once in the end, CD involves automating every step for quick build delivery. Having said that, the line between CI and CD is extremely thin. Both CI and CD embody a common culture, a set of operating principles, and practices that allow development teams to deliver code changes more frequently, and reliably. For organizations looking to set themselves apart, it is essential for them to embrace CI and CD in equal measures and enable frequent delivery of good-quality software at reduced costs.
What is your experience of adopting CI in your application development? What challenges did you face?