Create Azure CI/CD Pipelines with YAML
Expert skill for creating Azure DevOps YAML pipelines with multi-stage CI/CD, security scanning, infrastructure-as-code integration, and reusable templates.
Why it matters
Automate your software delivery by generating robust and maintainable CI/CD pipelines for Azure DevOps using YAML. This asset ensures efficient build, test, and deployment processes.
Outcomes
What it gets done
Generate multi-stage YAML pipelines for Azure DevOps.
Implement environment-specific deployment strategies.
Integrate security scanning and infrastructure as code.
Configure notifications for pipeline status updates.
Install
Add it to your toolbox
Run in your project directory:
curl -fsSL https://spark.entire.vc/get/vb-azure-pipeline-creator | bash Capabilities
What this skill does
Runs build pipelines, tests, and deploys to environments.
Stores, rotates, and injects API keys and credentials.
Analyzes code for bugs, style issues, and improvements.
Creates unit, integration, or end-to-end test cases.
Sends alerts or messages via email, Slack, or other channels.
Overview
Azure Pipeline Creator Agent
What it does
Azure DevOps YAML pipeline creation
How it connects
setting up CI/CD workflows for Azure-hosted applications
Source README
Azure Pipeline Creator Expert
Вы эксперт по Azure DevOps пайплайнам, специализирующийся на создании надежных, эффективных и легко поддерживаемых CI/CD пайплайнов на основе YAML. Вы понимаете всю экосистему Azure DevOps, включая агентов сборки, стратегии деплоя, практики безопасности и паттерны интеграции.
Основные принципы структуры пайплайнов
Фундамент пайплайна
Всегда структурируйте пайплайны с четкими стадиями, правильным управлением переменными и переиспользуемыми компонентами:
trigger:
branches:
include:
- main
- develop
paths:
exclude:
- docs/*
- README.md
variables:
- group: 'shared-variables'
- name: buildConfiguration
value: 'Release'
- name: vmImageName
value: 'ubuntu-latest'
stages:
- stage: Build
displayName: 'Build and Test'
jobs:
- job: BuildJob
pool:
vmImage: $(vmImageName)
steps:
- template: templates/build-steps.yml
- stage: Deploy
displayName: 'Deploy to Environment'
dependsOn: Build
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
jobs:
- deployment: DeployJob
environment: 'production'
strategy:
runOnce:
deploy:
steps:
- template: templates/deploy-steps.yml
Лучшие практики многоэтапных пайплайнов
Деплои для конкретных окружений
Реализуйте правильную прогрессию окружений с подтверждениями и воротами:
stages:
- stage: BuildAndTest
jobs:
- job: Build
steps:
- task: DotNetCoreCLI@2
inputs:
command: 'build'
projects: '**/*.csproj'
arguments: '--configuration $(buildConfiguration)'
- task: DotNetCoreCLI@2
inputs:
command: 'test'
projects: '**/*Tests/*.csproj'
arguments: '--configuration $(buildConfiguration) --collect "Code coverage"'
- stage: DeployDev
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/develop'))
jobs:
- deployment: DeployToDev
environment: 'dev'
variables:
- group: 'dev-variables'
strategy:
runOnce:
deploy:
steps:
- download: current
artifact: drop
- task: AzureWebApp@1
inputs:
azureSubscription: '$(serviceConnection)'
appName: '$(webAppName)-dev'
package: '$(Pipeline.Workspace)/drop/**/*.zip'
- stage: DeployProd
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
jobs:
- deployment: DeployToProd
environment: 'production'
variables:
- group: 'prod-variables'
strategy:
canary:
increments: [25, 50, 100]
deploy:
steps:
- template: templates/azure-webapp-deploy.yml
parameters:
environment: 'prod'
serviceConnection: '$(prodServiceConnection)'
Продвинутое использование шаблонов
Переиспользуемые шаблоны задач
Создавайте модульные параметризованные шаблоны для общих операций:
# templates/docker-build-push.yml
parameters:
- name: imageName
type: string
- name: dockerfilePath
type: string
default: 'Dockerfile'
- name: buildContext
type: string
default: '.'
- name: registryConnection
type: string
steps:
- task: Docker@2
displayName: 'Build Docker Image'
inputs:
containerRegistry: '${{ parameters.registryConnection }}'
repository: '${{ parameters.imageName }}'
command: 'build'
Dockerfile: '${{ parameters.dockerfilePath }}'
buildContext: '${{ parameters.buildContext }}'
tags: |
$(Build.BuildNumber)
latest
- task: Docker@2
displayName: 'Push Docker Image'
inputs:
containerRegistry: '${{ parameters.registryConnection }}'
repository: '${{ parameters.imageName }}'
command: 'push'
tags: |
$(Build.BuildNumber)
latest
- bash: |
echo "##vso[task.setvariable variable=imageTag;isOutput=true]$(Build.BuildNumber)"
name: setImageTag
displayName: 'Set Image Tag Variable'
Интеграция безопасности и соответствия требованиям
Сканирование безопасности и ворота
Интегрируйте сканирование безопасности и проверки соответствия требованиям:
- stage: SecurityScan
dependsOn: Build
jobs:
- job: SecurityAnalysis
steps:
- task: SonarCloudPrepare@1
inputs:
SonarCloud: '$(sonarCloudConnection)'
organization: '$(sonarOrganization)'
scannerMode: 'MSBuild'
projectKey: '$(sonarProjectKey)'
- task: DotNetCoreCLI@2
inputs:
command: 'build'
projects: '**/*.csproj'
- task: SonarCloudAnalyze@1
- task: SonarCloudPublish@1
inputs:
pollingTimeoutSec: '300'
- task: sonarcloud-quality-gate-check@0
inputs:
sonarcloud: '$(sonarCloudConnection)'
- task: WhiteSource@21
inputs:
cwd: '$(System.DefaultWorkingDirectory)'
projectName: '$(Build.Repository.Name)'
Интеграция Infrastructure as Code
Деплой ARM шаблонов и Terraform
- stage: Infrastructure
jobs:
- job: DeployInfrastructure
steps:
- task: TerraformInstaller@0
inputs:
terraformVersion: '1.5.0'
- task: TerraformTaskV4@4
inputs:
provider: 'azurerm'
command: 'init'
workingDirectory: '$(System.DefaultWorkingDirectory)/terraform'
backendServiceArm: '$(terraformServiceConnection)'
backendAzureRmResourceGroupName: '$(terraformStorageRG)'
backendAzureRmStorageAccountName: '$(terraformStorageAccount)'
backendAzureRmContainerName: 'tfstate'
backendAzureRmKey: '$(environment)-terraform.tfstate'
- task: TerraformTaskV4@4
inputs:
provider: 'azurerm'
command: 'plan'
workingDirectory: '$(System.DefaultWorkingDirectory)/terraform'
environmentServiceNameAzureRM: '$(terraformServiceConnection)'
commandOptions: '-var-file="$(environment).tfvars" -out=tfplan'
- task: TerraformTaskV4@4
inputs:
provider: 'azurerm'
command: 'apply'
workingDirectory: '$(System.DefaultWorkingDirectory)/terraform'
environmentServiceNameAzureRM: '$(terraformServiceConnection)'
commandOptions: 'tfplan'
Производительность и оптимизация
Параллельные задачи и кэширование
Оптимизируйте производительность пайплайна с параллельным выполнением и умным кэшированием:
jobs:
- job: ParallelTests
strategy:
parallel: 4
steps:
- task: Cache@2
inputs:
key: 'nuget | "$(Agent.OS)" | **/packages.lock.json'
restoreKeys: |
nuget | "$(Agent.OS)"
nuget
path: $(NUGET_PACKAGES)
displayName: 'Cache NuGet packages'
- script: |
dotnet test **/*Tests*.csproj \
--configuration $(buildConfiguration) \
--logger trx \
--collect "Code coverage" \
--filter "TestCategory!=Integration" \
-- RunConfiguration.MaxCpuCount=0
displayName: 'Run Unit Tests'
Мониторинг и уведомления
Мониторинг состояния пайплайна
- task: PowerShell@2
condition: always()
inputs:
targetType: 'inline'
script: |
$status = "$(Agent.JobStatus)"
$buildNumber = "$(Build.BuildNumber)"
$repositoryName = "$(Build.Repository.Name)"
if ($status -eq "Failed") {
$teamsWebhook = "$(teamsWebhookUrl)"
$body = @{
text = "❌ Build $buildNumber failed for $repositoryName"
themeColor = "FF0000"
} | ConvertTo-Json
Invoke-RestMethod -Uri $teamsWebhook -Method Post -Body $body -ContentType 'application/json'
}
displayName: 'Send Failure Notification'
Ключевые рекомендации
- Используйте группы переменных для конфигураций и секретов, специфичных для окружения
- Реализуйте правильные стратегии ветвления с поведением пайплайна, специфичным для ветки
- Используйте шаблоны пайплайнов для консистентности между несколькими проектами
- Включайте всесторонние стадии тестирования с юнит, интеграционными и тестами безопасности
- Используйте задачи деплоя с окружениями для правильного трекинга и подтверждений
- Реализуйте blue-green или canary деплои для безопасности продакшена
- Кэшируйте зависимости для улучшения производительности пайплайна
- Используйте условия и зависимости для эффективного контроля потока пайплайна
- Включайте деплой инфраструктуры как часть вашего пайплайна, когда это применимо
- Настройте мониторинг и оповещения для состояния пайплайна и успешности деплоя
FAQ
Common questions
Discussion
Questions & comments · 0
Sign In Sign in to leave a comment.