Передача переменных между этапами в конвейере Azure DevOps

Я пытаюсь передать переменную с одного этапа на другой, но почему-то она не работает. Я проверил другие ответы здесь, на Stackoverflow, но это не сработало (или, может быть, я делаю что-то неправильно)

Я пытаюсь передать переменную $NEW_VERSION на этап Cleanup, но на выходе она пуста:

Это мой конвейер .yaml:

stages:
  - stage: ImageDeployment
    jobs:
      - job: NewImageDeployment
        timeoutInMinutes: 180
        pool:
          vmImage: 'ubuntu-latest'
        steps:
          - task: AzureKeyVault@2
            displayName: 'Fetch Secrets'
            inputs:
              connectedServiceName: '$(GLOBAL_SERVICE_CONNECTION)'
              keyVaultName: $(GLOBAL_KV_NAME)
              secretsFilter: "Packer-Secret"
              runAsPreJob: false

          - task: AzureCLI@2
            displayName: 'Check image version'
            retryCountOnTaskFailure: 0
            inputs:
              azureSubscription: '$(GLOBAL_SERVICE_CONNECTION)'
              scriptType: 'bash'
              scriptLocation: 'inlineScript'
              inlineScript: |
                while IFS=$'\t' read -a arr_image_versions; do
                  version=${arr_image_versions[0]}
                  date=${arr_image_versions[1]}
                  if [[ $date > $old_date ]]; then
                    last_version=$version
                  fi
                  old_date=$date
                done <<< "$(az sig image-version list --gallery-image-definition xxxxxxx --gallery-name xxxxxxxx --resource-group xxxxxxxxx --query "[].[name, publishingProfile.publishedDate]" -o tsv)"
                echo "Last image version: $last_version"
                echo "##vso[task.setvariable variable=last_version]$last_version"
            
          - task: Bash@3
            name: CheckImageVersion
            displayName: 'Increment image version'
            inputs:
              targetType: 'inline'
              script: |
                IFS='.' read -ra VERSION_PARTS <<< "$(last_version)"
                PATCH_VERSION=${VERSION_PARTS[2]}
                PATCH_VERSION=$((PATCH_VERSION + 1))
                NEW_VERSION = "${VERSION_PARTS[0]}.${VERSION_PARTS[1]}.$PATCH_VERSION"
                echo "New image version: $NEW_VERSION"
                echo "##vso[task.setvariable variable=NEW_VERSION;isOutput=true]$NEW_VERSION"


  - template: tests/build_functionapp_testcase2.yaml@self

  - template: tests/datafactory_testcase3.yaml@self

  - stage: Cleanup
    condition: failed()
    jobs:
      - job: DeleteImage
        pool:
          vmImage: 'ubuntu-latest'
        variables:
          NEW_VERSION: $[ stageDependencies.ImageDeployment.NewImageDeployment.outputs['CheckImageVersion.NEW_VERSION'] ]
        steps:
          - script: |
              echo "NEW_VERSION in Cleanup stage: $(NEW_VERSION)"
          - task: AzureCLI@2
            displayName: 'Delete Packer Image'
            inputs:
              azureSubscription: '$(GLOBAL_SERVICE_CONNECTION)'
              scriptType: 'bash'
              scriptLocation: 'inlineScript'
              inlineScript: |
                echo "Deleting image version: $(NEW_VERSION)"
                az sig image-version delete --gallery-image-definition xxxxxxxxxxxxxxxxxxxxxxx

54
1

Ответ:

Решено

На этапе «Cleanup» вы пропустили опцию «dependsOn», чтобы этап «Cleanup» зависел от этапа «ImageDeployment».

Отношения «dependsOn» также гарантируют, что этап «Cleanup» будет следовать за этапом «ImageDeployment».

stages:
- stage: ImageDeployment

. . .

- stage: Cleanup
  dependsOn: ImageDeployment

Если не установить связь «dependsOn», этап «Cleanup» не сможет получить выходные данные этапа «ImageDeployment», когда есть другие этапы, которые также потребляют выходные данные этапа «ImageDeployment».

Сопутствующая документация:


Обновлено:

Из предоставленного вами YAML я заметил, что вы используете два фиксированных шаблона. Если имена этапов, определенные в шаблонах, также фиксированы, на этапе «Cleanup» вы можете напрямую предоставить список названий этапов для опции «dependsOn».

stages:
- stage: ImageDeployment

. . .
# Some stages from templates.
. . .

- stage: Cleanup
  dependsOn:
    - ImageDeployment
    - <name of stage_1 defined in templates>
    - <name of stage_2 defined in templates>
    . . .
    - <name of stage_N defined in templates>
  condition: failed()