Oct 2026 · Azure DevOps / Docker / CI/CD
One pipeline, two operating systems
The new platform has to run on Windows Server today, Windows containers next and Linux later. I designed the CI/CD so that none of those moves means rebuilding it.
The platform I work on replaces a system from 2012. Today it runs on Windows Server with IIS. The plan is Windows containers next, then Linux and eventually Kubernetes. Building a deployment setup for each of those stages, and throwing it away at the next one, would have been easy to fall into.
The design
- Modular Azure DevOps YAML templates, so build and deploy steps are defined once and reused.
- Two Dockerfiles side by side, one for Windows and one for Linux, building the same application.
- Images pushed to Artifactory through a service connection, in a separate repository per operating system.
- Immutable tags: every build gets a unique tag that is never overwritten, so what was tested is exactly what ships, and rolling back means redeploying the previous tag.
- Configuration per environment through consistently named appsettings files, selected by the pipeline rather than edited on servers.
Why it matters
The pipelines already support moving from IIS to Windows containers. Switching to Linux images is a change to which Dockerfile and target repository the templates use, not a rewrite. The legacy applications live in other repositories, but they can reuse the same pipeline templates when they are containerised.
What is next
Once the Linux infrastructure is in place, the plan is to deploy to Kubernetes with ArgoCD. That part has not been built yet; the point of the current design is that it will not require starting over.