Я создаю сценарий развертывания yaml в Azure Devops.
У меня есть требование использовать задачу ручной проверки для подтверждения таких изменений. Но перед этим мы должны установить переменную для одного из наших флагов в качестве условия для запуска указанной задачи ручной проверки.
Вот код сейчас:
strategy:
runOnce:
preDeploy:
pool: server
steps:
- script: |
if [[ "$(clusterTags)" == *"HOTFIX"* ]]; then
echo "##vso[task.setvariable variable=hotfix]true"
else
echo "##vso[task.setvariable variable=hotfix]false"
fi
name: SetHotfixVariable
- task: ManualValidation@0
timeoutInMinutes: 1440 # task times out in 1 day
condition: eq(variables.hotfix, true)
inputs:
notifyUsers: ''
instructions: 'Please validate the build configuration and resume'
onTimeout: 'resume'
deploy:
#usual deployment script here
Я попробовал этот подход, но столкнулся с ошибкой, поскольку у меня есть сценарий оболочки в задании без агента. «SIT» — это задание сервера, но оно содержит задачу «CmdLine», которую можно запускать только на агентах.
Можно ли установить эти переменные перед задачей ручной проверки? Тег кластера получен из тегов запроса на извлечение из репозитория Azure.
Спасибо большое, Миш
Боюсь, что невозможно запускать сценарии в заданиях сервера (задания без агента), такие задачи недоступны для заданий сервера для запуска сценариев.
Вам необходимо отделить задачу сценария от задания сервера и добавить ее к заданию агента. Установите задание сервера в зависимости от задания агента, чтобы задание агента могло выполняться раньше задания сервера.
В задаче сценария используйте команду setvariable
, чтобы установить переменную как выходную переменную , чтобы ее можно было передавать между заданиями.
stages:
- stage: deploy
jobs:
- job: setVar
steps:
- checkout: none
- task: Bash@3
name: SetHotfixVariable
inputs:
targetType: inline
script: |
if [[ "$(clusterTags)" == *"HOTFIX"* ]]; then
echo "##vso[task.setvariable variable=hotfix;isoutput=true]true"
else
echo "##vso[task.setvariable variable=hotfix;isoutput=true]false"
fi
- deployment: deploy
dependsOn: setVar
variables:
hotfix: $[ dependencies.setVar.outputs['SetHotfixVariable.hotfix'] ]
environment: myEnv
strategy:
runOnce:
preDeploy:
pool: server
steps:
- task: ManualValidation@0
condition: eq(variables.hotfix, 'true')
timeoutInMinutes: 1440
inputs:
notifyUsers: |
[email protected]
[email protected]
instructions: 'Please validate the build configuration and resume.'
onTimeout: resume
deploy:
. . .
Вам не нужно создавать выходную переменную с именем hotfix
.
Вместо этого проверьте значение переменной конвейера clusterTags
непосредственно в условии задания .
В следующем примере конвейера функция содержит в условии, проверяющем, содержит ли переменная clusterTags
строку HOTFIX
:
trigger: none
pool:
vmImage: 'ubuntu-latest'
variables:
- name: clusterTags
value: 'fooHOTFIXbar' # <---------- change value to test the condition
jobs:
- job: waitForValidation
displayName: Wait for external validation
pool: server
timeoutInMinutes: 4320 # job times out in 3 days
condition: contains(variables['clusterTags'], 'HOTFIX') # <-------- set job condition here
steps:
- task: ManualValidation@0
timeoutInMinutes: 1440 # task times out in 1 day
inputs:
notifyUsers: ''
instructions: 'Please validate the build configuration and resume'
onTimeout: 'resume'
- job: doSomething
displayName: Do something
dependsOn: waitForValidation
steps:
- checkout: none
- script: echo "Hello, world!"
Крючок deploy
не будет выполнен, если ручная проверка будет отклонена, разве это не то, что вам нужно? В качестве альтернативы вы можете использовать обычное задание, которое зависит от ручной проверки, как в моем примере.
Привет, мы столкнулись с трудностями при доступе к результатам ручной проверки, если они приняты или отклонены. ручная проверка осуществлялась с помощью крючка жизненного цикла перед развертыванием, в то время как проверка решения происходит на крючке развертывания при условии.