{"id":1659,"date":"2023-10-03T19:19:40","date_gmt":"2023-10-03T19:19:40","guid":{"rendered":"https:\/\/www.aviator.co\/blog\/?p=1659"},"modified":"2025-09-25T13:46:44","modified_gmt":"2025-09-25T13:46:44","slug":"what-is-ci-cd","status":"publish","type":"post","link":"https:\/\/www.aviator.co\/blog\/what-is-ci-cd\/","title":{"rendered":"What is CI\/CD?"},"content":{"rendered":"\n<p>Building software is hard. A developer needs to write the code, test it, build it, and then deploy it to production. Each of these steps is complicated and has a high likelihood of mistakes. CI\/CD is a fantastic way to reduce errors by automating away parts of the development process.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Continuous integration\/Continuous deployment<\/h2>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"574\" src=\"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2023\/10\/cicd-1024x574.jpg\" alt=\"\" class=\"wp-image-1662\" srcset=\"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2023\/10\/cicd-1024x574.jpg 1024w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2023\/10\/cicd-300x168.jpg 300w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2023\/10\/cicd-768x431.jpg 768w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2023\/10\/cicd-1536x861.jpg 1536w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2023\/10\/cicd.jpg 1648w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>If you\u2019re writing software, whether it be a website, an iPhone app, or a low-level library, your steps to production will look something like the below:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img decoding=\"async\" width=\"512\" height=\"54\" src=\"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2023\/10\/image-2.png\" alt=\"steps to production\" class=\"wp-image-3772\" srcset=\"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2023\/10\/image-2.png 512w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2023\/10\/image-2-300x32.png 300w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/figure>\n\n\n\n<p>These steps mean different things to different projects, but every project will involve some form of writing code, testing, building, and deploying.<\/p>\n\n\n\n<p>Continuous integration and continuous deployment (CI\/CD) introduces automation into the software process. Instead of manually running tests, building your software, and deploying it, CI\/CD automates these steps away. Continuous integration automatically builds and tests your software on a regular basis, while continuous deployment will automatically deploy it when certain conditions are met.<\/p>\n\n\n\n<p>CI\/CD often integrates with version control software such as git, allowing you to trigger automated tests and software builds when you commit or create a pull request.<\/p>\n\n\n\n<p>With a CI\/CD tool, your process looks like the following diagram:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh7-rt.googleusercontent.com\/docsz\/AD_4nXcifexr2l7_pb45bLFu3ovsL_yTvWdnjBGOCbvxmEIieqdQhX-7M70r4trUUvbwilvHqL8eLe0CY5wf9qiAVh8FDdMxDux8nyxn7AzsE7_KcatXXMmb5H4SRcL3sK-lXpX8X4HzaFQFf3sMweQ4ZyBq1hF-?key=YUz6huVSNxDLAWGjMDRvc-YK\" alt=\"automated ci cd process \"\/><\/figure>\n\n\n\n<p>To take an example, say you write some code and open a pull request on your repository. Your CI will pick up the new code, test it, and build it. Your CI tool might also show you the test and build status within your pull request. Once you are happy with the code, you will merge the pull request, and your CD tool will pick up the built software and deploy it.<\/p>\n\n\n\n<p>There are lots of tools out there to implement CI\/CD including <a href=\"https:\/\/www.jenkins.io\/\">Jenkins<\/a>, <a href=\"https:\/\/www.travis-ci.com\/\">Travis CI<\/a>, <a href=\"https:\/\/circleci.com\/\">CircleCI<\/a>, <a href=\"https:\/\/www.jetbrains.com\/teamcity\/\">TeamCity,<\/a> and many more. Choosing a tool should be done on a case-by-case basis and will depend on your project, your budget, the previous experience of your team members, and what other tooling you are already using.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/docs.aviator.co\/mergequeue\" target=\"_blank\" rel=\" noreferrer noopener\"><img decoding=\"async\" width=\"1024\" height=\"264\" src=\"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/aviator-mergequeue-blog-documentation-cta-photo-min-1-1024x264.png\" alt=\"MergeQueue CTA\" class=\"wp-image-4921\" srcset=\"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/aviator-mergequeue-blog-documentation-cta-photo-min-1-1024x264.png 1024w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/aviator-mergequeue-blog-documentation-cta-photo-min-1-300x77.png 300w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/aviator-mergequeue-blog-documentation-cta-photo-min-1-768x198.png 768w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/aviator-mergequeue-blog-documentation-cta-photo-min-1-1536x396.png 1536w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2024\/04\/aviator-mergequeue-blog-documentation-cta-photo-min-1.png 1940w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What is the difference between continuous integration and continuous deployment (CI vs CD)?<\/h2>\n\n\n\n<p><strong>Continuous integration (CI)<\/strong> is the automation of the test and build stages in the software lifecycle. A CI system will build your software and run your test suite on some kind of automated trigger. This trigger could be pushing code to a source control repository. For those of you who\u2019ve used GitHub\/GitLab, the usual example is that a CI system will run for every pull\/merge request.<\/p>\n\n\n\n<p><strong>Continuous deployment (CD)<\/strong> is the automation of the deployment stage. This could include copying a binary to a public download URL or copying the build artifacts to your production servers. With continuous deployment, every time a code change builds and passes tests, it gets deployed into production.<\/p>\n\n\n\n<p><strong>Continuous delivery (also CD!)<\/strong> is a subset of continuous deployment. While continuous deployment will automatically deploy when tests pass and the build succeeds, continuous delivery will deploy whenever you choose to deploy. This could either be a manual button press or a regular time period such as once a week.<\/p>\n\n\n\n<p>It is possible for a team to use CI without using CD, however, it\u2019s considered best practice to use both where possible. Generally, teams will first adopt CI, and then once they have confidence in their tests, and CI system will adopt CD.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Advantages of using CI\/CD<\/h2>\n\n\n\n<p>There are many advantages to using CI\/CD when creating software. It\u2019s considered good practice for good reason!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Remove human error<\/h3>\n\n\n\n<p>Humans aren\u2019t as reliable as machines. When people do things, especially boring things that we have to repeat, there\u2019s a good chance that we will make mistakes. When you\u2019re running complicated test, build, or deployment workflows, there are infinite things that could go wrong:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You might forget to run tests before committing<\/li>\n\n\n\n<li>You might forget to pass a flag to your test tool<\/li>\n\n\n\n<li>You could accidentally build a different branch<\/li>\n\n\n\n<li>You could forget that you have local changes in a file important to your software\u2019s build<\/li>\n\n\n\n<li>You might accidentally run a debug build instead of a production build<\/li>\n\n\n\n<li>You could deploy an old version of your software to production<\/li>\n\n\n\n<li>You might deploy to the wrong machine if you have multiple production machines<\/li>\n<\/ul>\n\n\n\n<p>This list might seem long, but it\u2019s by no means exhaustive. People are infinitely creative, including in the problems we make.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Ship fewer bugs<\/h3>\n\n\n\n<p>Having an automated test suite that requires no effort to run encourages people to write more tests. When your software is covered by more tests, it\u2019s more likely that the tests catch any bugs that you introduce.<\/p>\n\n\n\n<p>On top of this, being able to rely on automation to run your tests ensures that tests have been run! When tests have to be run manually, it\u2019s easy to forget to do it.<\/p>\n\n\n\n<p>CI\/CD also makes your tests more visible, which can help to enforce a culture of testing in the team. When a team cares about testing, the software they produce tends to have fewer bugs.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Release more frequently<\/h3>\n\n\n\n<p>Implementing CI\/CD on your software projects helps you ship software faster. There are a few mechanisms behind this.<\/p>\n\n\n\n<p>The first is that CI\/CD increases your team\u2019s trust in the code you write. Seeing a green check mark next to changes that you make is reassuring and allows people to approve changes faster since they don\u2019t have to build and test the changes themselves.<\/p>\n\n\n\n<p>Second, automated feedback is usually faster than manual feedback. Software engineers on your team have multiple hats to wear. They have to gather requirements, write code, and think about test cases, all alongside reviewing other engineers\u2019 code. Having CI automatically run your tests and build is like having an instant basic review every time you push to a branch. This can help catch early bugs and make it more likely that your code passes human review.<\/p>\n\n\n\n<p>Finally, automated deployment processes are much faster and more reliable than manual processes. Traditionally, ops teams would deploy software to production environments using a lengthy manual process. An automated deployment process can be run in seconds\/minutes and completely remove the chance of human error.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Does CI\/CD have disadvantages?<\/h2>\n\n\n\n<p>For the majority of projects, CI\/CD is <strong>overwhelmingly<\/strong> a good thing. As with everything in life, however, there are tradeoffs to setting it up and it\u2019s important to consider them.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">CI\/CD is an investment<\/h3>\n\n\n\n<p>Everything has a cost, and CI\/CD is no exception. Even though many CI\/CD systems are open source and free for commercial use, setting up and maintaining the system brings other costs. For example:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The initial setup takes engineering time<\/li>\n\n\n\n<li>The system will require ongoing maintenance (for example, upgrades and bug fixes) that also takes engineer time<\/li>\n\n\n\n<li>Hosting the system will incur server rental costs, or hardware maintenance costs when run on-prem<\/li>\n<\/ul>\n\n\n\n<p>These costs have to be factored into your decision of whether or not to run a CI\/CD system. When deciding whether CI\/CD is worth it for your use case, you should weigh these costs against the potential costs of a bug in production.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">CI\/CD is not a substitute for having tests<\/h3>\n\n\n\n<p>Tests that run automatically aren\u2019t guaranteed to be good tests or have good coverage of your code. Testing your code well should be a higher priority than implementing CI\/CD and often requires organizational solutions instead of technical solutions.<\/p>\n\n\n\n<p>CI\/CD makes tests more useful by ensuring they gatekeep code changes, however, it doesn\u2019t replace having tests in the first place. Without a good test suite for your code, many of the benefits of CI\/CD don\u2019t apply any more.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">CI\/CD increases friction for large changes<\/h3>\n\n\n\n<p>The newer a codebase is, the more likely it is to undergo large changes. This could include things like rewriting the code in a new language, rewriting the public interface, or architectural changes such as moving between a single monolith and multiple microservices.<\/p>\n\n\n\n<p>Radical changes often mean that your CI\/CD has to change since it\u2019s likely that your test and build process is also changing. This means increased overhead and development time. For a small startup that is likely to go through many of these changes in a short period of time, CI\/CD may be more trouble than it\u2019s worth in the early stages.<\/p>\n\n\n\n<p>The counterpoint to this argument is that CI\/CD can increase trust when radical changes happen. If your codebase dramatically changes, but the integration tests are still passing, then you can be more confident that the code is still working as expected.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>In this article, you learned:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>What CI\/CD does<\/li>\n\n\n\n<li>What the difference is between continuous integration and continuous deployment<\/li>\n\n\n\n<li>The advantages and disadvantages of implementing CI\/CD<\/li>\n<\/ul>\n\n\n\n<p>CI\/CD is a fantastic tool that can dramatically increase the reliability of your project and the speed with which you can deliver new code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><a href=\"https:\/\/www.aviator.co\/\" target=\"_blank\" rel=\"noreferrer noopener\">Aviator<\/a>: Automate your cumbersome processes<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><a href=\"https:\/\/www.aviator.co\/\" target=\"_blank\" rel=\"noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"727\" src=\"https:\/\/blog.aviator.co\/wp-content\/uploads\/2022\/08\/blog-cta-1024x727.png\" alt=\"\" class=\"wp-image-57\" srcset=\"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2022\/08\/blog-cta-1024x727.png 1024w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2022\/08\/blog-cta-300x213.png 300w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2022\/08\/blog-cta-768x545.png 768w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2022\/08\/blog-cta-1536x1090.png 1536w, https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2022\/08\/blog-cta-2048x1454.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Aviator automates tedious developer workflows by managing git Pull Requests (PRs) and continuous integration test (CI) runs to help your team avoid broken builds, streamline cumbersome merge processes, manage cross-PR dependencies, and handle flaky tests while maintaining their security compliance.<\/p>\n\n\n\n<p>There are 4 key components to Aviator:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>MergeQueue<\/strong>&nbsp;\u2013 an automated queue that manages the merging workflow for your GitHub repository to help protect important branches from broken builds. The Aviator bot uses GitHub Labels to identify Pull Requests (PRs) that are ready to be merged, validates CI checks, processes semantic conflicts, and merges the PRs automatically.<\/li>\n\n\n\n<li><strong>ChangeSets<\/strong>&nbsp;\u2013 workflows to synchronize validating and merging multiple PRs within the same repository or multiple repositories. Useful when your team often sees groups of related PRs that need to be merged together, or otherwise treated as a single broader unit of change.<\/li>\n\n\n\n<li><strong>TestDeck<\/strong>&nbsp;\u2013 a tool to automatically detect, take action on, and process results from flaky tests in your CI infrastructure.<\/li>\n\n\n\n<li><strong>Stacked PRs CLI<\/strong>&nbsp;\u2013 a command line tool that helps developers manage cross-PR dependencies. This tool also automates syncing and merging of stacked PRs. Useful when your team wants to promote a culture of smaller, incremental PRs instead of large changes, or when your workflows involve keeping multiple, dependent PRs in sync.<\/li>\n<\/ol>\n\n\n\n<p><a href=\"https:\/\/www.aviator.co\/\" target=\"_blank\" rel=\"noopener\" title=\"\">Try it for free.<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In this article, you\u2019ll learn what CI\/CD is and why you might want to use it in your projects. You\u2019ll see the advantages and disadvantages of using CI\/CD and some examples of CI\/CD software. We\u2019re about to change your software development life\u2026cycle!<\/p>\n","protected":false},"author":2,"featured_media":1662,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[58],"tags":[],"class_list":["post-1659","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-ci-cd-deployment"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":6}},"acf":[],"aioseo_notices":[],"jetpack_featured_media_url":"https:\/\/www.aviator.co\/blog\/wp-content\/uploads\/2023\/10\/cicd.jpg","post_mailing_queue_ids":[],"_links":{"self":[{"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/posts\/1659","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/comments?post=1659"}],"version-history":[{"count":8,"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/posts\/1659\/revisions"}],"predecessor-version":[{"id":4955,"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/posts\/1659\/revisions\/4955"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/media\/1662"}],"wp:attachment":[{"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/media?parent=1659"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/categories?post=1659"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.aviator.co\/blog\/wp-json\/wp\/v2\/tags?post=1659"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}