Azure pipeline – переменные PowerShell недоступны между шагами

Вопрос или проблема

Я создаю конвейер и по какой-то причине не могу получить доступ к переменным между шагами. Все включено в одну задачу. Я пытался использовать флаг isOutput=true, также пробовал обращаться к переменным, указывая сначала имя шага, но это все равно не сработало – см. token01 в конце с сообщением об ошибке в комментарии.

Вот мой код:

trigger:
- master

jobs:
- job: RunTests
  pool:
    name: 'some_name'

  steps:
  - task: AzureCLI@2
    inputs:
      azureSubscription: 'some_subscription'
      scriptType: 'ps'
      scriptLocation: 'inlineScript'
      inlineScript: |
         $password = az keyvault secret show --name "some_name123" --vault-name "keyvault_name" --query value -o tsv
         Write-Host "##vso[task.setvariable variable=SECRET_PASSWORD]$password"
  - powershell: |
      $env:SECRET_PASSWORD = "$(SECRET_PASSWORD)"
      cd src/AutomatedTests/PlaywrightTests
      npm install --verbose
      npm list --verbose
      npx playwright install chromium
      npx playwright test tests/getTokens.spec.js --project=chromium --reporter=list | tee playwright-output.log
      Get-Location
      $logContent = Get-Content "playwright-output.log" -Raw
      $token01 = ''
      $token02 = ''

      foreach ($line in $logContent) {
          if ($line -match 'TOKEN01:([^\s]+)') {
              $token01 = $matches[1]
              Write-Host "Found TOKEN01: $token01"
          }
          if ($line -match 'TOKEN02:([^\s]+)') {
              $token02 = $matches[1]
              Write-Host "Found TOKEN02: $token02"
          }
      }

      Write-Host "##vso[task.setvariable variable=token01;isOutput=true]$token01"
      Write-Host "##vso[task.setvariable variable=token02;isOutput=true]$token02"
    name: GetTokens
    displayName: 'test'

  - task: PublishBuildArtifacts@1
    inputs:
      pathToPublish: 'src/AutomatedTests/PlaywrightTests/playwright-output.log'
      artifactName: 'PlaywrightLogs' 
      publishLocation: 'Container'

  - powershell: |
      newman -v
      Write-Host "Token01: $(token01)" #token01 : The term 'token01' is not recognized as the name of a cmdlet, function, script file, or operable program. 
      Write-Host "Token02: $(token02)"

В задаче PowerShell (name: GetTokens) вы установили token01 и token02 в качестве двух выходных переменных.

В пределах одной и той же задачи вам нужно использовать выражение “$(taskName.varName)” для доступа к выходным переменным. Таким образом, в последующих задачах вам следует получать доступ к выходным переменным следующим образом.

steps:
. . .

- powershell: |
    . . .
    Write-Host "##vso[task.setvariable variable=token01;isOutput=true]$token01"
    Write-Host "##vso[task.setvariable variable=token02;isOutput=true]$token02"
  name: GetTokens
  displayName: 'test'

. . .

- powershell: |
    newman -v
    Write-Host "Token01: $(GetTokens.token01)" 
    Write-Host "Token02: $(GetTokens.token02)"

Для получения дополнительной информации смотрите документацию “Использовать выходные переменные из задач“.

Ответ или решение

Как работать с переменными в Azure Pipeline: Решение проблемы доступа между шагами

Создание и управление CI/CD процессами с помощью Azure DevOps Pipeline – мощный инструмент для автоматизации тестирования и развертывания приложений. Однако иногда разработчики сталкиваются с проблемами, например, с доступом к переменным между шагами в одном задании. В этой статье мы разберем, как правильно использовать выходные переменные и доступ к ним между шагами, используя ваши примеры кода.

1. Основная проблема

В вашем коде вы создали переменные token01 и token02 в PowerShell шаге с именем GetTokens, используя конструкцию:

Write-Host "##vso[task.setvariable variable=token01;isOutput=true]$token01"
Write-Host "##vso[task.setvariable variable=token02;isOutput=true]$token02"

Однако при попытке получить доступ к этим переменным в следующем шаге, вы используете:

Write-Host "Token01: $(token01)"

Это приводит к ошибке, так как переменные, определенные как выходные, необходимо ссылаться через имя задачи.

2. Правильное использование выходных переменных

Для доступа к выходным переменным в Azure DevOps вы должны использовать следующую структуру, указывая имя задачи перед именем переменной:

Write-Host "Token01: $(GetTokens.token01)"
Write-Host "Token02: $(GetTokens.token02)"

Таким образом, ваше исправленное определение задачи будет выглядеть следующим образом:

- powershell: |
    newman -v
    Write-Host "Token01: $(GetTokens.token01)" 
    Write-Host "Token02: $(GetTokens.token02)"

3. Полный пример вашего Pipeline

Вот как может выглядеть ваш полный Pipeline с исправлениями:

trigger:
- master

jobs:
- job: RunTests
  pool:
    name: 'some_name'

  steps:
  - task: AzureCLI@2
    inputs:
      azureSubscription: 'some_subscription'
      scriptType: 'ps'
      scriptLocation: 'inlineScript'
      inlineScript: |
         $password = az keyvault secret show --name "some_name123" --vault-name "keyvault_name" --query value -o tsv
         Write-Host "##vso[task.setvariable variable=SECRET_PASSWORD]$password"

  - powershell: |
      $env:SECRET_PASSWORD = "$(SECRET_PASSWORD)"
      cd src/AutomatedTests/PlaywrightTests
      npm install --verbose
      npm list --verbose
      npx playwright install chromium
      npx playwright test tests/getTokens.spec.js --project=chromium --reporter=list | tee playwright-output.log
      Get-Location
      $logContent = Get-Content "playwright-output.log" -Raw
      $token01 = ''
      $token02 = ''

      foreach ($line in $logContent) {
          if ($line -match 'TOKEN01:([^\s]+)') {
              $token01 = $matches[1]
              Write-Host "Found TOKEN01: $token01"
          }
          if ($line -match 'TOKEN02:([^\s]+)') {
              $token02 = $matches[1]
              Write-Host "Found TOKEN02: $token02"
          }
      }

      Write-Host "##vso[task.setvariable variable=token01;isOutput=true]$token01"
      Write-Host "##vso[task.setvariable variable=token02;isOutput=true]$token02"
    name: GetTokens
    displayName: 'test'

  - task: PublishBuildArtifacts@1
    inputs:
      pathToPublish: 'src/AutomatedTests/PlaywrightTests/playwright-output.log'
      artifactName: 'PlaywrightLogs' 
      publishLocation: 'Container'

  - powershell: |
      newman -v
      Write-Host "Token01: $(GetTokens.token01)"
      Write-Host "Token02: $(GetTokens.token02)"

4. Заключение

Использование выходных переменных в Azure Pipelines требует точного указания синтаксиса для доступа к ним. Обратите внимание на правильное упоминание имени задачи перед переменной. Убедитесь, что вы тестируете ваши изменения, чтобы гарантировать корректность работы Pipeline. С данной коррекцией вы сможете успешно передавать данные между шагами и избежать ошибок, связанных с неопределенными переменными.

Для получения дополнительной информации о переменных в Azure Pipelines, обратите внимание на официальную документацию Microsoft.

Оцените материал
Добавить комментарий

Капча загружается...