Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019
При использовании сценариев PowerShell и Bash в конвейерах часто полезно задать переменные, которые затем можно использовать в будущих задачах. Новые переменные недоступны в той же задаче.
Скрипты отлично подходят, если вы хотите сделать что-то, что не поддерживается задачей. Например, можно использовать скрипт для вызова пользовательского REST API и анализа ответа.
Команда ведения журнала
Примечание.
Задания развертывания используют другой синтаксис для выходных переменных. Дополнительные сведения о поддержке выходных переменных в заданиях развертывания см. в разделе "Задания развертывания".
Сведения об использовании переменной с условием в конвейере см. в разделе "Указание условий".
Около 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
условие для установления этой зависимости.
Имя выходной переменной может измениться, если в конвейере используется стратегия выполнения , например матричное задание. В таких случаях выведите переменную для тестирования сначала, чтобы проверить его имя. Вы также можете распечатать все доступные переменные в конвейере с помощью скрипта env
.
- script: env
displayName: 'Print all variables'
Установите выходную переменную для использования в той же задаче
При использовании выходной переменной в том же задании нет необходимости использовать свойство 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)"