Jak bezpiecznie używać zmiennych i parametrów w potoku

Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020

W tym artykule omówiono sposób bezpiecznego używania zmiennych i parametrów do zbierania danych wejściowych od użytkowników potoku. Jeśli chcesz dowiedzieć się więcej na temat używania zmiennych i parametrów, zobacz:

Zachowaj ostrożność ze zmiennymi tajnymi. Zalecane sposoby ustawiania zmiennych tajnych znajdują się w interfejsie użytkownika, w grupie zmiennych i w grupie zmiennych z usługi Azure Key Vault. Aby uzyskać więcej informacji, zobacz ustawianie zmiennych tajnych.

Zmienne

Zmienne mogą być wygodnym sposobem zbierania informacji od użytkownika z góry. Możesz również użyć zmiennych do przekazywania danych z kroku do kroku w potoku.

Należy jednak używać zmiennych z ostrożnością. Nowo utworzone zmienne, niezależnie od tego, czy są zdefiniowane w języku YAML, czy zapisywane przez skrypt, są domyślnie odczytywane i zapisywane. Krok podrzędny może zmienić wartość zmiennej w sposób, którego nie oczekujesz.

Na przykład skrypt odczytuje:

msbuild.exe myproj.proj -property:Configuration=$(MyConfig)

Poprzedni krok może mieć wartość MyConfigDebug & deltree /y c:. Chociaż w tym przykładzie usunięto tylko zawartość agenta kompilacji, można sobie wyobrazić, jak to ustawienie może stać się znacznie bardziej niebezpieczne.

Zmienne można tworzyć tylko do odczytu. Zmienne systemowe, takie jak Build.SourcesDirectory, zmienne wyjściowe zadania i zmienne czasu kolejki są zawsze tylko do odczytu. Zmienne tworzone w języku YAML lub tworzone w czasie wykonywania przez skrypt można wyznaczyć jako tylko do odczytu. Gdy skrypt lub zadanie tworzy nową zmienną, może przekazać isReadonly=true flagę w poleceniu rejestrowania, aby zmienna była tylko do odczytu.

W języku YAML można określić zmienne tylko do odczytu przy użyciu określonego klucza:

variables:
- name: myReadOnlyVar
  value: myValue
  readonly: true

Zmienne czasu kolejki

Podczas definiowania zmiennej w edytorze interfejsu użytkownika potoków można zezwolić użytkownikom na zastąpienie jej wartości podczas uruchamiania potoku. Nazywamy taką zmienną zmienną czasową kolejki. Zmienne czasu kolejki są zawsze definiowane w edytorze interfejsu użytkownika potoków.

Zrzut ekranu przedstawiający definiowanie zmiennej czasu kolejki.

Zmienne czasu kolejki są widoczne dla użytkownika końcowego podczas ręcznego uruchamiania potoku i mogą zmieniać swoje wartości. Zrzut ekranu przedstawiający aktualizowanie wartości zmiennej czasu kolejki.

Użytkownicy potrzebują uprawnienia do edytowania konfiguracji kompilacji kolejki w potoku, aby określić zmienne ustawione w czasie kolejki.

Ogranicz zmienne, które można ustawić w czasie kolejki

Interfejs użytkownika i interfejs API REST używany do uruchamiania potoku zapewniają użytkownikom możliwość definiowania nowych zmiennych w czasie kolejki.

Zrzut ekranu przedstawiający dodawanie zmiennej czasu kolejki tuż przed uruchomieniem potoku.

W początkowym okresie usługi Azure Pipelines ta funkcja miała pewne problemy:

  • Umożliwia to użytkownikom definiowanie nowych zmiennych, które nie są jawnie zdefiniowane przez autora potoku w definicji.
  • Umożliwiło to użytkownikom zastępowanie zmiennych systemowych.

Aby rozwiązać te problemy, zdefiniowaliśmy ustawienie ograniczające zmienne, które można ustawiać w czasie kolejki. Po włączeniu tego ustawienia można ustawić tylko te zmienne, które są jawnie oznaczone jako „Możliwe do ustawienie w czasie kolejki”. Oznacza to, że można ustawić dowolne zmienne w czasie kolejki, chyba że to ustawienie jest włączone.

Ustawienie jest przeznaczone do pracy na poziomie organizacji i na poziomie projektu.

  1. Poziom organizacji. Gdy ustawienie jest włączone, wymusza, że dla wszystkich potoków we wszystkich projektach w organizacji można ustawić tylko te zmienne, które są jawnie oznaczone jako "Settable at queue time". Gdy ustawienie jest wyłączone, każdy projekt może wybrać, czy ograniczyć zmienne ustawione w czasie kolejki, czy nie. To ustawienie jest przełącznikiem w obszarze Organizacja Ustawienia —> Potoki —> Ustawienia. Tylko Administracja istratory kolekcji projektów mogą ją włączać lub wyłączać. Zrzut ekranu przedstawiający ograniczanie zmiennych, które można ustawić w czasie kolejki na poziomie organizacji.
  2. Poziom projektu. Gdy ustawienie jest włączone, wymusza, że dla wszystkich potoków w projekcie można ustawić tylko te zmienne, które są jawnie oznaczone jako "Settable at queue time". Jeśli ustawienie jest włączone na poziomie organizacji, jest włączone dla wszystkich projektów i nie można go wyłączyć. Ustawienie to przełącznik w obszarze Project Ustawienia —> Pipelines —> Ustawienia. Tylko Administracja istratory projektu mogą ją włączać lub wyłączać. Zrzut ekranu przedstawiający ograniczanie zmiennych, które można ustawić w czasie kolejki na poziomie projektu.

Przyjrzyjmy się przykładowi. Załóżmy, że ustawienie jest włączone, a potok definiuje zmienną o nazwie my_variable , która nie jest ustawiana w czasie kolejki. Zrzut ekranu przedstawiający definiowanie zmiennej w potoku klasycznym.

Następnie załóżmy, że chcesz uruchomić potok. Na panelu Zmienne nie są wyświetlane żadne zmienne, a brak przycisku Dodaj zmienną .

Zrzut ekranu przedstawiający panel zmiennych z ustawieniem włączonym.

Przy użyciu kompilacji — kolejki i przebiegów — wywołania interfejsu API REST potoku uruchamiania w celu kolejkowania uruchomienia potoku i ustawienia wartości my_variable lub nowej zmiennej zakończy się niepowodzeniem z powodu błędu podobnego do poniższego.

{
  "$id": "1",
  "innerException": null,
  "message": "You can't set the following variables (my_variable). If you want to be able to set these variables, then edit the pipeline and select Settable at queue time on the variables tab of the pipeline editor.",
  "typeName": "Microsoft.Azure.Pipelines.WebApi.PipelineValidationException, Microsoft.Azure.Pipelines.WebApi",
  "typeKey": "PipelineValidationException",
  "errorCode": 0,
  "eventId": 3000
}

Parametry

W przeciwieństwie do zmiennych parametry potoku nie mogą być zmieniane przez potok podczas jego działania. Parametry mają typy danych, takie jak number i string, i mogą być ograniczone do podzestawu wartości. Ograniczenie parametrów jest przydatne, gdy część potoku konfigurowalna przez użytkownika powinna przyjmować wartość tylko z listy ograniczonej. Konfiguracja gwarantuje, że potok nie będzie przyjmować dowolnych danych.

Włączanie walidacji parametrów argumentów zadań powłoki

Potoki mogą odwoływać się do zadań wykonywanych w potoku. Kilka zadań uwzględnionych w usłudze Azure DevOps ma parametr argumentów, który umożliwia określenie większej liczby opcji zadania.

Po włączeniu sprawdzania poprawności parametru Włącz argumenty zadań powłoki parametr argumenty są sprawdzane pod kątem znaków, które mogą nie być wykonywane poprawnie przez powłokę. Przykładowe znaki obejmują średniki, cudzysłowy i nawiasy.

Podobnie jak w przypadku opcji Ogranicz zmienne, które można ustawić w czasie kolejki, sprawdzanie poprawności parametrów zadań powłoki można skonfigurować na poziomie organizacji na poziomie Ustawienia> Pipelines> Ustawienia lub na poziomie projektu na poziomie Ustawienia> Pipelines Ustawienia>.

Po włączeniu wykrytego problemu z walidacją jest rejestrowany komunikat o błędzie podobny do następującego: Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`).

Aby rozwiązać ten problem, dostosuj argumenty, uciekając przed znakami specjalnymi, jak wskazano w komunikacie o błędzie.

Po włączeniu walidacji parametru Włącz argumenty zadań powłoki walidacja jest stosowana do parametru argumentów w następujących zadaniach.

  • PowerShell
  • BatchScript
  • Bash
  • Ssh
  • AzureFileCopy
  • WindowsMachineFileCopy

Następne kroki

Po zabezpieczeniu danych wejściowych należy również zabezpieczyć udostępnioną infrastrukturę.