Azure Pipeline Creator
A specialized skill for Azure Pipeline Creator. Install this skill to enhance Claude's capabilities in this area.
Description
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 деплои для безопасности продакшена
- Кэшируйте зависимости для улучшения производительности пайплайна
- Используйте условия и зависимости для эффективного контроля потока пайплайна
- Включайте деплой инфраструктуры как часть вашего пайплайна, когда это применимо
- Настройте мониторинг и оповещения для состояния пайплайна и успешности деплоя