Ustawianie zmiennych w skryptach

Azure DevOps Services | Azure DevOps Server 2022 — Azure DevOps Server 2019

W przypadku używania skryptów programu PowerShell i powłoki Bash w potokach często przydaje się możliwość ustawiania zmiennych, które można następnie używać w przyszłych zadaniach. Nowo ustawione zmienne nie są dostępne w tym samym zadaniu.

Skrypty są doskonałe, gdy chcesz wykonać coś, co nie jest obsługiwane przez zadanie, takie jak wywoływanie niestandardowego interfejsu API REST i analizowanie odpowiedzi.

Użyjesz polecenia rejestrowania task.setvariable , aby ustawić zmienne w skryptach programu PowerShell i powłoki Bash .

Uwaga

Zadania wdrażania używają innej składni dla zmiennych wyjściowych. Aby dowiedzieć się więcej o obsłudze zmiennych wyjściowych w zadaniach wdrażania, zobacz Zadania wdrażania.

Aby użyć zmiennej z warunkiem w potoku, zobacz Określanie warunków.

O task.setvariable

Po dodaniu zmiennej z task.setvariableprogramem następujące zadania mogą używać zmiennej przy użyciu składni $(myVar)makr . Zmienna będzie domyślnie dostępna tylko dla zadań podrzędnych w tym samym zadaniu. Jeśli dodasz parametr isoutput, składnia w celu wywołania zmiennej ulegnie zmianie. Zobacz Ustawianie zmiennej wyjściowej do użycia w tym samym zadaniu.

Ustaw zmienną myVar z wartością foo.

- bash: |
    echo "##vso[task.setvariable variable=myVar;]foo"

Odczyt zmiennej myVar:

- bash: |
    echo "You can use macro syntax for variables: $(myVar)"

Ustawianie właściwości zmiennej

Polecenie task.setvariable zawiera właściwości ustawiania zmiennej jako wpisu tajnego, jako zmiennej wyjściowej i jako tylko do odczytu. Dostępne właściwości obejmują:

  • variable = nazwa zmiennej (wymagane)
  • issecret = wartość logiczna (opcjonalna, domyślna wartość false)
  • isoutput = wartość logiczna (opcjonalna, domyślna wartość false)
  • isreadonly = wartość logiczna (opcjonalna, domyślna wartość false)

Aby użyć zmiennej w następnym etapie, ustaw isoutput właściwość na truewartość . Aby odwołać się do zmiennej z ustawioną isoutput wartością true, dołączysz nazwę zadania. Na przykład $(TaskName.myVar).

Po ustawieniu zmiennej jako tylko do odczytu nie można jej zastąpić przez podrzędne zadania. Ustaw wartość opcji isreadonly na true. Ustawienie zmiennej jako tylko do odczytu zwiększa bezpieczeństwo, dzięki czemu ta zmienna jest niezmienna.

Ustawianie zmiennej jako wpisu tajnego

Po issecret ustawieniu wartości true wartość zmiennej zostanie zapisana jako wpis tajny i zamaskowana z dzienników.

Uwaga

Usługa Azure Pipelines podejmuje próbę maskowania wpisów tajnych podczas emitowania danych do dzienników potoku, dzięki czemu mogą być widoczne dodatkowe zmienne i dane maskowane w danych wyjściowych i dziennikach, które nie są ustawione jako wpisy tajne.

Ustaw zmienną wpisu tajnego mySecretVal.

- bash: |
    echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"

Pobierz zmienną wpisu tajnego mySecretVal.

- bash: |
    echo "##vso[task.setvariable variable=mySecretVal;issecret=true]secretvalue"
- bash: |
    echo $(mySecretVal)

Dane wyjściowe zmiennej tajnej w powłoce bash.

Zrzut ekranu przedstawiający dane wyjściowe zmiennej bash.

Poziomy zmiennych wyjściowych

Istnieją cztery różne typy zmiennych wyjściowych z różnymi składniami:

Ustawianie zmiennej wyjściowej do użycia w tym samym zadaniu

Jeśli używasz zmiennej wyjściowej w tym samym zadaniu, nie musisz używać isoutput właściwości . Domyślnie zmienna będzie dostępna dla kroków podrzędnych w ramach tego samego zadania. Jeśli jednak dodasz isoutput właściwość, musisz odwołać się do zmiennej o nazwie zadania.

Skrypt ustawia tutaj zmienną myJobVar wyjściową tego samego zadania bez określania isoutput i ustawiania za myOutputJobVar pomocą polecenia 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

Ten skrypt pobiera zmienne myJobVar tego samego zadania i myOutputJobVar. Zwróć uwagę, że składnia zmienia się na potrzeby odwoływania się do zmiennej wyjściowej po isoutput=true dodaniu.

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)

Ustawianie zmiennej wyjściowej do użycia w przyszłych zadaniach

Jeśli używasz zmiennych wyjściowych między zadaniami, odwołujesz się do nich za pomocą dependenciespolecenia . Składnia uzyskiwania dostępu do zmiennej wyjściowej w przyszłym zadaniu lub etapie różni się w zależności od relacji między elementem ustawiającym a odbiorcą zmiennej. Dowiedz się więcej o każdym przypadku w zależnościach.

Najpierw ustaw zmienną myOutputVarwyjściową .

jobs:
- job: A
  steps:
  - bash: |
     echo "##vso[task.setvariable variable=myOutputVar;isoutput=true]this is from job A"
    name: passOutput

Następnie uzyskaj dostęp myOutputVar w przyszłym zadaniu i wyprowadź zmienną jako myVarFromJobA. Aby użyć dependenciespolecenia , należy ustawić dependsOn właściwość w przyszłym zadaniu przy użyciu nazwy poprzedniego zadania, w którym została ustawiona zmienna wyjściowa.

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)

Ustawianie zmiennej wyjściowej do użycia w przyszłych etapach

Zmienne wyjściowe mogą być używane między etapami w potokach. Możesz użyć zmiennych wyjściowych, aby przekazać przydatne informacje, takie jak identyfikator wygenerowanego danych wyjściowych, od jednego etapu do następnego.

Po ustawieniu zmiennej isoutput za pomocą właściwości można odwoływać się do tej zmiennej w późniejszych etapach z nazwą zadania i składnią stageDependencies . Dowiedz się więcej o zależnościach.

Zmienne wyjściowe są dostępne tylko w następnym etapie podrzędnym. Jeśli wiele etapów używa tej samej zmiennej wyjściowej, użyj dependsOn warunku .

Najpierw ustaw zmienną myStageValwyjściową .

steps:
  - bash: echo "##vso[task.setvariable variable=myStageVal;isOutput=true]this is a stage output variable"
    name: MyOutputVar

Następnie w przyszłym etapie zamapuj zmienną wyjściową na zmienną myStageVal etapową, zadanie lub zmienną o zakresie zadań, na przykład myStageAVar. Zwróć uwagę, że składnia mapowania używa wyrażenia $[] środowiska uruchomieniowego i śledzi ścieżkę z stageDependencies do zmiennej wyjściowej przy użyciu nazwy etapu (A) i nazwy zadania (A1), aby w pełni zakwalifikować zmienną.

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)

Jeśli wartość zawiera nowe linie, możesz je uniknąć, a agent automatycznie go usunie:

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

Często zadawane pytania

Moja zmienna wyjściowa nie renderuje. Co się dzieje źle?

Istnieje kilka powodów, dla których zmienna wyjściowa może nie być wyświetlana.

  • Zmienne wyjściowe ustawione za pomocą isoutput polecenia nie są dostępne w tym samym zadaniu, a zamiast tego są dostępne tylko w zadaniach podrzędnych.
  • W zależności od używanej składni zmiennej zmienna określająca wartość zmiennej wyjściowej może nie być dostępna w czasie wykonywania. Na przykład zmienne ze składnią makr ($(var)) są przetwarzane przed uruchomieniem zadania. Natomiast zmienne ze składnią szablonu są przetwarzane w czasie wykonywania ($[variables.var]). Zwykle podczas ustawiania zmiennych wyjściowych należy używać składni środowiska uruchomieniowego. Aby uzyskać więcej informacji na temat składni zmiennych, zobacz Definiowanie zmiennych.
  • W wyrażeniu mogą znajdować się dodatkowe spacje. Jeśli zmienna nie jest renderowa, sprawdź dodatkowe spacje otaczające isOutput=true.

Aby rozwiązać problemy z dependencies danymi wyjściowymi zadania potoku lub etapu, możesz dodać zmienną dla zależności, a następnie wydrukować zmienną. Na przykład w tym zadaniu A potoku ustawia zmienną MyTaskwyjściową . Drugie zadanie (B) zależy od zadania A. Nowa zmienna deps zawiera reprezentację JSON zależności zadania. Drugi krok w obszarze Zadanie B używa programu PowerShell do wyświetlenia zależności deps zadania.

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