Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
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)"