azure-devops · bagelhole — Claude Code skill: Azure Pipelines CI/CD
A skill that lets your agent write and fix Azure DevOps YAML pipelines: build, test, deploy to Azure. Useful when CI/CD lives in Azure Pipelines.
npx skills add BagelHole/DevOps-Security-Agent-Skills --skill azure-devops -a claude-codeWhat azure-devops does
The skill covers the shape of azure-pipelines.yml: branch, tag and scheduled triggers, stages and jobs, matrix builds across Linux, Windows and macOS, job dependencies. Variables, variable groups, secrets and runtime parameters each get their own section.
Templates come next — job and stage templates with parameters, environment deployments, rolling strategy, approval gates configured in the Azure DevOps UI. For Azure there are ready tasks: AzureWebApp@1, AzureContainerApps@1, KubernetesManifest@0, plus Docker@2 for building and pushing images.
You need an Azure DevOps organization and project, service connections for the target environments, and basic YAML knowledge. Azure deployments also need a subscription. Tasks like AzureWebApp@1 fail without a service connection, since it goes into azureSubscription.
What it helps with
- build a multi-stage build and deploy pipeline
- set up branch, tag and scheduled triggers
- move shared steps into reusable templates
- deploy a container to Azure Container Apps or AKS
- add an approval gate before production
Example prompts for the agent
- write
azure-pipelines.ymlwith Build and Deploy stages for Node 20 - add a matrix build for ubuntu, windows and macos
- set up a production deployment through a service connection
How to install azure-devops
1Skills CLI (Vercel)
npx skills add BagelHole/DevOps-Security-Agent-Skills --skill azure-devops -a claude-code2Manually: put the files in place
~/.claude/skills/azure-devops/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/azure-devops/
1Skills CLI (Vercel)
npx skills add BagelHole/DevOps-Security-Agent-Skills --skill azure-devops -a codex2Manually: put the files in place
.agents/skills/azure-devops/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add BagelHole/DevOps-Security-Agent-Skills --skill azure-devops -a cursor2Manually: put the files in place
.cursor/skills/azure-devops/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install BagelHole/DevOps-Security-Agent-Skills azure-devops2Manually: put the files in place
.github/skills/azure-devops/SKILL.md1Skills CLI (Vercel)
npx skills add BagelHole/DevOps-Security-Agent-Skills --skill azure-devops -a gemini-cli2Platform CLI
gemini skills install https://github.com/BagelHole/DevOps-Security-Agent-Skills --path devops/ci-cd/azure-devopsManually: put the files in place
.devin/skills/azure-devops/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add BagelHole/DevOps-Security-Agent-Skills --skill azure-devops -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about azure-devops
How do I install azure-devops in Claude?
Run npx skills add BagelHole/DevOps-Security-Agent-Skills --skill azure-devops -a claude-code. The skill lands at ~/.claude/skills/azure-devops/SKILL.md.
What does the azure-devops skill do?
It gives the agent a reference for Azure Pipelines: YAML structure, triggers, stages, templates, environment deployments and Azure tasks.
What do I need before using it?
An Azure DevOps organization and project, service connections for the target environments, and basic YAML knowledge. Azure deployments also need a subscription.
Source text
SKILL.md · MIT
---
name: azure-devops
description: Set up Azure Pipelines for CI/CD, configure build and release pipelines, manage Azure DevOps projects, and integrate with Azure services. Use when working with Azure DevOps Services or Server for enterprise DevOps workflows.
license: MIT
metadata:
author: devops-skills
version: "1.0"
---
# Azure DevOps Pipelines
Build, test, and deploy applications using Azure Pipelines with YAML or classic editor.
## When to Use This Skill
Use this skill when:
- Creating CI/CD pipelines in Azure DevOps
- Configuring build and release stages
- Managing Azure DevOps service connections
- Deploying to Azure or other cloud platforms
- Setting up multi-stage YAML pipelines
## Prerequisites
- Azure DevOps organization and project
- Service connections for target environments
- Basic YAML understanding
- Azure subscription (for Azure deployments)
## YAML Pipeline Structure
Create `azure-pipelines.yml` in repository root:
```yaml
trigger:
branches:
include:
- main
- develop
paths:
include:
- src/*
pool:
vmImage: 'ubuntu-latest'
variables:
buildConfiguration: 'Release'
nodeVersion: '20.x'
stages:
- stage: Build
jobs:
- job: BuildJob
steps:
- task: NodeTool@0
inputs:
versionSpec: $(nodeVersion)
- script: |
npm ci
npm run build
displayName: 'Build application'
- publish: $(Build.ArtifactStagingDirectory)
artifact: drop
- stage: Deploy
dependsOn: Build
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
jobs:
- deployment: DeployWeb
environment: 'production'
strategy:
runOnce:
deploy:
steps:
- script: echo Deploying to production
```
## Triggers
### Branch Triggers
```yaml
trigger:
branches:
include:
- main
- release/*
exclude:
- feature/*
tags:
include:
- v*
```
### Pull Request Triggers
```yaml
pr:
branches:
include:
- main
paths:
include:
- src/*
exclude:
- docs/*
```
### Scheduled Triggers
```yaml
schedules:
- cron: '0 2 * * *'
displayName: 'Nightly build'
branches:
include:
- main
always: true
```
## Jobs and Stages
### Parallel Jobs
```yaml
stages:
- stage: Test
jobs:
- job: UnitTests
pool:
vmImage: 'ubuntu-latest'
steps:
- script: npm run test:unit
- job: IntegrationTests
pool:
vmImage: 'ubuntu-latest'
steps:
- script: npm run test:integration
```
### Matrix Strategy
```yaml
jobs:
- job: Build
strategy:
matrix:
linux:
vmImage: 'ubuntu-latest'
windows:
vmImage: 'windows-latest'
mac:
vmImage: 'macos-latest'
pool:
vmImage: $(vmImage)
steps:
- script: npm test
```
### Job Dependencies
```yaml
stages:
- stage: Build
jobs:
- job: A
steps:
- script: echo Job A
- job: B
dependsOn: A
steps:
- script: echo Job B
```
## Variables and Parameters
### Variable Groups
```yaml
variables:
- group: 'production-secrets'
- name: buildConfiguration
value: 'Release'
```
### Runtime Parameters
```yaml
parameters:
- name: environment
displayName: 'Environment'
type: string
default: 'dev'
values:
- dev
- staging
- prod
stages:
- stage: Deploy
variables:
env: ${{ parameters.environment }}
jobs:
- job: Deploy
steps:
- script: echo "Deploying to $(env)"
```
### Secret Variables
```yaml
variables:
- name: mySecret
value: $(SECRET_FROM_PIPELINE) # Set in pipeline settings
steps:
- script: |
echo "Using secret"
./deploy.sh
env:
API_KEY: $(mySecret)
```
## Templates
### Job Template
```yaml
# templates/build-job.yml
parameters:
- name: nodeVersion
default: '20'
jobs:
- job: Build
steps:
- task: NodeTool@0
inputs:
versionSpec: ${{ parameters.nodeVersion }}
- script: npm ci && npm run build
```
### Using Templates
```yaml
# azure-pipelines.yml
stages:
- stage: Build
jobs:
- template: templates/build-job.yml
parameters:
nodeVersion: '20'
```
### Stage Template
```yaml
# templates/deploy-stage.yml
parameters:
- name: environment
type: string
- name: serviceConnection
type: string
stages:
- stage: Deploy_${{ parameters.environment }}
jobs:
- deployment: Deploy
environment: ${{ parameters.environment }}
strategy:
runOnce:
deploy:
steps:
- task: AzureWebApp@1
inputs:
azureSubscription: ${{ parameters.serviceConnection }}
appName: 'myapp-${{ parameters.environment }}'
```
## Deployments
### Environment Deployments
```yaml
stages:
- stage: DeployStaging
jobs:
- deployment: DeployWeb
environment: 'staging'
strategy:
runOnce:
deploy:
steps:
- download: current
artifact: drop
- script: ./deploy.sh staging
```
### Approval Gates
Configure in Azure DevOps UI:
1. Go to Environments
2. Select environment
3. Add approval check
4. Configure approvers
### Rolling Deployment
```yaml
jobs:
- deployment: Deploy
environment: 'production'
strategy:
rolling:
maxParallel: 2
deploy:
steps:
- script: ./deploy.sh
```
## Azure Service Tasks
### Azure Web App Deployment
```yaml
- task: AzureWebApp@1
inputs:
azureSubscription: 'my-azure-connection'
appType: 'webAppLinux'
appName: 'my-web-app'
package: '$(Pipeline.Workspace)/drop/*.zip'
```
### Azure Container Apps
```yaml
- task: AzureContainerApps@1
inputs:
azureSubscription: 'my-azure-connection'
containerAppName: 'my-container-app'
resourceGroup: 'my-rg'
imageToDeploy: 'myregistry.azurecr.io/myapp:$(Build.BuildId)'
```
### Azure Kubernetes Service
```yaml
- task: KubernetesManifest@0
inputs:
action: 'deploy'
kubernetesServiceConnection: 'my-aks-connection'
namespace: 'default'
manifests: |
$(Pipeline.Workspace)/manifests/deployment.yml
$(Pipeline.Workspace)/manifests/service.yml
containers: |
myregistry.azurecr.io/myapp:$(Build.BuildId)
```
## Docker Builds
```yaml
- task: Docker@2
inputs:
containerRegistry: 'my-acr-connection'
repository: 'myapp'
command: 'buildAndPush'
Dockerfile: '**/Dockerfile'
tags: |
$(Build.BuildId)
latest
```
## Self-Hosted Agents
### Install Agent
```bash
# Download agent
mkdir myagent && cd myagent
curl -o vsts-agent.tar.gz https://vstsagentpackage.azureedge.net/agent/3.227.2/vsts-agent-linux-x64-3.227.2.tar.gz
tar zxvf vsts-agent.tar.gz
# Configure
./config.sh --url https://dev.azure.com/myorg --auth pat --token PAT_TOKEN --pool default
# Run as service
sudo ./svc.sh install
sudo ./svc.sh start
```
### Use Self-Hosted Pool
```yaml
pool:
name: 'my-self-hosted-pool'
demands:
- docker
- Agent.OS -equals Linux
```
## Common Issues
### Issue: Service Connection Fails
**Problem**: Cannot authenticate to Azure
**Solution**: Verify service principal permissions, check connection in project settings
### Issue: Artifact Not Found
**Problem**: Download artifact fails
**Solution**: Ensure publish task ran successfully, check artifact name matches
### Issue: Environment Not Found
**Problem**: Deployment to environment fails
**Solution**: Create environment in Pipelines > Environments first
## Best Practices
- Use YAML pipelines over classic editor
- Implement templates for reusable components
- Use variable groups for shared configuration
- Configure environment approvals for production
- Use service connections with minimal permissions
- Implement artifact versioning
- Cache dependencies for faster builds
## Related Skills
- [github-actions](../github-actions/) - GitHub CI/CD alternative
- [terraform-azure](../../../infrastructure/cloud-azure/terraform-azure/) - Azure IaC
- [azure-aks](../../../infrastructure/cloud-azure/azure-aks/) - AKS deployments
© devops-skills · MIT · BagelHole/DevOps-Security-Agent-Skills
Similar skills
Everything for DevOps and infrastructure →azure-devops by other authors comes first.