Time of engineers should be spent on value-added tasks — something that push your business in front of competitors. But if you start asking around — you will be surprised to know that there decent amount of precious engineer’s hours wasted on the last mile code delivery — building and deploying code. Tedious and error-prone part of work that can be eliminated.
Let me showcase few scenario to better align on what is possible via Continuous Integration and Delivery:
Update static websites by replacing content at AWS S3
Push down into inference layer new version of ML model
using a wide range of build systems (bazel, ant, maven, gradle, cmake/ninja, … you name it!) do app packaging for further distribution (pypi, artifactory, helm charts)
Create a screenshots of specific widgets in mobile or web application and compare it with what it expected to be for specific data – validate that layout is not affected — run so called Snapshot or Golden tests
Build prod/dev version of mobile application for Android and iOS platforms via fastlane, using Github Actions and distribute it among QA team
One click manual promoting for mobile apps into appstore and google play – collect from PR titles entries for changelog, generate new screenshots and submit an app for in-store review
Package a FastAPI backend application into Docker container, publish it in docker registry and prepare a new Helm chart
When PR is created with changes in core python library — in addition to base repository checks — trigger auto-tests in all dependent downstream repositories (where core library is defined as dependency) to validate backwards compatibility
Mutate state of infrastructure in cloud (whether it is AWS/GCD/Azure or Digital Ocean) using Terraform —change deployment strategy for Kubernetes cluster from Recreate to Rolling update, choose faster volume type for EC2 instances, deploy new frontend application
Build computer vision C++ library for x86_64 architecture, run tests over test video and images — to validate that core algorithms are not degraded in quality or speed — cross-compile code for several embedded arm based platforms as a self-contained static library
Setup nightly end to end tests — validating business critical scenarios: spin up temporary database, generate data according to curated use cases, create full setup — backend , frontend or mobile (running in emulators or real device on device farm — Saucelabs or Firebase test lab) — and run series of UI tests (Selenium, appium, maestro, patrol) involving various 3rd party providers — Stripe, Zendesk, Getstream or Twillio— in case of errors sending alert into Slack or right away opening a Jira tickets
Formatting, static analysis, checks for committed secrets or huge blobs, vulnerability scans (including in outdated dependencies), auto-versioning — there are endless number of scenarios that can make code’s housekeeping much easier and free the hands of engineers to focus on product.
What is required from CI/CD:
it should be fast — to save human’s time
it should automate all manual routine — to avoid human errors
to document and standardize release process
What good CI/CD can do?
maintain code hygiene— format, lint, detect code smells — automatically discarding something that is not aligned with the team’s convention
maintain an app version number — SemVer or simple increment Build Number — anything that allow to answer simple question — what version of code is used
Run automated tests — such safety nets is crucial aspect of continues and quick changes
Containerisation of application — isolated environment for Docker with versioning, Docker registry to store artifacts, Helm — if app is used in Kubernetes
Build release candidate — different endpoints for staging or production, activated observability, depending ot tech stack — with debug or extended instrumentation for QA, preferably not injecting secrets but implement mechanism to acquire it from environment
Distribute app — whether it is to staging or QA environment, publish it at artifactory or appstore. Simple Github release with tag do the magic as well — rollout to portion of users