Ручной триггер на этапах Azure Pipelines (YAML)

Я настраиваю конвейер с использованием формата YAML Azure Pipelines. Я создал 3 этапа: сборка, постановка и производство. Как следует из названий, на этапе сборки выполняется сборка проекта и публикация артефактов сборки. Стадия подготовки развертывается в промежуточной среде, а стадия производства развертывается в производственной среде.

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

Мой конвейер работает так, что этапы подготовки и производства запускаются автоматически после завершения этапа сборки. Что мне не нравится в этом, так это то, что когда разработчики развертывают свой код в Staging, им требуется пара дней, чтобы протестировать его в Staging, прежде чем отправлять свой код в Production. Так что до тех пор мой конвейер продолжает работать и ждет моего одобрения. Счетчик в верхнем левом углу продолжает вращаться, а поле "Продолжительность" продолжает отображаться.

Есть ли способы, которыми разработчики вручную запускают стадию производства, когда они готовы, вместо того, чтобы запускать стадию сборки?

8 ответов

Решение

Ручные этапы в конвейере yaml в настоящее время недоступны. Этот запрос функции был отправлен в Microsoft. Вы можете пойти и проголосовать за него или подать новый.

Для этого есть обходные пути.

Вы можете перемещать поэтапности и производственные этапы для трубопровода Классический веб - интерфейса пользователя Release. Запуск этапа вручную доступен в конвейере выпуска веб-интерфейса. Пожалуйста, проверьте здесь для получения дополнительной информации.

Другой способ добиться этого - разделить конвейер yaml на два конвейера yaml (конвейер этапа и конвейер производства). И отключите сборку CI для производственного конвейера (на странице редактирования конвейера нажмите на трехмерные точки в правом верхнем углу и выберите триггеры. См. Рисунки ниже).

Так что вы можете вручную запустить производственный конвейер после того, как Разработчик завершит свои тесты.

Вы можете установить для триггера значение none, чтобы отключить CI и запускать его только вручную

trigger: none

Вы можете указать, какой этап вы хотите запустить.

Когда вы нажимаете "Запустить конвейер", нажмите "Этапы для запуска":

Теперь выберите, какой этап будет запускаться:

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

azure-pipelines.yaml выглядит следующим образом:

      trigger:
- master

parameters:
- name: deployDEV
  displayName: Deploy to DEV
  type: boolean
  default: false

stages:
- stage: Build
  jobs:
  - job: Build
    steps:
    - script: |
        echo "Building something..."

- stage: Release_DEV
  displayName: Release to DEV
  condition: |
    and(
      succeeded('Build'), 
      eq(${{ parameters.deployDEV }}, true)
    )
  dependsOn: Build
  jobs:
  - job: Release DEV
    steps:
    - script: |
        echo "Releasing to DEV..."

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

Думаю, есть способ получше. Вы можете добавить переменную конвейера, которую можно переопределить при запуске конвейера.

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

В конвейере добавьте условие к этапу, например:

condition: and(succeeded(), or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), eq(variables['DEPLOY_PROD'], 'true')))

Теперь всякий раз, когда вы хотите развернуть сборку в производственной среде, вы запускаете сборку, а затем переопределяете переменную отсюда:

Установите значение "true", и ваша сборка запустит нужный вам этап.

Это возможно с помощью шагов ручного утверждения, упомянутых @Blue_Clouds и подробно описанных здесь;

https://samlearnsazure.blog/2020/02/05/approvals-in-environments/

В моем случае я создаю пакет nuget для двух разных каналов: предварительный канал с пакетами nuget, встроенными в DEBUG, и после утверждения тот же пакет с тем же номером версии создается в конфигурации RELEASE и развертывается в основном канале выпуска. Теперь разработчики могут ссылаться на пакет из канала предварительной версии и выполнять отладку вплоть до пакета nuget, а пакеты выпуска с оптимизированным кодом можно использовать для создания кода, пригодного для развертывания в рабочей среде.

Это шаги высокого уровня.

Этот процесс включает в себя выполнение следующих действий: В Azure DevOps.

  1. Создайте среду (я назвал ее NugetRelease)
  2. Открываем среду и в эллипсах... выбираем "Одобрения и проверки"
  3. Добавить новое одобрение
  4. Добавьте пользователя или группу для утверждения. Я добавил группу «Администраторы проекта», так как это позволит вашим администраторам одобрять.

Теперь вам нужно подключить эту среду к вашему выпуску посредством поэтапного развертывания.

Вот основная часть раздела «release» файла .yaml.

      - stage: Release
  jobs:
  - deployment: Build_Release_Deploy
    displayName: Build and Deploy Release Package
    environment: NugetRelease
    pool:
      vmImage: 'windows-latest' 
    strategy:
      runOnce:
        deploy:
          steps:
          - checkout: self
          - task: DotNetCoreCLI@2
            displayName: DotNet Restore
            inputs:
              command: 'restore'
              projects: '**/MyProject.sln'
              feedsToUse: 'select'
              vstsFeed: '40a781fa-22c1-xxxx-xxxx-xxxxxxxxxxxx/9b2782f5-76e8-xxxx-xxxx-xxxxxxxxxxxx'

Вот как это выглядит;

Опубликовано в ленте Pre-Release и ожидает одобрения для развертывания Release.

Обзор

Одобрение

Развернуто

Вот полный пример конвейера, который будет запускаться для создания и публикации пакета nuget в канале предварительной версии, а затем пакета выпуска в канале выпуска после утверждения. В моем примере структура файла следующая:

  • источник
    • МоеРешение
      • MySolution.csproj
    • MySolution.sln

Конвейер сборки Azure Dev

      trigger:
- main

# the build will run on a Microsoft hosted agent, using the lastest Windows VM Image
pool:
  vmImage: 'windows-latest' 

variables:
  majorMinor: 2.0

name: $(majorMinor)$(rev:.r)
stages:
- stage: PreRelease
  jobs:
  - job: Build_PreRelease
    displayName: Build PreRelease
    steps:
    - task: DotNetCoreCLI@2
      displayName: DotNet Restore
      inputs:
        command: 'restore'
        projects: '**/MySolution.sln'
        feedsToUse: 'select'
        vstsFeed: '40a781fa-xxxx-xxxx-xxxx-xxxxxxxxxxxx/d7b8f0fe-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
    - task: SnykSecurityScan@1
      inputs:
        serviceConnectionEndpoint: 'Snyk Security'
        testType: 'app'
        targetFile: 'src/MySolution.sln'
        monitorWhen: 'always'
        failOnIssues: true
    - task: DotNetCoreCLI@2
      displayName: 'DotNet Build'
      inputs:
        command: 'build'
        arguments: '--configuration Debug'
        projects: '**/MySolution/MySolution.csproj'
  - job: PackageDeploy_PreRelease
    displayName: Package and Deploy PreRelease
    dependsOn: Build_PreRelease
    condition: succeeded()
    steps:
    #package 
    - task: DotNetCoreCLI@2
      displayName: 'DotNet Pack'
      inputs:
        command: 'pack'
        packagesToPack: '**/MySolution/MySolution.csproj'
        versioningScheme: byEnvVar
        versionEnvVar: BUILD_BUILDNUMBER
    #push
    - task: DotNetCoreCLI@2
      displayName: "NuGet Push"
      inputs:
        command: 'push'
        packagesToPush: '$(Build.ArtifactStagingDirectory)/*.nupkg'
        nuGetFeedType: 'internal'
        publishVstsFeed: '40a781fa-xxxx-xxxx-xxxx-xxxxxxxxxxxx/d7b8f0fe-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
    #publish
    - task: PublishBuildArtifacts@1
      displayName: "Publish Artifact"
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
        ArtifactName: 'drop'
        TargetPath: '\\MySolution\$(Build.DefinitionName)\$(Build.BuildNumber)'
        publishLocation: 'Container'
- stage: Release
  jobs:
  - deployment: Build_Release_Deplpy
    displayName: Build and Deploy Release Package
    environment: NugetRelease
    pool:
      vmImage: 'windows-latest' 
    strategy:
      runOnce:
        deploy:
          steps:
          - checkout: self
          - task: PowerShell@2
            displayName: 'Echo Version'
            inputs:
              targetType: inline
              script: echo $(Build.BuildNumber)
          - task: DotNetCoreCLI@2
            displayName: DotNet Restore
            inputs:
              command: 'restore'
              projects: '**/MySolution.sln'
              feedsToUse: 'select'
              vstsFeed: '40a781fa-xxxx-xxxx-xxxx-xxxxxxxxxxxx/9b2782f5-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
          - task: SnykSecurityScan@1
            inputs:
              serviceConnectionEndpoint: 'Snyk Security'
              testType: 'app'
              targetFile: 'src/MySolution.sln'
              monitorWhen: 'always'
              failOnIssues: true
          - task: DotNetCoreCLI@2
            displayName: 'DotNet Build'
            inputs:
              command: 'build'
              arguments: '--configuration Release'
              projects: '**/MySolution/MySolution.csproj'
          #package 
          - task: DotNetCoreCLI@2
            displayName: 'DotNet Pack'
            inputs:
              command: 'pack'
              packagesToPack: '**/MySolution/MySolution.csproj'
              versioningScheme: byEnvVar
              versionEnvVar: BUILD_BUILDNUMBER
          #push
          - task: DotNetCoreCLI@2
            displayName: "NuGet Push"
            inputs:
              command: 'push'
              packagesToPush: '$(Build.ArtifactStagingDirectory)/*.nupkg'
              nuGetFeedType: 'internal'
              publishVstsFeed: '40a781fa-xxxx-xxxx-xxxx-xxxxxxxxxxxx/9b2782f5-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
          #publish
          - task: PublishBuildArtifacts@1
            displayName: "Publish Artifact"
            inputs:
              PathtoPublish: '$(Build.ArtifactStagingDirectory)'
              ArtifactName: 'drop'
              TargetPath: '\\MySolution\$(Build.DefinitionName)\$(Build.BuildNumber)'
              publishLocation: 'Container'

Надеюсь, это поможет :-)

Один отличный обходной путь с YAML — использование условий и переменных.

Просто добавьcondition: eq(variables['Build.Reason'], 'Manual')на этапе, который требует ручного вмешательства, и это должно быть так.

много полезной информацииНа https://ochzhen.com/blog/manual-trigger-in-yaml-azure-pipelines

Вот ссылка для просмотра всех значений Build.Reason: https://learn.microsoft.com/en-us/azure/devops/pipelines/build/variables?view=azure-devops&tabs=yaml

Да, это может быть сделано. Мы не делаем этого напрямую в ямле. Но вместо этого мы добавляем окружение в YAML. А в окружение добавляем ручной триггер.

 environment: 'smarthotel-dev'

Среда и триггеры управляются через пользовательский интерфейс.

https://docs.microsoft.com/en-us/azure/devops/pipelines/process/environments?view=azure-devops

Другие вопросы по тегам