How to increase throughput of your engineering teams?

Automate! Automate everything!

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

Leave a Reply

Your email address will not be published.