Установка переменных в скриптах

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.

Снимок экрана: выходные данные переменной Bash.

Уровни выходных переменных

Существует четыре различных типа выходных переменных с различными синтаксисами:

Примечание.

Будущие этапы или задания могут получить доступ только к выходным переменным, если они зависят от этапа или задания, в котором была задана переменная. Чтобы сделать выходную переменную доступной, убедитесь, что следующий этап или задание зависит от этапа или задания, в котором вы создали переменную. Если несколько этапов или заданий должны использовать одну выходную переменную, используйте 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 выходной переменной с помощью имени этапа () и имени задания (AA1) для полной квалификации переменной.

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)"