Вопрос или проблема
Я создаю конвейер и по какой-то причине не могу получить доступ к переменным между шагами. Все включено в одну задачу. Я пытался использовать флаг 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.