Skill

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.

Works with azure devopsdockerterraformsonarqubewhitesource

91
Spark score
out of 100
Updated 4 months ago
Version 1.0.0
Models

Add to Favorites

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

01

Generate multi-stage YAML pipelines for Azure DevOps.

02

Implement environment-specific deployment strategies.

03

Integrate security scanning and infrastructure as code.

04

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

Deploy / CI

Runs build pipelines, tests, and deploys to environments.

Manage secrets

Stores, rotates, and injects API keys and credentials.

Review code

Analyzes code for bugs, style issues, and improvements.

Write tests

Creates unit, integration, or end-to-end test cases.

Notify

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.