Skip to main content

DevOps and CI/CD

Builds, tests, and deployments that run on their own — so the team can ship often, safely, and without manual steps only one person knows.

Hand-drawn illustration for DevOps and CI/CD

Tools and frameworks we use

  • Azure DevOps Pipelines
  • GitHub Actions
  • Docker
  • docker-compose
  • Azure Container Registry
  • Vercel
  • Fly.io
  • Caddy
  • systemd
  • Xcode and Gradle signing
  • TestFlight
  • Google Play
  • Firebase App Distribution
  • GitVersion
  • SonarQube
  • CodeQL and GitHub Advanced Security
  • Husky and pre-commit
  • Unleash
  • OpenTelemetry
  • Application Insights
  • Grafana
  • Microsoft Teams

DevOps that makes releases boring

When a release needs a checklist, a specific person, and a quiet Friday, it happens less often than it should. We build pipelines that make builds, tests, and deployments run the same way every time. We have worked with hundreds of YAML pipelines and templates in Azure DevOps for a large platform, and with GitHub Actions, Vercel, and Fly.io in smaller projects.

We have also built an internal bot that posts pull request, deployment, and release notifications to Microsoft Teams, so the team can see what is happening without watching several tools.

Choices we make when designing CI/CD pipelines

A pipeline is code the whole team depends on, and it deserves the same care as the application. These are the choices we make most often:

  • Build once, deploy many times. The same artefact or container image is promoted from test to production, rather than rebuilt for each environment.
  • Shared templates over copying. Common build, test, and deployment steps live in versioned templates in Azure DevOps or reusable workflows in GitHub Actions, so an improvement reaches every pipeline at once.
  • Federated identity instead of stored secrets. Workload identity federation with OIDC lets the pipeline sign in to Azure without keys that need rotating.
  • Fast feedback on pull requests. Linting, unit tests, and security scanning run on every change, while heavier integration and load tests run before production.
  • Versions from Git. GitVersion derives the version number from history, so nobody has to remember to bump it.

The goal is that a new service gets a working pipeline by adopting existing templates, not by writing everything from scratch.

CI/CD for apps, services, and your own servers

Mobile apps have their own needs. We automate signing in Xcode and Gradle and distribution to TestFlight, Google Play tracks, and Firebase App Distribution, so testers and users get new versions without manual uploads.

Not everything needs a large cloud platform. For smaller services we run containers on a VPS with Caddy, systemd, backups, and deploy webhooks, or on Fly.io. We also ship our own open source as a Docker image and a StartOS package, so others can run it themselves.

Typical engagements

CI/CD from scratch

We set up builds, tests, and deployments in Azure DevOps or GitHub Actions, with approval before production where needed.

Automated app releases

We automate signing and distribution for iOS and Android, with TestFlight, Google Play tracks, and Firebase App Distribution.

Containers and lean operations

We package services in Docker and run them on Azure, on Fly.io, or on your own VPS with Caddy, systemd, backups, and deploy webhooks.

Quality and visibility

We add code analysis, security scanning, feature flags, and monitoring, so the team can see what is happening and roll out gradually.

Frequently asked questions

Do you use Azure DevOps or GitHub Actions?

Both. We have worked with hundreds of YAML pipelines and templates in Azure DevOps, and use GitHub Actions in many smaller projects. We follow what the team already uses where it works.

Can you automate mobile app releases?

Yes. We set up signing in Xcode and Gradle, versioning with GitVersion, and automatic distribution to TestFlight, Google Play, and Firebase App Distribution.

How do you roll out changes safely?

With automated tests, approval before production, deployment slots, and feature flags in Unleash, so new features can be switched on gradually and off again if needed.

Do we need Kubernetes?

Often not. Many solutions do well on Azure App Service, Container Apps, Fly.io, or a simple VPS. We recommend the simplest setup that covers the need.

How quickly can you start?

Get in touch with a short description of what you need, and we will respond with an assessment of scope and when we can contribute.

Need help with DevOps and CI/CD?

Tell us briefly about the product, the team, or the system. We will respond with a practical suggestion for the next step — a complete delivery, senior capacity in your team, or technical advice.

Your email address and message are used only to respond to your enquiry.

Location
Oslo, Norway