Ручной триггер на этапах 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.
- Создайте среду (я назвал ее NugetRelease)
- Открываем среду и в эллипсах... выбираем "Одобрения и проверки"
- Добавить новое одобрение
- Добавьте пользователя или группу для утверждения. Я добавил группу «Администраторы проекта», так как это позволит вашим администраторам одобрять.
Теперь вам нужно подключить эту среду к вашему выпуску посредством поэтапного развертывания.
Вот основная часть раздела «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