How to Develop and Test Software with Continuous Integration (CI)

ProfilePicture of Andres Canal
Andres Canal
Senior Full-stack Mobile Developer
A line of boxes integrating more components in each box

Have you ever experienced the frustration of cloning a repository and encountering a litany of errors, from missing files to compiler warnings? Working on a new project is already challenging enough, with new tools, code, and logic to learn, and adding a broken build on top of that only creates further complexity for newcomers.

Thankfully, there are several solutions to address this issue, ranging from the inexpensive readme.txt file to the more complex but efficient Continuous Integration (CI) solution. In this article, we’ll focus on the latter and explore its benefits.

While setting up a CI solution can be complex, the benefits are worth the investment for any development team. Smoother development processes, early bug detection, and increased code quality are just a few of the benefits that a well-designed CI solution can provide.

Table Of Contents

What is Continuous Integration (CI)?

Continuous Integration is a development practice that involves integrating code changes into a codebase multiple times a day. A typical Continuous Integration process may look like the following:

Diagram of Continuous Integration steps.

Logically, we start by making any desired changes to the code. Once done, we run Unit Tests on this new code. If these tests complete successfully, we can move to the final step: Integration. This is where we merge the newly tested code into the codebase, and optionally create a new build or deploy the code to a staging environment.

How Continuous Integration Makes Testing More Efficient

Implementing Continuous Integration in your development workflow can be incredibly efficient for several reasons. First and foremost, it significantly reduces the likelihood of broken code reaching the main codebase and causing your project to become non-functional.

CI also enables you to identify problems as soon as they occur, and it alerts the entire team of any errors. This means that when something fails, everyone is aware of the issue and can work together to fix it promptly. Additionally, this scenario removes the excuse of “I didn’t know it was broken.”

Moreover, the configuration of the CI acts as comprehensive documentation, allowing any developer or QA engineer on the project to dive into the history of the project and understand how the build process works. This level of documentation provides the team with greater transparency, enabling them to collaborate better and work more efficiently.

The differences Between Continuous Delivery and Continuous Deployment

Continuous Delivery takes the Continuous Integration process to the next level, adding an essential feature. It allows While Continuous Delivery involves deploying changes to production with a manual step, such as the tap of a button, Continuous Deployment goes one step further, allowing for a fully automated process.

Diagram of Continuous Delivery steps.

Once code changes pass the automated tests in the CI process, they can be deployed to production immediately using Continuous Delivery. This approach streamlines the release process, making it faster, more efficient, and less prone to errors. Additionally, anyone on the team can deploy changes, including project managers, testers, and product owners, since there are no dev-only procedures.

In contrast, Continuous Deployment eliminates the need for manual intervention entirely, and every step of the release process is automated. While this approach offers the ultimate in efficiency and speed, it may not be suitable for every team or project.

The following diagram illustrates the steps involved in Continuous Delivery.

Diagram of Continuous Deployment steps.

Choosing Continuous Integration, Continuous Delivery or Continous Deployment

When choosing between Continuous Integration, Continuous Delivery, and Continuous Deployment, it is essential to understand their differences and select the best approach for your project. Starting with the CI process and progressing from there is a good idea. It also makes sense to use Continuous Deployment for web projects since users won’t notice, and they will always have the latest version of your code running.

However, if your product is an iOS or Android app, automatic deployment may not be a good idea as it may annoy users with multiple updates per week. In such cases, releasing one automatic update every week, as Facebook and other leading apps do, is a perfect compromise between keeping an app updated and providing a good user experience.

When to use continuous integration vs continuous delivery and deployment for web and mobile projects.

When to Use Continuous Integration with Your Team

A few factors play into this decision:

  • Budget
  • Lead Time
  • Experience
Three factors to consider before choosing continuous integration for your project: budget, lead time and experience

Prepare for a Significant Initial Investment

Continuous Integration can be advantageous for small, ongoing projects. While implementing CI requires a substantial initial investment, its automation features save time and money with each new build. Avoiding the initial investment may result in technical debt, which occurs when perceived time savings early on lead to more complex daily processes later.

With Continuous Integration properly set up, tasks such as “make a new build” and “get the latest version deployed to staging” are eliminated, as builds are continuously available and automatically deployed to staging. These time savings, though seemingly minor, accumulate over time.

Have Enough Lead Time

Projects with short timelines may not be ideal candidates for implementing Continuous Integration, given the initial time investment required to set it up. In general, projects that are expected to last at least a few months or require regular updates and improvements are better suited for CI implementation. This allows the team to fully realize the benefits of CI in terms of time and resource savings, as well as improved collaboration and code quality.

Assess Your Team’s Experience

Setting up a Continuous Integration process requires a specific skill set, including knowledge of CI tools, version control systems, and automated testing. Consider whether your team has the necessary expertise, or if you need to hire someone with these skills.

When evaluating your team’s expertise, take into account the learning curve associated with CI tools and best practices. You may need to invest in training or workshops to help your team become proficient in these areas. If hiring a new team member, consider looking for candidates with prior experience in CI implementation and familiarity with relevant tools and processes.

This does not need to be a daunting task; at Scalable Path, we can often find and integrate professionals into your team in less than a week. By ensuring your team has the right expertise, you can set your project up for success and maximize the benefits of implementing Continuous Integration.

Improving Development and Testing in Continuous Integration with Build Machines

The building process should not be dependent on engineering ‘black magic’. For example, specific parameters being sent to the compiler that nobody is aware of, or environmental variables that are only known by one person on the team.

Continuous Integration uses a build machine to resolve this issue. This is a computer, somewhere in the world, waiting for something to trigger the build process when a pull request is created, for example.

It’s not a good idea to have this on a developer’s computer because we want this machine to be “a single source of truth”. In other words, the one location everyone in the company agrees is trusted and correct. To achieve this goal, the build machine should be an independent machine dedicated to this purpose.

I consider a project healthy only if it can be built automatically while passing all the Continuous Integration steps without error.

You can either have your own build machine (onsite or hosted with a cloud provider) or hire a third-party continuous integration platform. There are advantages and disadvantages to both, so let’s take a look at them:

Build machine hosting options for continuous integration: self-hosting, cloud hosting and third-party services.

Self-Hosting

This is the option for those who want full control – and the configurations options are virtually endless – but you also assumSelf-hosting is a great option for those who want full control over their environment and configurations, but it also comes with more risk. There are a variety of factors that could bring down your server, such as power outages, internet downtime, or even a curious pet. If you decide to go with self-hosting, it’s recommended that you use an automation server like Jenkins to streamline the process.

Jenkins pipeline Screenshoot

ourself, which can be time-consuming and complex. It’s important to make sure you have the necessary knowledge and resources to properly maintain your self-hosted environment.

Cloud Hosting

With cloud hosting, you also need to set up a machine and install Jenkins, but in this case, the computer is hosted on a cloud provider’s server. This reduces the risk of downtime from power outages or other similar issues that can happen in your office. Cloud hosting provides scalability, so you can easily increase or decrease your resources as needed. Amazon Web Services (AWS), Google Cloud Platform (GCP), and Microsoft Azure are popular cloud hosting providers that offer Jenkins support.

CI Tools

Third-party services are hassle-free and convenient, but you trade flexibility for peace of mind. These services provide pre-configured Jenkins environments, making it easy to get started quickly. Additionally, many third-party services offer integration with other tools and services, such as GitHub, Slack, and AWS. CircleCI, Travis-CI, and Buddy Build are some popular third-party services to consider. With these services, you pay a monthly or annual fee for the hosting and management of your Jenkins environment.

Final Thoughts: CI’s Benefits for Your Team

Setting up a CI build machine and an automated deployment process may seem like overkill initially, but as your project evolves and your team grows, you will appreciate the time you invested in the initial setup. Not only will it increase team productivity, but it will also give you peace of mind knowing that you are creating a stable, thoroughly tested, and easily deployable product, allowing you to sleep better at night.

Continuous Integration is not just suitable but essential for many projects, not just the likes of Airbnb and Facebook. If you are convinced of its benefits, it is important to note that while implementing Continuous Integration at any stage can be beneficial, it can be more complex to integrate it into an existing project, so be extra diligent with your research.


Key Takeaways

Does continuous integration include testing?

Yes, continuous integration (CI) includes testing as a key component of the development process. Testing is integrated into CI to ensure that code changes don't break the existing functionality of the application. CI ensures that the tests are run automatically each time new code is committed, so developers can catch and fix issues quickly before they become more significant problems.

What are the tests in continuous integration?

In continuous integration, different types of tests can be performed, including unit tests, integration tests, functional tests, and acceptance tests. Unit tests check the individual components of the code, integration tests ensure that multiple components work correctly together, functional tests test the system's functionality, and acceptance tests check if the application meets the stakeholders' requirements.

Why are tests important in the CI workflow?

Tests are essential in the CI workflow because they help detect issues and errors early in the development process. By automating the testing process in CI, developers can identify and fix issues quickly, making the development process more efficient and productive. Additionally, testing helps ensure the code quality and stability of the application, reducing the likelihood of bugs and errors occurring in production.

Looking to hire?

Join our newsletter

Join thousands of subscribers already getting our original articles about software design and development. You will not receive any spam, just great content once a month.

 

Read Next

Browse Our Blog