Совместное использование переменных между хуками жизненного цикла задания развертывания в Azure Devops Pipelines - PullRequest
1 голос
/ 14 апреля 2020

Я пытался определить переменную в ловушке жизненного цикла в задании развертывания, чтобы затем получить доступ к этой переменной в более поздней ловушке жизненного цикла. Документация по заданиям на развертывание ссылается на возможность сделать это, но не предлагает реальных примеров этого случая (выделение выделено):

Определение выходных переменных в обработчиках жизненного цикла задания развертывания и использовать их в других последующих шагах и заданиях на том же этапе.

Пример конвейера, с которым я работал:

stages:
- stage: Pipeline
  jobs:
  - deployment: Deploy
    environment: 'testing'
    strategy:
      runOnce:
        preDeploy:
          steps:
          - bash: |
              echo "##vso[task.setvariable variable=myLocalVar;isOutput=false]local variable"
            name: setvarStep
          - bash: |
              echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]output variable"
            name: outvarStep
          - bash: |
              echo 'Both $(myLocalVar) and $(outvarStep.myOutputVar) are available here'
              echo "Both $(myLocalVar) and $(outvarStep.myOutputVar) are available here"
        deploy:
          steps:
          - bash: |
              echo 'Neither $(myLocalVar) nor $(outvarStep.myOutputVar) are available here'
              echo "Neither $(myLocalVar) nor $(outvarStep.myOutputVar) are available here"

У меня есть пробовал любое количество опций, но ничего из того, что я сделал, похоже, не позволяет этому на самом деле работать - вывод задачи bash в ловушке жизненного цикла развертывания:

Neither nor are available here

  • Я пытался связать переменные с задачей bash через вход env:, используя оба синтаксиса макроса (например, $(myOutputVar) и синтаксис выражения времени выполнения, надеясь, что, возможно, найдется скрытая зависимость ( например, $[ dependencies.Deploy.outputs['preDeploy.outVarStep.myOutputVar'] ], и многие, многие другие синтаксисы)
  • Я попытался определить переменные на уровне задания, надеясь, что они будут обновлены с помощью первой preDeploy ловушки жизненного цикла и доступны для deploy LifeC ycle hook.
  • Я пытался отобразить переменные через синтаксис выражений времени выполнения
  • Многие другие комбинации синтаксиса, надеясь наткнуться на фактический ответ

Но все безрезультатно. Я, вероятно, прибегну к хаку загрузки переменной в качестве артефакта и ее загрузки позже, но очень хотел бы найти решение этой проблемы. Кто-нибудь смог сделать это? Большое спасибо заранее.

1 Ответ

1 голос
/ 15 апреля 2020

Обход :

Во-первых, поделитесь с вами правильным примером по этому сценарию, который вы ищете:

stages:
- stage: Pipeline
  jobs:
  - deployment: Deploy
    environment: 'testing'
    strategy:
      runOnce:
        preDeploy:
          steps:
          - bash: |
              echo "##vso[task.setvariable variable=myLocalVar;isOutput=false]local variable"
            name: setvarStep
          - bash: |
              echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]output variable"
            name: outvarStep
          - bash: |
              echo 'Both $(myLocalVar) and $(outvarStep.myOutputVar) are available here'
              echo "Both $(myLocalVar) and $(outvarStep.myOutputVar) are available here"
              mkdir -p $(Pipeline.Workspace)/variables
              echo "$(myLocalVar)" > $(Pipeline.Workspace)/variables/myLocalVar
              echo "$(outvarStep.myOutputVar)" > $(Pipeline.Workspace)/variables/myOutputVar

          - publish: $(Pipeline.Workspace)/variables
            artifact: variables
        deploy:
          steps:
          - bash: |
              echo 'Neither $(myLocalVar) nor $(outvarStep.myOutputVar) are available here'
              echo "Neither $(myLocalVar) nor $(outvarStep.myOutputVar) are available here"
          - download: current
            artifact: variables
          - bash: |
              myLocalVar=$(cat $(Pipeline.Workspace)/variables/myLocalVar)
              myOutputVar=$(cat $(Pipeline.Workspace)/variables/myOutputVar)
              echo "##vso[task.setvariable variable=myLocalVar;isoutput=true]$myLocalVar"
              echo "##vso[task.setvariable variable=myOutputVar;isoutput=true]$myOutputVar"
            name: output
          - bash: |
              echo "$(output.myLocalVar)"
              echo "$(output.myOutputVar)"
            name: SucceedToGet

Вы увидите, что выходные переменные могут удалось распечатать в SucceedToGet задачу:

enter image description here


Объяснение , почему ваши предыдущие попытки терпели неудачу:

Для нашей системы strategy представляет одно задание до его запуска ( время компиляции ). Это только расширяется во время выполнения.

Определите выходные переменные в хуках жизненного цикла задания развертывания и используйте их в других последующих шагах и заданиях на том же этапе.

Здесь другие последующие шаги и задания означает независимое задание , которое не зависит во время компиляции. Вот почему мы предоставляем этот образец YAML под этой линией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...