Установка переменных в скриптах
Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019
При использовании сценариев PowerShell и Bash в конвейерах часто полезно задать переменные, которые затем можно использовать в будущих задачах. Новые переменные недоступны в той же задаче.
Скрипты отлично подходят для выполнения задач, таких как вызов пользовательского REST API и анализ ответа.
Вы будете task.setvariable
использовать команду ведения журнала для задания переменных в сценариях PowerShell и Bash .
Примечание.
Задания развертывания используют другой синтаксис для выходных переменных. Дополнительные сведения о поддержке выходных переменных в заданиях развертывания см. в разделе "Задания развертывания".
Сведения об использовании переменной с условием в конвейере см. в разделе "Указание условий".
Около task.setvariable
При добавлении переменной с помощью следующих задач можно использовать переменную task.setvariable
с помощью синтаксиса макроса $(myVar)
. Переменная будет доступна только задачам в одном задании по умолчанию. При добавлении параметра isoutput
синтаксис для вызова изменений переменной. См . раздел "Задание выходной переменной" для использования в том же задании.
Задайте переменную myVar
со значением foo
.
- bash: |
echo "##vso[task.setvariable variable=myVar;]foo"
Чтение переменной myVar
:
- bash: |
echo "You can use macro syntax for variables: $(myVar)"
Определение свойств переменной
Команда task.setvariable
содержит свойства для задания переменной в качестве секрета, в качестве выходной переменной и только для чтения. Доступные свойства:
variable
= имя переменной (обязательно)issecret
= логическое значение (необязательно, по умолчанию — false)isoutput
= логическое значение (необязательно, по умолчанию — false)isreadonly
= логическое значение (необязательно, по умолчанию — false)
Чтобы использовать переменную на следующем этапе, задайте isoutput
для свойства true
значение . Чтобы ссылаться на переменную с isoutput
заданным значением true, вы включите имя задачи. Например, $(TaskName.myVar)
.
При задании переменной только для чтения она не может быть перезаписана подчиненными задачами. Задайте для параметра isreadonly
значение true
. Задание переменной в качестве чтения повышает безопасность, делая эту переменную неизменяемой.
Установка переменной в качестве секрета
Если issecret
задано значение true, значение переменной будет сохранено как секрет и замаскировано из журналов.
Примечание.
Azure Pipelines делает попытку маскировать секреты при создании данных в журналы конвейера, поэтому вы можете увидеть дополнительные переменные и данные, маскированные в выходных данных и журналах, которые не заданы как секреты.
Задайте переменную mySecretVal
секрета.
- bash: |
echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
Получите переменную mySecretVal
секрета.
- bash: |
echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
- bash: |
echo $(mySecretVal)
Выходные данные секретной переменной в bash.
Уровни выходных переменных
Существует четыре различных типа выходных переменных с различными синтаксисами:
- Выходные переменные, заданные в одном задании
isoutput
без параметра. Для ссылки на эти переменные используется синтаксис макросов. Пример:$(myVar)
. - Выходные переменные, заданные в том же задании с параметром
isoutput
. Чтобы ссылаться на эти переменные, вы будете включать имя задачи. Пример:$(myTask.myVar)
. - Выходные переменные, заданные в будущем задании. Чтобы ссылаться на эти переменные, вы будете ссылаться на переменную в разделе с синтаксисом
variables
dependency
. - Выходные переменные, заданные на будущих этапах. Чтобы ссылаться на эти переменные, вы будете ссылаться на переменную в разделе с синтаксисом
variables
stageDependencies
.
Примечание.
Будущие этапы или задания могут получить доступ только к выходным переменным, если они зависят от этапа или задания, в котором была задана переменная. Чтобы сделать выходную переменную доступной, убедитесь, что следующий этап или задание зависит от этапа или задания, в котором вы создали переменную. Если несколько этапов или заданий должны использовать одну выходную переменную, используйте dependsOn
условие для установления этой зависимости.
Задание выходной переменной для использования в том же задании
При использовании выходной переменной в том же задании не требуется использовать isoutput
это свойство. По умолчанию переменная будет доступна для подчиненных шагов в одном задании. Однако при добавлении isoutput
свойства необходимо ссылаться на переменную с именем задачи.
Скрипт здесь задает переменную myJobVar
вывода одного задания без указания isoutput
и заданияmyOutputJobVar
.isoutput=true
jobs:
- job: A
steps:
- bash: |
echo "##vso[task.setvariable variable=myJobVar]this is the same job"
- bash: |
echo "##vso[task.setvariable variable=myOutputJobVar;isoutput=true]this is the same job too"
name: setOutput
Этот скрипт получает переменные myJobVar
одного задания и myOutputJobVar
. Обратите внимание, что синтаксические изменения для ссылки на выходную переменную после isoutput=true
добавления.
jobs:
- job: A
steps:
- bash: |
echo "##vso[task.setvariable variable=myJobVar]this is the same job"
- bash: |
echo "##vso[task.setvariable variable=myOutputJobVar;isoutput=true]this is the same job too"
name: setOutput
- bash: |
echo $(myJobVar)
- bash: |
echo $(setOutput.myOutputJobVar)
Задание выходной переменной для использования в будущих заданиях
При использовании выходных переменных в заданиях вы будете ссылать на них dependencies
. Синтаксис для доступа к выходной переменной в будущем задании или стадии зависит от связи между набором и потребителем переменной. Узнайте о каждом случае в зависимостях.
Сначала задайте выходную переменную myOutputVar
.
jobs:
- job: A
steps:
- bash: |
echo "##vso[task.setvariable variable=myOutputVar;isoutput=true]this is from job A"
name: passOutput
Затем получите доступ myOutputVar
к следующему заданию и выведите переменную в виде myVarFromJobA
. Чтобы использовать dependencies
, необходимо задать dependsOn
свойство в будущем задании с помощью имени предыдущего задания, в котором была задана выходная переменная.
jobs:
- job: A
steps:
- bash: |
echo "##vso[task.setvariable variable=myOutputVar;isoutput=true]this is from job A"
name: passOutput
- job: B
dependsOn: A
variables:
myVarFromJobA: $[ dependencies.A.outputs['passOutput.myOutputVar'] ]
steps:
- bash: |
echo $(myVarFromJobA)
Настройка выходной переменной для использования на будущих этапах
Выходные переменные можно использовать на этапах конвейеров. Выходные переменные можно использовать для передачи полезных сведений, таких как идентификатор созданного выходных данных, с одного этапа до следующего.
При задании переменной со isoutput
свойством можно ссылаться на эту переменную на последующих этапах с именем задачи и синтаксисом stageDependencies
. Дополнительные сведения о зависимостях.
Выходные переменные доступны только на следующем нижнем этапе. Если несколько этапов используют одну выходную переменную, используйте dependsOn
условие.
Сначала задайте выходную переменную myStageVal
.
steps:
- bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
name: MyOutputVar
Затем на следующем этапе сопоставьте выходную переменную с этапом, заданием или переменной myStageVal
с областью задач, например myStageAVar
. Обратите внимание, что синтаксис сопоставления использует выражение $[]
среды выполнения и трассирует путь от stageDependencies
выходной переменной с помощью имени этапа () и имени задания (A
A1
) для полной квалификации переменной.
stages:
- stage: A
jobs:
- job: A1
steps:
- bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
name: MyOutputVar
- stage: B
dependsOn: A
jobs:
- job: B1
variables:
myStageAVar: $[stageDependencies.A.A1.outputs['MyOutputVar.myStageVal']]
steps:
- bash: echo $(myStageAVar)
Если значение содержит новые линии, их можно экранировать, и агент автоматически раскроет его:
steps:
- bash: |
escape_data() {
local data=$1
data="${data//'%'/'%AZP25'}"
data="${data//$'\n'/'%0A'}"
data="${data//$'\r'/'%0D'}"
echo "$data"
}
echo "##vso[task.setvariable variable=myStageVal;isOutput=true]$(escape_data $'foo\nbar')"
name: MyOutputVar
Вопросы и ответы
Моя выходная переменная не отображается. Что не так?
Существует несколько причин, по которым выходные переменные могут не отображаться.
- Выходные переменные с
isoutput
набором недоступны в одном задании и вместо этого доступны только в подчиненных заданиях. - В зависимости от используемого синтаксиса переменной переменная может быть недоступна во время выполнения. Например, переменные с синтаксисом макросов (
$(var)
) обрабатываются перед выполнением задачи. В отличие от этого, переменные с синтаксисом шаблона обрабатываются во время выполнения ($[variables.var]
). Обычно при настройке выходных переменных требуется использовать синтаксис среды выполнения. Дополнительные сведения о синтаксисе переменных см. в разделе "Определение переменных". - В выражении могут быть дополнительные пробелы. Если переменная не отображается, проверьте наличие дополнительных пространств, окружающих
isOutput=true
.
Вы можете устранить неполадки dependencies
выходных данных для задания конвейера или этапа, добавив переменную для зависимостей, а затем распечатав эту переменную. Например, в этом задании A
конвейера задает выходную переменную MyTask
. Второе задание (B
) зависит от задания A
. Новая переменная deps
содержит представление JSON зависимостей задания. Второй шаг в задании B
использует PowerShell для вывода deps
, чтобы увидеть зависимости заданий.
trigger:
- '*'
pool:
vmImage: 'ubuntu-latest'
jobs:
- job: A
steps:
- script: |
echo "##vso[task.setvariable variable=MyTask;isOutput=true]theoutputval"
name: ProduceVar
- job: B
dependsOn: A
variables:
varFromA: $[ dependencies.A.outputs['ProduceVar.MyTask'] ]
deps: $[convertToJson(dependencies)] # create a variable with the job dependencies
steps:
- script: echo $(varFromA) #
- powershell: Write-Host "$(deps)"