Azure Pipelines is like GitHub Actions except it doesn't make you want to punch a hole in the wall when you need Windows builds. You write YAML files, Microsoft runs them. No more Jenkins dying at 2am or wondering why your self-hosted agent decided to take a vacation.
The Agent Situation - Microsoft-Hosted vs Self-Hosted
Microsoft-hosted agents work fine until you need something weird installed. You get Ubuntu, Windows Server, and macOS VMs that wipe clean after each job. My Selenium tests kept timing out around 6 hours because testing every browser combination takes forever.
What pisses me off:
- Windows agents take 3-5 minutes to boot while Linux is ready in 30 seconds
- Can't SSH in when everything breaks - you get logs and that's it
- Limited to whatever Microsoft decided to install (fuck you and your niche Python library)
- 6-hour timeout is per job, not pipeline - learned this when our integration tests hit 4 hours
Self-hosted agents let you install whatever you want and keep state between builds. But then you're back to patching VMs and cleaning up disk space like it's 2015.
YAML Pipelines - Where The Real Power Lives
The visual designer is fine for basic stuff, but YAML is where you actually get work done. Pipeline files live in your repo as .azure-pipelines.yml
and version with your code.
What will ruin your week:
- YAML spacing errors - spent 3 hours debugging because one fucking invisible character was wrong
- Template inheritance that works in dev then shits the bed in production
- Variable scoping is broken by design - stage variables don't cross job boundaries, discovered this at 2am
- Parallel job costs - our bill jumped from $40 to $200 when someone added Windows and Mac builds
## This actually works, unlike most documentation examples
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
steps:
- script: |
npm install
npm run build
npm test
displayName: 'Build and test'
Platform Support - The Good and The Ugly
Azure Pipelines handles most dev stacks, but some are way smoother than others:
What doesn't make you cry:
- .NET apps - Microsoft's own stuff, they can't completely break this
- Node.js - npm/yarn support is decent, caching works most of the time
- Docker - integrates okay with Azure Container Registry when it's not having a bad day
- Python - works fine, pip caching actually saves time
What makes you question your life choices:
- Ruby - works but you can tell Microsoft doesn't give a shit
- iOS builds - macOS agents cost more than your car payment and boot slower than Windows Vista
- Anything niche - hope you're good at bash scripting
The Azure Container Registry thing is decent - push to ACR, deploy to AKS, and it usually works. Multi-stage builds are fine once you decode Microsoft's YAML syntax.
Enterprise Features That Don't Suck
RBAC is decent once you decipher Microsoft's permission matrix. You can control who approves deployments, edits pipelines, or touches environments.
Deployment gates and approvals pause deployments for manual checks or tests. Good for compliance, terrible for velocity if you overdo it.
Audit logging captures everything - and I mean everything. Every click gets logged, which compliance loves but creates mountains of useless data.