Руководство. Создание многоэтапного конвейера с помощью Azure DevOps

Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019

С помощью конвейера Azure DevOps можно разделить процесс CI/CD на этапы, представляющие различные части цикла разработки. Использование многоэтапного конвейера обеспечивает более подробную информацию о процессе развертывания и упрощает интеграцию утверждений и проверка.

В этой статье вы создадите два экземпляра Служба приложений и создадите конвейер YAML с тремя этапами:

В реальном сценарии может потребоваться еще один этап развертывания в рабочей среде в зависимости от процесса DevOps.

Пример кода в этом упражнении предназначен для веб-приложения .NET для притворного пространства игры, которая включает в себя список лидеров для отображения высоких показателей. Вы развернете как разработку, так и промежуточный экземпляр веб-приложения Azure для Linux.

Необходимые компоненты

Вилка проекта

Вилку из следующего примера репозитория на сайте GitHub.

https://github.com/MicrosoftDocs/mslearn-tailspin-spacegame-web-deploy

Создание экземпляров Служба приложений

Прежде чем развернуть конвейер, необходимо сначала создать экземпляр Служба приложений для развертывания. Вы будете использовать Azure CLI для создания экземпляра.

  1. Войдите на портал Azure.

  2. В меню выберите Cloud Shell и интерфейс Bash .

  3. Создайте случайное число, которое делает доменное имя веб-приложения уникальным. Преимущество уникального значения заключается в том, что ваш экземпляр Служба приложений не будет иметь конфликта имен с другими обучающимися, завершив работу с этим руководством.

    webappsuffix=$RANDOM    
    
  4. Откройте командную строку и используйте az group create команду для создания группы ресурсов с именем tailspin-space-game-rg, содержащей все экземпляры Служба приложений. Обновите значение, чтобы использовать ближайший location регион.

    az group create --location eastus --name tailspin-space-game-rg
    
  5. Используйте командную строку для создания плана Служба приложений.

    az appservice plan create \
      --name tailspin-space-game-asp \
      --resource-group tailspin-space-game-rg \
      --sku B1 \
      --is-linux
    
  6. В командной строке создайте два экземпляра Служба приложений, по одному для каждого экземпляра (разработки и промежуточного az webapp create хранения) с помощью команды.

    az webapp create \
      --name tailspin-space-game-web-dev-$webappsuffix \
      --resource-group tailspin-space-game-rg \
      --plan tailspin-space-game-asp \
      --runtime "DOTNET|6.0"
    
    az webapp create \
      --name tailspin-space-game-web-staging-$webappsuffix \
      --resource-group tailspin-space-game-rg \
      --plan tailspin-space-game-asp \
      --runtime "DOTNET|6.0"
    
  7. В командной строке выведите список Служба приложений экземпляров, чтобы убедиться, что они выполняются с az webapp list помощью команды.

    az webapp list \
      --resource-group tailspin-space-game-rg \
      --query "[].{hostName: defaultHostName, state: state}" \
      --output table
    
  8. Скопируйте имена экземпляров Служба приложений, которые будут использоваться в качестве переменных в следующем разделе.

Создание проекта и переменных Azure DevOps

Настройте проект Azure DevOps и конвейер сборки. Вы также добавите переменные для разработки и промежуточный экземпляр.

Конвейер сборки:

  • Включает триггер, который выполняется при изменении кода в ветвь
  • Определяет две переменные и buildConfigurationreleaseBranchName
  • Включает этап с именем Build, который создает веб-приложение.
  • Публикует артефакт, который вы будете использовать на более позднем этапе

Добавление этапа сборки

  1. Войдите в свою организацию Azure DevOps и откройте нужный проект.

  2. Перейдите к конвейерам и выберите "Создать конвейер" или "Создать конвейер" при создании первого конвейера.

  3. Выполните все шаги мастера, выбрав GitHub в качестве расположения исходного кода.

  4. Возможно, вам придется выполнить вход в GitHub. Для этого введите учетные данные GitHub.

  5. Когда появится список репозиториев, выберите свой.

  6. Вы можете перенаправиться на GitHub, чтобы установить приложение Azure Pipelines. В этом случае выберите " Утвердить" и "Установить".

  1. Когда откроется вкладка "Настройка", выберите конвейер начального сервера.

  2. Замените содержимое azure-pipelines.yml этим кодом.

    trigger:
    - '*'
    
    variables:
      buildConfiguration: 'Release'
      releaseBranchName: 'release'
    
    stages:
    - stage: 'Build'
      displayName: 'Build the web application'
      jobs: 
      - job: 'Build'
        displayName: 'Build job'
        pool:
          vmImage: 'ubuntu-20.04'
          demands:
          - npm
    
        variables:
          wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot'
          dotnetSdkVersion: '6.x'
    
        steps:
        - task: UseDotNet@2
          displayName: 'Use .NET SDK $(dotnetSdkVersion)'
          inputs:
            version: '$(dotnetSdkVersion)'
    
        - task: Npm@1
          displayName: 'Run npm install'
          inputs:
            verbose: false
    
        - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)'
          displayName: 'Compile Sass assets'
    
        - task: gulp@1
          displayName: 'Run gulp tasks'
    
        - script: 'echo "$(Build.DefinitionName), $(Build.BuildId), $(Build.BuildNumber)" > buildinfo.txt'
          displayName: 'Write build info'
          workingDirectory: $(wwwrootDir)
    
        - task: DotNetCoreCLI@2
          displayName: 'Restore project dependencies'
          inputs:
            command: 'restore'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Build the project - $(buildConfiguration)'
          inputs:
            command: 'build'
            arguments: '--no-restore --configuration $(buildConfiguration)'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Publish the project - $(buildConfiguration)'
          inputs:
            command: 'publish'
            projects: '**/*.csproj'
            publishWebProjects: false
            arguments: '--no-build --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(buildConfiguration)'
            zipAfterPublish: true
    
        - publish: '$(Build.ArtifactStagingDirectory)'
          artifact: drop
    
  3. Когда будете готовы, выберите Сохранить и запустить.

Добавление переменных экземпляра

  1. В Azure DevOps перейдите в библиотеку Pipelines>.

  2. Выберите и группу переменных.

  3. В разделе "Свойства" добавьте выпуск для имени группы переменных.

  4. Создайте две переменные, чтобы ссылаться на имена разработчиков и промежуточных узлов. Замените значение правильным значением 1234 для экземпляра.

    Имя переменной Пример значения
    WebAppNameDev tailspin-space-game-web-dev-1234
    WebAppNameStaging tailspin-space-game-web-staging-1234
  5. Нажмите кнопку "Сохранить", чтобы сохранить переменные.

Добавление этапа разработки

Затем вы обновите конвейер, чтобы повысить уровень сборки до этапа разработки.

  1. В Azure Pipelines перейдите к конвейерам>Конвейеров.

  2. Выберите "Изменить " в контекстном меню, чтобы изменить конвейер.

    Снимок экрана: пункт меню

  3. Обновление azure-pipelines.yml , чтобы включить этап разработки. На этапе разработки конвейер будет:

    • Запуск при успешном выполнении этапа сборки из-за условия

    • Скачивание артефакта из drop

    • Развертывание в службе приложение Azure с подключением службы Azure Resource Manager

      trigger:
      - '*'
      
      variables:
        buildConfiguration: 'Release'
        releaseBranchName: 'release'
      
      stages:
      - stage: 'Build'
        displayName: 'Build the web application'
        jobs: 
        - job: 'Build'
          displayName: 'Build job'
          pool:
            vmImage: 'ubuntu-20.04'
            demands:
            - npm
      
          variables:
            wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot'
            dotnetSdkVersion: '6.x'
      
          steps:
          - task: UseDotNet@2
            displayName: 'Use .NET SDK $(dotnetSdkVersion)'
            inputs:
              version: '$(dotnetSdkVersion)'
      
          - task: Npm@1
            displayName: 'Run npm install'
            inputs:
              verbose: false
      
          - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)'
            displayName: 'Compile Sass assets'
      
          - task: gulp@1
            displayName: 'Run gulp tasks'
      
          - script: 'echo "$(Build.DefinitionName), $(Build.BuildId), $(Build.BuildNumber)" > buildinfo.txt'
            displayName: 'Write build info'
            workingDirectory: $(wwwrootDir)
      
          - task: DotNetCoreCLI@2
            displayName: 'Restore project dependencies'
            inputs:
              command: 'restore'
              projects: '**/*.csproj'
      
          - task: DotNetCoreCLI@2
            displayName: 'Build the project - $(buildConfiguration)'
            inputs:
              command: 'build'
              arguments: '--no-restore --configuration $(buildConfiguration)'
              projects: '**/*.csproj'
      
          - task: DotNetCoreCLI@2
            displayName: 'Publish the project - $(buildConfiguration)'
            inputs:
              command: 'publish'
              projects: '**/*.csproj'
              publishWebProjects: false
              arguments: '--no-build --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(buildConfiguration)'
              zipAfterPublish: true
      
          - publish: '$(Build.ArtifactStagingDirectory)'
            artifact: drop
      
      - stage: 'Dev'
        displayName: 'Deploy to the dev environment'
        dependsOn: Build
        condition:  succeeded()
        jobs:
        - deployment: Deploy
          pool:
            vmImage: 'ubuntu-20.04'
          environment: dev
          variables:
          - group: Release
          strategy:
            runOnce:
              deploy:
                steps:
                - download: current
                  artifact: drop
                - task: AzureWebApp@1
                  displayName: 'Azure App Service Deploy: website'
                  inputs:
                    azureSubscription: 'your-subscription'
                    appType: 'webAppLinux'
                    appName: '$(WebAppNameDev)'
                    package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
      
  4. Измените AzureWebApp@1 задачу, чтобы использовать подписку.

    1. Выберите Параметры для задачи.

      Снимок экрана: параметр параметров в задаче редактора YAML.

    2. your-subscription Обновите значение подписки Azure, чтобы использовать собственную подписку. Возможно, вам потребуется авторизовать доступ в рамках этого процесса. При возникновении проблемы с авторизацией ресурса в редакторе YAML альтернативный подход заключается в создании подключения к службе.

      Снимок экрана: пункт меню подписки Azure.

    3. Задайте для типа приложения значение Web App в Linux.

    4. Нажмите кнопку "Добавить ", чтобы обновить задачу.

  5. Сохраните и запустите конвейер.

Добавление промежуточного этапа

Наконец, вы продвигаете этап разработки до промежуточного. В отличие от среды разработки, вы хотите иметь больше управления в промежуточной среде, которую вы добавите ручное утверждение.

Создание промежуточной среды

  1. В Azure Pipelines выберите "Среды".

  2. Выберите новую среду.

  3. Создайте новую среду с промежуточным именем , а для ресурса задано значение None.

  4. На странице промежуточной среды выберите Утверждения и проверка.

    Снимок экрана: пункт меню

  5. Выберите Утверждения.

  6. В утверждающих выберите " Добавить пользователей и группы", а затем выберите свою учетную запись.

  7. В инструкциях утверждающих напишите это изменение, когда оно готово к промежуточному выполнению.

  8. Выберите Сохранить.

Добавление нового этапа в конвейер

Вы добавите новый этап в конвейер, Staging включающий утверждение вручную.

  1. Измените файл конвейера и добавьте Staging раздел.

    trigger:
    - '*'
    
    variables:
      buildConfiguration: 'Release'
      releaseBranchName: 'release'
    
    stages:
    - stage: 'Build'
      displayName: 'Build the web application'
      jobs: 
      - job: 'Build'
        displayName: 'Build job'
        pool:
          vmImage: 'ubuntu-20.04'
          demands:
          - npm
    
        variables:
          wwwrootDir: 'Tailspin.SpaceGame.Web/wwwroot'
          dotnetSdkVersion: '6.x'
    
        steps:
        - task: UseDotNet@2
          displayName: 'Use .NET SDK $(dotnetSdkVersion)'
          inputs:
            version: '$(dotnetSdkVersion)'
    
        - task: Npm@1
          displayName: 'Run npm install'
          inputs:
            verbose: false
    
        - script: './node_modules/.bin/node-sass $(wwwrootDir) --output $(wwwrootDir)'
          displayName: 'Compile Sass assets'
    
        - task: gulp@1
          displayName: 'Run gulp tasks'
    
        - script: 'echo "$(Build.DefinitionName), $(Build.BuildId), $(Build.BuildNumber)" > buildinfo.txt'
          displayName: 'Write build info'
          workingDirectory: $(wwwrootDir)
    
        - task: DotNetCoreCLI@2
          displayName: 'Restore project dependencies'
          inputs:
            command: 'restore'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Build the project - $(buildConfiguration)'
          inputs:
            command: 'build'
            arguments: '--no-restore --configuration $(buildConfiguration)'
            projects: '**/*.csproj'
    
        - task: DotNetCoreCLI@2
          displayName: 'Publish the project - $(buildConfiguration)'
          inputs:
            command: 'publish'
            projects: '**/*.csproj'
            publishWebProjects: false
            arguments: '--no-build --configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(buildConfiguration)'
            zipAfterPublish: true
    
        - publish: '$(Build.ArtifactStagingDirectory)'
          artifact: drop
    
    - stage: 'Dev'
      displayName: 'Deploy to the dev environment'
      dependsOn: Build
      condition:  succeeded()
      jobs:
      - deployment: Deploy
        pool:
          vmImage: 'ubuntu-20.04'
        environment: dev
        variables:
        - group: Release
        strategy:
          runOnce:
            deploy:
              steps:
              - download: current
                artifact: drop
              - task: AzureWebApp@1
                displayName: 'Azure App Service Deploy: website'
                inputs:
                  azureSubscription: 'your-subscription'
                  appType: 'webAppLinux'
                  appName: '$(WebAppNameDev)'
                  package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
    
    - stage: 'Staging'
      displayName: 'Deploy to the staging environment'
      dependsOn: Dev
      jobs:
      - deployment: Deploy
        pool:
          vmImage: 'ubuntu-20.04'
        environment: staging
        variables:
        - group: 'Release'
        strategy:
          runOnce:
            deploy:
              steps:
              - download: current
                artifact: drop
              - task: AzureWebApp@1
                displayName: 'Azure App Service Deploy: website'
                inputs:
                  azureSubscription: 'your-subscription'
                  appType: 'webAppLinux'
                  appName: '$(WebAppNameDev)'
                  package: '$(Pipeline.Workspace)/drop/$(buildConfiguration)/*.zip'
    
  2. Измените AzureWebApp@1 задачу на промежуточном этапе, чтобы использовать подписку.

    1. Выберите Параметры для задачи.

      Снимок экрана: параметр параметров в задаче редактора YAML.

    2. your-subscription Обновите значение подписки Azure, чтобы использовать собственную подписку. Возможно, вам потребуется авторизовать доступ в рамках этого процесса.

      Снимок экрана: пункт меню подписки Azure.

    3. Задайте для типа приложения значение Web App в Linux.

    4. Нажмите кнопку "Добавить ", чтобы обновить задачу.

  3. Перейдите к запуску конвейера. Просмотрите сборку при выполнении. По достижении Stagingконвейер ожидает утверждения выпуска вручную. Вы также получите сообщение электронной почты, ожидающее утверждения конвейера.

    Снимок экрана: ожидание утверждения конвейера.

  4. Просмотрите утверждение и разрешите запуск конвейера.

    Снимок экрана: проверка проверки вручную.

Очистка ресурсов

Если вы не собираетесь продолжать использовать это приложение, удалите группу ресурсов в портал Azure и проект в Azure DevOps, выполнив следующие действия:

Чтобы очистить группу ресурсов, выполните приведенные действия.

  1. Перейдите на портал Azure и войдите в систему.

  2. В строке меню выберите Cloud Shell. При появлении запроса выберите интерфейс Bash .

    Снимок экрана: портал Azure с пунктом меню Cloud Shell.

  3. Выполните следующую команду az group delete , чтобы удалить используемую tailspin-space-game-rgгруппу ресурсов.

    az group delete --name tailspin-space-game-rg
    

Чтобы удалить проект Azure DevOps, включая конвейер сборки:

  1. В Azure DevOps перейдите к проекту.

  2. Выберите параметры проекта.

  3. В разделе "Сведения о проекте" нажмите кнопку "Удалить".