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


Типы задач и использование задач

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

Задача выполняет действие в конвейере и представляет собой упакованный скрипт или процедуру, абстрагированную с набором входных данных. Задачи — это стандартные блоки для определения автоматизации в конвейере.

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

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

Вы можете по желанию использовать целевые точки шагов для управления контекстом для отдельной задачи.

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

Дополнительные сведения об общих атрибутах, поддерживаемых задачами, см. в руководстве YAML для steps.task.

Пользовательские задачи

Azure DevOps включает встроенные задачи для обеспечения основных сценариев сборки и развертывания. Вы также можете создать собственную пользовательскую задачу.

Кроме того, Visual Studio Marketplace предлагает множество расширений. Каждый из которых при установке в подписку или коллекцию расширяет каталог задач одним или несколькими задачами. Вы также можете написать собственные пользовательские расширения для добавления задач в Azure Pipelines.

В конвейерах YAML вы ссылаетесь на задачи по имени. Если имя соответствует как встроенной задаче, так и настраиваемой задаче, то встроенная задача имеет приоритет. Чтобы избежать этого риска, можно использовать GUID задачи или полное имя для настраиваемой задачи:

steps:
- task: myPublisherId.myExtensionId.myContributionId.myTaskName@1 #format example
- task: qetza.replacetokens.replacetokens-task.replacetokens@3 #working example

Чтобы найти myPublisherId и myExtensionId, выберите команду "Получить" для задачи на площадке. Значения после itemName в вашей строке URL-адреса - это myPublisherId и myExtensionId. Вы также можете найти полное имя, добавив задачу в конвейер релиза и выбрав Посмотреть YAML при редактировании задачи.

Версии задач

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

При выпуске новой дополнительной версии (например, 1.2–1.3) конвейер автоматически использует новую версию. Однако если выпущена новая основная версия (например, 2.0), конвейер продолжает использовать основную версию, указанную до тех пор, пока не измените конвейер и вручную не измените новую основную версию. Журнал будет содержать предупреждение о доступности новой основной версии.

Вы можете указать, какая дополнительная версия будет использоваться, указав полный номер версии задачи после знака @ (например: GoTool@0.3.1). Вы можете использовать только версии задач, которые существуют для вашей организации.

В YAML в имени задачи укажите основную версию с помощью @. Например, чтобы закрепить до версии 2 PublishTestResults задачи:

steps:
- task: PublishTestResults@2

Параметры управления задачами

Каждая задача предлагает некоторые параметры управления.

Параметры управления доступны в качестве ключей в task разделе.

- task: string # Required as first property. Name of the task to run.
  inputs: # Inputs for the task.
    string: string # Name/value pairs
  condition: string # Evaluate this condition expression to determine whether to run this task.
  continueOnError: boolean # Continue running even on failure?
  displayName: string # Human-readable name for the task.
  target: string | target # Environment in which to run this task.
  enabled: boolean # Run this task when the job runs?
  env: # Variables to map into the process's environment.
    string: string # Name/value pairs
  name: string # ID of the step.
  timeoutInMinutes: string # Time to wait for this task to complete before the server kills it.

Параметры управления доступны в качестве ключей в task разделе.

- task: string # Required as first property. Name of the task to run.
  inputs: # Inputs for the task.
    string: string # Name/value pairs
  condition: string # Evaluate this condition expression to determine whether to run this task.
  continueOnError: boolean # Continue running even on failure?
  displayName: string # Human-readable name for the task.
  target: string | target # Environment in which to run this task.
  enabled: boolean # Run this task when the job runs?
  env: # Variables to map into the process's environment.
    string: string # Name/value pairs
  name: string # ID of the step.
  timeoutInMinutes: string # Time to wait for this task to complete before the server kills it.
  retryCountOnTaskFailure: string # Number of retries if the task fails.

Примечание.

Определенная задача или задание не может в одностороннем порядке решить, продолжается ли задание или этап. Что можно сделать — это предоставить статус успешного или неудачного выполнения, и подчиненные задачи и задания имеют проверку условий, которая позволяет им решать, следует ли их выполнению происходить. Условие по умолчанию, которое эффективно выполняется, если мы находитесь в успешном состоянии.

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

Период времени ожидания начинается при запуске задачи. Это не включает время, когда задача либо находится в очереди, либо ожидает агента.

Примечание.

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

В этом YAML PublishTestResults@2 выполняется даже если предыдущий шаг завершается ошибкой, из-за условия succeededOrFailed().

steps:
- task: UsePythonVersion@0
  inputs:
    versionSpec: '3.x'
    architecture: 'x64'
- task: PublishTestResults@2
  inputs:
    testResultsFiles: "**/TEST-*.xml"
  condition: succeededOrFailed()

Условия

  • Только если все предыдущие прямые и косвенные зависимости с одинаковым пулом агентов успешны. Если у вас есть разные пулы агентов, эти этапы или задания выполняются одновременно. Это условие по умолчанию, если условие не задано в YAML.

  • Даже если предыдущая зависимость завершается ошибкой, за исключением случаев, когда выполнение отменено. Используйте succeededOrFailed() в YAML для этого условия.

  • Даже если предыдущая зависимость претерпевает сбой, и даже если запуск отменён. Используйте always() в YAML для этого условия.

  • Только если предыдущая зависимость дает сбой. Используйте failed() в YAML для этого условия.

Целевой объект шага

Задачи выполняются в контексте выполнения, который является узлом агента или контейнером. Отдельный шаг может переопределить его контекст, указав параметр target. Доступные варианты — это слово host, предназначенное для хоста агента и любых контейнеров, определенных в конвейере. Например:

resources:
  containers:
  - container: pycontainer
    image: python:3.11

steps:
- task: SampleTask@1
  target: host
- task: AnotherTask@1
  target: pycontainer

Здесь SampleTask выполняется на узле, а AnotherTask выполняется в контейнере.

Количество повторов, если задача завершилась сбоем

Используется retryCountOnTaskFailure для указания количества повторных попыток, если задача завершается ошибкой. Значение по умолчанию равно нулю повторных попыток. Для получения дополнительной информации о свойствах задачи см. steps.task в схеме YAML.

- task: <name of task>
  retryCountOnTaskFailure: <max number of retries>
   ...

Примечание.

  • Требуется агент версии 2.194.0 или более поздней. В Azure DevOps Server 2022 повторные попытки не поддерживаются для задач без агента. Дополнительные сведения см. в обновлении службы Azure DevOps от 16 ноября 2021 г. — автоматическое повторное выполнение задачи и обновлении службы Azure DevOps от 14 июня 2025 г. — повторное выполнение задач сервера.
  • Максимально допустимое число повторных попыток — 10.
  • Время ожидания между каждой повторной попыткой увеличивается после каждой неудачной попытки, следуя экспоненциальной схеме откладывания. 1-й повтор происходит через 1 секунду, 2-е повторение через 4 секунды, а 10-й повтор после 100 секунд.
  • Нет предположений об идемпотентности задачи. Если задача имеет побочные эффекты (например, если она частично создала внешний ресурс), она может завершиться сбоем во второй раз при запуске.
  • Нет сведений о количестве повторных попыток, доступных для задачи.
  • Предупреждение добавляется в журналы задач, указывающее, что он завершился сбоем перед повторным выполнением.
  • Все попытки повторить задачу отображаются в пользовательском интерфейсе в составе одного узла задачи.

Переменные среды

Каждая задача имеет env свойство, которое является списком строковых пар, представляющих переменные среды, сопоставленные с процессом задачи.

- task: AzureCLI@2
  displayName: Azure CLI
  inputs: # Specific to each task
  env:
    ENV_VARIABLE_NAME: value
    ENV_VARIABLE_NAME2: value
  ...

В следующем примере выполняется script шаг, который является шорткатом для задачи Command line, за которым следует эквивалентный синтаксис задачи. В этом примере присваивается значение переменной AZURE_DEVOPS_EXT_PAT среды, которая используется для проверки подлинности с помощью Azure DevOps CLI.

# Using the script shortcut syntax
- script: az pipelines variable-group list --output table
  env:
    AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)
  displayName: 'List variable groups using the script step'

# Using the task syntax
- task: CmdLine@2
  inputs:
    script: az pipelines variable-group list --output table
  env:
    AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)
  displayName: 'List variable groups using the command line task'

- task: Bash@3
  inputs:
     targetType: # specific to each task
  env:
    ENV_VARIABLE_NAME: value
    ENV_VARIABLE_NAME2: value
  ...

В следующем примере выполняется шаг script, который является сокращением для Bash@3, а затем приводится эквивалентный синтаксис задачи. В этом примере присваивается значение переменной ENV_VARIABLE_NAME среды и выводится это значение.

# Using the script shortcut syntax
- script: echo "This is " $ENV_VARIABLE_NAME
  env:
    ENV_VARIABLE_NAME: "my value"
  displayName: 'echo environment variable'

# Using the task syntax
- task: Bash@2
  inputs:
    script: echo "This is " $ENV_VARIABLE_NAME
  env:
    ENV_VARIABLE_NAME: "my value"
  displayName: 'echo environment variable'

Установщики средств сборки (Azure Pipelines)

Установщики инструментов позволяют конвейеру сборки устанавливать и управлять зависимостями. В частности, можно:

  • Установите средство или среду выполнения в режиме реального времени (даже с размещёнными агентами от Microsoft) в нужный момент для конвейера CI.

  • Проверьте приложение или библиотеку в нескольких версиях зависимости, например Node.js.

Например, можно настроить конвейер сборки для запуска и проверки приложения для нескольких версий Node.js.

Пример. Тестирование и проверка приложения на нескольких версиях Node.js

Создайте файл azure-pipelines.yml в базовом каталоге проекта со следующим содержимым.

pool:
  vmImage: ubuntu-latest

steps:
# Node install
- task: UseNode@1
  displayName: Node install
  inputs:
    version: '16.x' # The version we're installing
# Write the installed version to the command line
- script: which node

Создайте конвейер сборки и запустите его. Узнайте, как выполняется сборка. Установщик инструментов Node.js скачивает версию Node.js, если она еще не включена в агент. Скрипт командной строки регистрирует расположение версии Node.js на диске.

Задачи установщика инструментов

Список задач установщика инструментов см. в разделе "Задачи установщика инструментов".

Отключение встроенных задач и задач из Marketplace

На странице параметров организации можно отключить задачи Marketplace, встроенные задачи или оба варианта. Отключение задач Marketplace может помочь повысить безопасность конвейеров. Если вы отключаете как встроенные задачи, так и задачи из Marketplace, доступны только те задачи, которые установлены вами с помощью tfx.

Справка и поддержка