How to increase throughput of your engineering teams?

Continuous Integration and Delivery - Automate! Automate everything!
CI/CD - High frequency value delivery
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 (and in many cases should!) be eliminated.
What is possible via Continuous Integration and Delivery?
Let me showcase few scenarios from our past projects:
Build new release
Weather it is by simple replacing content at AWS S3 for static website or package a FastAPI backend application into Docker container, publish it in docker registry and prepare a new Helm chart
Trigger upstream dependencies testing
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
App packaging for further distribution
Using a wide range of build systems (bazel, ant, maven, gradle, cmake/ninja, … you name it!) to prepare new artifacts at pypi, artifactory or helm charts
Validate UI layout of Web or mobile app
Create a screenshots of specific widgets and compare it with what it expected to be for specific data - run so called Snapshot or Golden tests
Distributed test builds to QA
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 deployment
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
Infrastructure provisioning
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
Performance and regression testing
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
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:
1
it should be fast — to save human’s time
2
It should automate all manual routine — to avoid human errors
3
it should standardize release process — and serve as a living documentation
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
  • Keep track of 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 to all or to only a portion of users— whether it is to staging or QA environment, publish it to artifactory or directly into appstore. Simple Github release with tag do the magic as well!
CI/CD can elevate your team performance!
How to increase deploy frequency? How organise robust and stable build pipeline? How to integrate changes often without breaking the build in complex systems?
Made on
Tilda