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.
Około task.setvariable
Po dodaniu zmiennej z task.setvariable
programem 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 true
wartość . 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.
Poziomy zmiennych wyjściowych
Istnieją cztery różne typy zmiennych wyjściowych z różnymi składniami:
- Zmienne wyjściowe ustawione w tym samym zadaniu bez parametru
isoutput
. Aby odwołać się do tych zmiennych, użyjesz składni makr. Przykład:$(myVar)
. - Zmienne wyjściowe ustawione w tym samym zadaniu za pomocą parametru
isoutput
. Aby odwołać się do tych zmiennych, dołączysz nazwę zadania. Przykład:$(myTask.myVar)
. - Zmienne wyjściowe ustawione w przyszłym zadaniu. Aby odwołać się do tych zmiennych, należy odwołać się do zmiennej
variables
w sekcji ze składniądependency
. - Zmienne wyjściowe ustawione na przyszłych etapach. Aby odwołać się do tych zmiennych, należy odwołać się do zmiennej
variables
w sekcji ze składniąstageDependencies
.
Uwaga
Przyszłe etapy lub zadania mogą uzyskiwać dostęp tylko do zmiennych wyjściowych, jeśli zależą one od etapu lub zadania, w którym została ustawiona zmienna. Aby udostępnić zmienną wyjściową, upewnij się, że następny etap lub zadanie zależy od etapu lub zadania, w którym została utworzona zmienna. Jeśli wiele etapów lub zadań musi używać tej samej zmiennej wyjściowej, użyj dependsOn
warunku , aby ustanowić tę zależność.
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ą dependencies
polecenia . 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ą myOutputVar
wyjś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ć dependencies
polecenia , 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ą myStageVal
wyjś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ą MyTask
wyjś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)"