Поделиться через


Безопасное использование переменных и параметров в конвейере

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

Узнайте, как безопасно использовать переменные и параметры для сбора входных данных от пользователей конвейера. Дополнительные сведения см. в следующих статьях:

Соблюдайте осторожность с секретными переменными. Рекомендуемые методы настройки секретных переменных включают использование пользовательского интерфейса, создание группы переменных или использование группы переменных, исходной из Azure Key Vault. Дополнительные сведения см. в разделе "Задание секретных переменных".

Переменные

Переменные служат удобным способом для сбора входных данных пользователей и упрощения передачи данных между шагами конвейера. Однако при работе с переменными следует соблюдать осторожность. По умолчанию только что созданные переменные, определенные в YAML или скрипте, являются чтением и записью. Подчиненные шаги могут неожиданно изменять значения переменных.

Например, рассмотрим следующий фрагмент скрипта:

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

Если предыдущий шаг задан MyConfig Debug & deltree /y c:, это может привести к непредвиденным последствиям. Хотя этот пример просто удаляет содержимое агента сборки, он подчеркивает потенциальную опасность таких параметров.

Переменные можно сделать только для чтения. Системные переменные, такие как Build.SourcesDirectory, выходные переменные задачи и переменные времени очереди всегда доступны только для чтения. Переменные, созданные в YAML или созданные во время выполнения скриптом, могут быть назначены только для чтения. Когда скрипт или задача создают новую переменную, она может передать isReadonly=true флаг в своей команде ведения журнала, чтобы сделать переменную доступной только для чтения.

В YAML можно указать переменные, доступные только для чтения, с помощью следующего ключа:

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

Переменные во время очереди

При определении переменной в редакторе пользовательского интерфейса Pipelines пользователи могут переопределить его значение во время выполнения конвейера. Эти переменные называются переменными во время очереди и всегда определяются в редакторе пользовательского интерфейса Pipelines.

Снимок экрана: определение переменной времени очереди.

Переменные во время очереди предоставляются конечному пользователю при выполнении конвейера вручную, и они могут изменять свои значения. Снимок экрана: обновление значения переменной времени очереди.

Пользователям требуется разрешение на изменение конфигурации сборки очереди в конвейере, чтобы указать переменные, заданные во время очереди.

Ограничить переменные, которые можно задать во время ожидания

Пользовательский интерфейс и REST API, используемые для запуска конвейера, позволяют пользователям определять новые переменные во время очереди.

Снимок экрана: добавление переменной времени очереди непосредственно перед запуском конвейера.

В ранние дни Azure Pipelines эта функция имела следующие проблемы:

  • Он позволил пользователям определять новые переменные, которые еще не определены автором конвейера в определении.
  • Это позволяло пользователям переопределять системные переменные.

Для решения этих проблем мы определили параметр, ограничивающий переменные, которые можно задать во время очереди. Если этот параметр включен, можно задать только те переменные, которые явно помечены как Settable во время очереди. Другими словами, можно задать любые переменные во время очереди, если этот параметр не включен.

Этот параметр предназначен для работы на уровнях организации и проекта.

  • Уровень организации:
    • Если параметр включен, он применяет, что только переменные, явно помеченные как Settable во время очереди, могут быть изменены для всех конвейеров во всех проектах в организации.
    • Администраторы коллекции проектов могут включить или отключить этот параметр.
    • Получите доступ к этому параметру в разделе "Параметры конвейеров>> организации". Снимок экрана: ограничение переменных, которые могут быть заданы во время очереди на уровне организации.
  • Уровень проекта:
    • Как и на уровне организации, включение этого параметра гарантирует, что для всех конвейеров в определенном проекте можно изменить только переменные, помеченные как Settable во время очереди.
    • Если параметр уровня организации включен, он применяется ко всем проектам и не может быть отключен.
    • Администраторы проектов могут включить или отключить этот параметр.
    • Получите доступ к этому параметру в разделе "Параметры конвейеров>>проекта". Снимок экрана: ограничение переменных, которые могут быть заданы во время очереди на уровне проекта.

В следующем примере показано, что параметр включен, и конвейер определяет переменную с именем my_variable , которая не задана во время очереди. Снимок экрана: определение переменной в классическом конвейере.

Затем предположим, что вы хотите запустить конвейер. На панели "Переменные" не отображаются переменные , а кнопка "Добавить переменную " отсутствует.

Снимок экрана: панель переменных с параметром включено.

Использование сборок — очередь и запуск вызовов REST API конвейера для очереди выполнения конвейера и задания значения my_variable новой переменной завершается ошибкой, аналогичной приведенной ниже.

{
  "$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
}

Параметры

В отличие от переменных, выполняющийся конвейер не может изменять параметры конвейера. Параметры имеют такие типы данных, как number и string, и они могут быть ограничены определенными подмножествами значений. Это ограничение полезно, если настраиваемый пользователем аспект конвейера должен принимать только значения из предопределенного списка, гарантируя, что конвейер не принимает произвольные данные.

Включение проверки параметров аргументов задач оболочки

Конвейеры могут ссылаться на задачи, выполняемые в конвейере. Некоторые задачи включают arguments параметр, позволяющий указать дополнительные параметры для задачи.

Если включена проверка параметра "Включить аргументы задач оболочки", параметр аргументов проходит проверку, чтобы убедиться, что оболочка правильно выполняет такие символы, как запятая, кавычки и скобки. Как и переменные ограничения, которые можно задать в параметре времени очереди, можно настроить проверку аргументов параметров оболочки на уровне организации или проекта в разделе "Параметры>конвейеров".>

Если эта функция включена, все проблемы проверки, связанные с arguments параметром, вызывают сообщение об ошибке, например следующее:

Detected characters in arguments that may not be executed correctly by the shell. Please escape special characters using backtick (`).

Чтобы устранить эту проблему, настройте аргументы, экранируя специальные символы, как указано в сообщении об ошибке. Эта проверка применяется к параметру arguments в следующих конкретных задачах:

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

Следующие шаги