Выходная переменная из обычного задания конвейера Azure не расширяется в задании развертывания

В приведенном ниже коде у меня есть переменная (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. Этот точный сценарий отлично работает в других проектах.

Где определяется TaskName.storage_account_name? Поделитесь соответствующим разделом из шаблона.

Daniel Mann 13.07.2024 04:20
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В соответствии с Задания развертывания — Поддержка выходных переменных, вам необходимо использовать другой синтаксис для переменных и условий в заданиях развертывания.

Кроме того, каждая стратегия развертывания (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 15.07.2024 00:12

@ccoutinho Я удивлен, увидев, что вопрос закрыт. Здесь, на SO, есть много подобных вопросов.

Rui Jarimba 15.07.2024 00:14

Да, я тоже! Надеюсь, это будет исправлено. Я имел в виду, что проблема связана со сценарием (или с выполнением сценария).

ccoutinho 15.07.2024 00:23

Нашел проблему! Переменная вообще не была доступна в скрипте... Так как я ошибся и вызвал шаблон, в котором команды terraform выполнялись с помощью команды plan, а не с помощью apply. Значит выходов не было! Спасибо за помощь!

ccoutinho 15.07.2024 00:39

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