Динамическое создание переменных в конвейере Azure

#azure-devops #azure-pipelines

#azure-devops #azure-конвейеры

Вопрос:

Я пытаюсь сгенерировать заметки о выпуске на этапе Azure piplelines и отправить заметку на служебную шину Azure.

Как мне предоставить переменную в скрипте bash, а затем использовать ее в последующем задании на том же этапе?

Я использую задачу bash для выполнения git команды и пытаюсь экспортировать ее как переменную среды, которую я хочу использовать в следующем задании.

   - stage: PubtoAzureServiceBus
    variables:
      COMMIT_MSG: "alsdkfgjdsfgjfd"
    jobs:
      - job: gitlog
        steps:
          - task: Bash@3
            inputs:
              targetType: 'inline'
              script: |
                # Write your commands here
                
                export COMMIT_MSG=$(git log -1 --pretty=format:"Author: %aN%n%nCommit: %H%n%nNotes:%n%n%B")
                env | grep C
      - job:
        pool: server
        dependsOn: gitlog
        steps:
          - task: PublishToAzureServiceBus@1
            inputs:
              azureSubscription: 'Slack Release Notifications'
              messageBody: |
                {
                  "channel":"XXXXXXXXXX",
                  "username":"bot",
                  "iconEmoji":"",
                  "text":":airhorn: release :airhorn: n`$(COMMIT_MSG)`"
                }
              signPayload: false
              waitForCompletion: false
 

Ответ №1:

Вам необходимо использовать синтаксис ведения журнала и выходные переменные, как показано здесь:

 trigger: none

pool:
  vmImage: 'ubuntu-latest'

stages:
- stage: A
  jobs:
  - job: A1
    steps:
     - bash: echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
     # or on Windows:
     # - script: echo ##vso[task.setvariable variable=shouldrun;isOutput=true]true
       name: printvar

- stage: B
  dependsOn: A
  jobs:
  - job: B1
    condition: in(stageDependencies.A.A1.result, 'Succeeded', 'SucceededWithIssues', 'Skipped')
    steps:
    - script: echo hello from Job B1
  - job: B2
    variables:
      varFromA: $[ stageDependencies.A.A1.outputs['printvar.shouldrun'] ]
    steps:
    - script: echo $(varFromA) # this step uses the mapped-in variable

 

Пожалуйста, посмотрите здесь, чтобы проверить документацию.

Поэтому вам необходимо заменить

                 export COMMIT_MSG=$(git log -1 --pretty=format:"Author: %aN%n%nCommit: %H%n%nNotes:%n%n%B")
 

команда ведения журнала с помощью isOutput=true

а затем сопоставьте это как здесь

 jobs:
- job: A
  steps:
  - bash: |
       echo "##vso[task.setvariable variable=shouldrun;isOutput=true]true"
    name: ProduceVar  # because we're going to depend on it, we need to name the step
- job: B
  dependsOn: A
  variables:
    # map the output variable from A into this job
    varFromA: $[ dependencies.A.outputs['printvar.shouldrun']
  steps:
  - script: echo $(varFromA) # this step uses the mapped-in variable

 

поскольку вы хотите разделить переменную между заданиями (а не этапами, как показано в первом примере).

Комментарии:

1. генерируется ли вывод командой echo в задании A1 и сохраняется ли он в переменной с именем printvar?

2. ДА. Но важно иметь isOutput=true

3. где мне запустить команду git log? это добавляется к echo «## vso …»

4. Перед этим и присваивайте результат переменной. а затем используйте его здесь ##vso[task.setvariable variable=shouldrun;isOutput=true]<put variable here>