다음을 통해 공유


스크립트에서 변수 설정

Azure DevOps Services | Azure DevOps Server 2022 - Azure DevOps Server 2019

파이프라인에서 PowerShell 및 Bash 스크립트를 사용하는 경우 이후 작업에서 사용할 수 있는 변수를 설정할 수 있는 것이 유용한 경우가 많습니다. 새로 설정된 변수는 동일한 작업에서 사용할 수 없습니다.

스크립트는 사용자 지정 REST API를 호출하고 응답을 구문 분석하는 등의 작업에서 지원되지 않는 작업을 수행하려는 경우에 적합합니다.

로깅 명령을 사용하여 task.setvariable PowerShellBash 스크립트에서 변수를 설정합니다.

참고 항목

배포 작업은 출력 변수에 다른 구문을 사용합니다. 배포 작업의 출력 변수 지원에 대한 자세한 내용은 배포 작업을 참조하세요.

파이프라인에서 조건과 함께 변수를 사용하려면 조건 지정을 참조 하세요.

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. true로 설정된 변수를 isOutput 참조하려면 작업 이름을 포함합니다. 예들 들어 $(TaskName.myVar)입니다.

변수를 읽기 전용으로 설정하면 다운스트림 작업으로 덮어쓸 수 없습니다. isreadonlytrue로 설정합니다. 변수를 읽기로 설정하면 해당 변수를 변경할 수 없게 하여 보안이 향상됩니다.

변수를 비밀로 설정

true로 설정하면 issecret 변수 값이 비밀로 저장되고 로그에서 마스킹됩니다.

참고 항목

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 변수 출력의 스크린샷.

출력 변수 수준

고유한 구문을 사용하는 출력 변수에는 다음과 같은 네 가지 유형이 있습니다.

  • isOutput 없이 동일한 작업에 설정된 출력 변수입니다. 이러한 변수를 참조하려면 매크로 구문을 사용합니다. 예: $(myVar)
  • isOutput입니다. 이러한 변수를 참조하려면 작업 이름을 포함합니다. 예: $(myTask.myVar)
  • 이후 작업에서 설정된 출력 변수입니다. 이러한 변수를 참조하려면 구문을 사용하여 섹션 variables 의 변수를 dependency 참조합니다.
  • 이후 단계에서 설정된 출력 변수입니다. 이러한 변수를 참조하려면 구문을 사용하여 섹션 variables 의 변수를 stageDependencies 참조합니다.

참고 항목

이후 단계 또는 작업은 변수가 설정된 단계 또는 작업에 의존하는 경우에만 출력 변수에 액세스할 수 있습니다. 출력 변수에 액세스할 수 있도록 하려면 다음 단계 또는 작업이 변수를 만든 단계 또는 작업에 따라 달라지도록 합니다. 여러 단계 또는 작업이 동일한 출력 변수를 사용해야 하는 경우 조건을 사용하여 dependsOn 이 종속성을 설정합니다.

동일한 작업에서 사용할 출력 변수 설정

동일한 작업에서 출력 변수를 사용하는 경우 속성을 사용할 isOutput 필요가 없습니다. 기본적으로 변수는 동일한 작업 내의 다운스트림 단계에서 사용할 수 있습니다. 그러나 속성을 추가하는 isOutput 경우 작업 이름으로 변수를 참조해야 합니다.

여기서 스크립트는 지정하지 않고 동일한 작업 출력 변수 myJobVarisOutput 설정하고 myOutputJobVarisOutput=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

이 스크립트는 동일한 작업 변수 및 .myJobVarmyOutputJobVar 출력 변수를 한 번 추가하면 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에서 출력 변수를 사용하는 경우 . 이후 작업 또는 단계에서 출력 변수에 액세스하는 구문은 변수의 setter와 소비자 간의 관계에 따라 달라집니다. 종속성에서 각 사례에 대해 알아봅니다.

먼저 출력 변수 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)

이후 단계에서 사용할 출력 변수 설정

출력 변수는 파이프라인의 여러 단계에서 사용할 수 있습니다. 출력 변수를 사용하여 생성된 출력의 ID와 같은 유용한 정보를 한 단계에서 다음 단계로 전달할 수 있습니다.

속성을 사용하여 변수 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

FAQ

내 출력 변수가 렌더링되지 않습니다. 무슨 일이 일어나고 있나요?

출력 변수가 표시되지 않는 몇 가지 이유가 있습니다.

  • 설정된 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)"