Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022
При использовании сценариев 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. Синтаксис для доступа к выходной переменной в будущем задании или этапе зависит от связи между установщиком и потребителем переменной. Узнайте о каждом варианте в зависимостях.
Выходные переменные доступны только в следующем нижнем задании. Если несколько заданий используют одну выходную переменную, используйте dependsOn условие.
Сначала задайте выходную переменную 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)"