Передача переменных между этапами в конвейере 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
Переменные, типы данных и операторы в Python
Переменные, типы данных и операторы в Python
В Python переменные используются как место для хранения значений. Пример переменной формы:
0
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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()

О да, спасибо. Я упустил из виду часть «зависимость». Я хочу, чтобы он зависел от всех этапов и выполнялся в случае сбоя на каком-либо из этапов. Однако я использую этапы шаблона. Не могли бы вы рассказать мне, как этого добиться?

Sumit Bhardwaj 28.08.2024 12:08

@SumitBhardwaj рассмотрите возможность добавления параметра dependsOn в шаблоны этапов — вы можете найти пример шаблонов должностей в разделе ДЕЛАТЬ: создание настраиваемых и расширяемых заданий , но вы можете сделать то же самое и для этапов. Кстати, эта страница является частью репозитория, который я создал несколько месяцев назад и который содержит рекомендации по кодированию для конвейеров Azure YAML.

Rui Jarimba 28.08.2024 12:44

можно ли это сделать без параметра?

Sumit Bhardwaj 28.08.2024 14:00

@SumitBhardwaj, На сцене «Cleanup» вы можете напрямую указать список сценических имен для опции «dependsOn». См. РЕДАКТИРОВАНИЕ.

Bright Ran-MSFT 28.08.2024 14:12

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