В приведенном ниже коде у меня есть переменная (storage_account_name
), выводимая в первом задании внутри задачи под названием TaskName
. Я хочу иметь возможность получить его значение во втором задании (задании по развертыванию), но переменная пуста.
jobs:
- job: dependency
steps:
- template: my_template.yml
- deployment: my_deployment
environment: MyEnvironment
dependsOn:
- dependency
variables:
- name: storage_account_name
value: $[ dependencies.dependency.outputs['TaskName.storage_account_name'] ]
strategy:
runOnce:
deploy:
steps:
- checkout: self
- template: another_template.yml
parameters:
TF_VAR_storage_account_name: $(storage_account_name)
Тот же код хорошо работает, когда второе задание является обычным заданием. Есть идеи, что я делаю неправильно?
Внутри my_template.yml
я запускаю задачу Bash, которая вызывает скрипт:
- task: Bash@3
name: TaskName
inputs:
targetType: filePath
filePath: scripts/my_script.sh
failOnStderr: true
на my_script.sh
у меня тогда есть:
if [ "$IS_SENSITIVE" == "true" ]; then
echo seeding the sensitive "$KEY" output variable...
echo "##vso[task.setvariable variable=$KEY;isOutput=true;issecret=true;]$VALUE"
else
echo seeding the "$KEY" output variable...
echo "##vso[task.setvariable variable=$KEY;isOutput=true;]$VALUE"
fi
Пары {Key -> Value}
— это результаты выполнения команд terraform. Этот точный сценарий отлично работает в других проектах.
В соответствии с Задания развертывания — Поддержка выходных переменных, вам необходимо использовать другой синтаксис для переменных и условий в заданиях развертывания.
Кроме того, каждая стратегия развертывания (runOnce
, canary
, rolling
) использует свой синтаксис.
Следующий конвейер показывает, как определять и использовать переменные, созданные как в стандартных заданиях, так и в заданиях развертывания:
trigger: none
pool:
vmImage: 'ubuntu-latest'
jobs:
- job: jobA
displayName: 'Set variable A in job'
steps:
- checkout: none
- script: |
echo "##vso[task.setvariable variable=A;isOutput=true]AAAA"
displayName: 'Set variable A'
name: setVariableATask
- deployment: deploymentJobB
displayName: 'Set variable B in deployment job'
environment: 'no-approvals'
strategy:
runOnce:
deploy:
steps:
- script: |
echo "##vso[task.setvariable variable=B;isOutput=true]BBBB"
displayName: 'Set variable A'
name: setVariableBTask
- job: printVariablesJob
displayName: 'Print variables in job'
dependsOn:
- jobA
- deploymentJobB
variables:
varFromJob: $[ dependencies.jobA.outputs['setVariableATask.A'] ]
varFromDeploymentJob: $[ dependencies.deploymentJobB.outputs['deploymentJobB.setVariableBTask.B'] ]
steps:
- checkout: none
- script: |
echo "varFromJob: $(varFromJob)"
echo "varFromDeploymentJob: $(varFromDeploymentJob)"
displayName: 'Print variables'
- deployment: printVariablesDeploymentJob
displayName: 'Print variables in deployment job'
dependsOn:
- jobA
- deploymentJobB
variables:
varFromJob: $[ dependencies.jobA.outputs['setVariableATask.A'] ]
varFromDeploymentJob: $[ dependencies.deploymentJobB.outputs['deploymentJobB.setVariableBTask.B'] ]
environment: 'no-approvals'
strategy:
runOnce:
deploy:
steps:
- script: |
echo "varFromJob: $(varFromJob)"
echo "varFromDeploymentJob: $(varFromDeploymentJob)"
displayName: 'Print variables'
Тот же код хорошо работает, когда второе задание является обычным заданием.
У меня нет информации о том, как была установлена переменная. Мне не удалось воспроизвести эту проблему, используя вышеуказанный конвейер.
Использование одного и того же синтаксиса работает независимо от того, использую ли я стандартное задание или задание развертывания для ссылки на переменные:
variables:
# $[ dependencies.{job-name}.outputs['{task-name}.{variable-name}'] ]
varFromJob: $[ dependencies.jobA.outputs['setVariableATask.A'] ]
# $[ dependencies.{deployment-job-name}.outputs['{deployment-job-name}.{task-name}.{variable-name}'] ]
varFromDeploymentJob: $[ dependencies.deploymentJobB.outputs['deploymentJobB.setVariableBTask.B'] ]
Если ответ будет разблокирован (я не совсем понимаю, почему мой вопрос не является вопросом по программированию), я отмечу ваш ответ как правильный. Это помогло мне устранить проблему, и я не уверен, что проблема каким-то образом связана со сценарием.
@ccoutinho Я удивлен, увидев, что вопрос закрыт. Здесь, на SO, есть много подобных вопросов.
Да, я тоже! Надеюсь, это будет исправлено. Я имел в виду, что проблема связана со сценарием (или с выполнением сценария).
Нашел проблему! Переменная вообще не была доступна в скрипте... Так как я ошибся и вызвал шаблон, в котором команды terraform выполнялись с помощью команды plan, а не с помощью apply. Значит выходов не было! Спасибо за помощь!
Где определяется
TaskName.storage_account_name
? Поделитесь соответствующим разделом из шаблона.