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


Добавление этапов, зависимостей и условий

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

Этап — это логическая граница в конвейере Azure DevOps. Этапы можно использовать для группирования действий в процессе разработки программного обеспечения (например, сборка приложения, выполнение тестов, развертывание в предварительной версии). Каждый этап содержит одно или несколько заданий.

При определении нескольких этапов конвейера по умолчанию они выполняются один после другого. Этапы также могут зависеть друг от друга. Ключевое dependsOn слово можно использовать для определения зависимостей. Этапы также могут выполняться на основе результата предыдущего этапа с условиями.

Сведения о том, как этапы работают с параллельными заданиями и лицензированием, см. в статье "Настройка и оплата параллельных заданий".

Сведения о том, как этапы связаны с другими частями конвейера, такими как задания, см . в основных понятиях конвейеров.

Дополнительные сведения о том, как этапы связаны с частями конвейера в статье о стадиях схемы YAML.

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

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

Примечание.

Добавлена поддержка этапов в Azure DevOps Server 2019.1.

Указание этапов

Примечание.

Добавлена поддержка этапов в Azure DevOps Server 2019.1.

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

# this has one implicit stage and one implicit job
pool:
  vmImage: 'ubuntu-latest'
steps:
- bash: echo "Hello world"
# this pipeline has one implicit stage
jobs:
- job: A
  steps:
  - bash: echo "A"

- job: B
  steps:
  - bash: echo "B"

При организации конвейера на нескольких этапах используется ключевое stages слово.

stages:
- stage: A
  jobs:
  - job: A1
  - job: A2

- stage: B
  jobs:
  - job: B1
  - job: B2

Если вы решили указать на pool уровне этапа, то все задания, определенные на этом этапе, используют этот пул, если не указано на уровне задания.

Примечание.

В Azure DevOps Server 2019 пулы могут быть указаны только на уровне задания.

stages:
- stage: A
  pool: StageAPool
  jobs:
  - job: A1 # will run on "StageAPool" pool based on the pool defined on the stage
  - job: A2 # will run on "JobPool" pool
    pool: JobPool

Полный синтаксис для указания этапа:

stages:
- stage: string  # name of the stage, A-Z, a-z, 0-9, and underscore
  displayName: string  # friendly name to display in the UI
  dependsOn: string | [ string ]
  condition: string
  pool: string | pool
  variables: { string: string } | [ variable | variableReference ] 
  jobs: [ job | templateReference]

Указание зависимостей

Примечание.

Добавлена поддержка этапов в Azure DevOps Server 2019.1.

При определении нескольких этапов конвейера по умолчанию они выполняются последовательно в том порядке, в котором они определяются в YAML-файле. Исключением из этого является добавление зависимостей. При использовании зависимостей этапы выполняются в порядке dependsOn требований.

Конвейеры должны содержать по крайней мере один этап без зависимостей.

Синтаксис определения нескольких этапов и их зависимостей:

stages:
- stage: string
  dependsOn: string
  condition: string

Примеры этапов, которые выполняются последовательно:

# if you do not use a dependsOn keyword, stages run in the order they are defined
stages:
- stage: QA
  jobs:
  - job:
    ...

- stage: Prod
  jobs:
  - job:
    ...

Примеры этапов, которые выполняются параллельно:

stages:
- stage: FunctionalTest
  jobs:
  - job:
    ...

- stage: AcceptanceTest
  dependsOn: []    # this removes the implicit dependency on previous stage and causes this to run in parallel
  jobs:
  - job:
    ...

Пример вентилятора и вентилятора:

stages:
- stage: Test

- stage: DeployUS1
  dependsOn: Test    # this stage runs after Test

- stage: DeployUS2
  dependsOn: Test    # this stage runs in parallel with DeployUS1, after Test

- stage: DeployEurope
  dependsOn:         # this stage runs after DeployUS1 and DeployUS2
  - DeployUS1
  - DeployUS2

Определение условий

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

Если вы настраиваете условие по умолчанию предыдущих шагов для этапа, удалите условия завершения и успешности. Таким образом, если вы используете настраиваемое условие, обычно используется and(succeeded(),custom_condition) для проверки успешности выполнения предыдущего этапа. В противном случае этап выполняется независимо от результата предыдущего этапа.

Примечание.

Условия сбоя ('JOBNAME/STAGENAME') и успешно завершены ('JOBNAME/STAGENAME'), как показано в следующем примере, работают только для конвейеров YAML.

Примечание.

Добавлена поддержка этапов в Azure DevOps Server 2019.1.

Пример запуска этапа на основе состояния выполнения предыдущего этапа:

stages:
- stage: A

# stage B runs if A fails
- stage: B
  condition: failed()

# stage C runs if B succeeds
- stage: C
  dependsOn:
  - A
  - B
  condition: succeeded('B')

Пример использования настраиваемого условия:

stages:
- stage: A

- stage: B
  condition: and(succeeded(), eq(variables['build.sourceBranch'], 'refs/heads/main'))

Указание политик очередей

Конвейеры YAML не поддерживают политики очереди. Каждый запуск конвейера не зависит от других запусков. Другими словами, две последовательные фиксации могут активировать два конвейера, и оба из них будут выполнять одну и ту же последовательность этапов, не ожидая друг друга. Хотя мы работаем над переносом политик очередей в конвейеры YAML, рекомендуется использовать утверждения вручную для ручной последовательности и управления порядком выполнения, если это важно.

Указание утверждений

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

В настоящее время проверки утверждения вручную поддерживаются в средах. Дополнительные сведения см. в разделе "Утверждения".

Утверждения пока не поддерживаются в конвейерах YAML в этой версии Azure DevOps Server.

Добавление триггера вручную

Этапы конвейера YAML вручную позволяют иметь единый конвейер, не выполняя его до завершения.

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

Чтобы использовать эту функцию, добавьте trigger: manual свойство на сцену.

В следующем примере этап разработки выполняется автоматически, а этап рабочей среды требует активации вручную. Оба этапа запускают скрипт вывода hello world.

stages:
- stage: development
  displayName: Deploy to development
  jobs:
  - job: DeployJob
    steps:
    - script: echo 'hello, world'
      displayName: 'Run script'
- stage: production
  displayName: Deploy to production
  trigger: manual
  jobs:
  - job: DeployJob
    steps:
    - script: echo 'hello, world'
      displayName: 'Run script'

Пометить сцену как неуправляемую

Пометьте этап, чтобы isSkippable: false запретить пользователям конвейера пропускать этапы. Например, у вас может быть шаблон YAML, который внедряет этап, который выполняет обнаружение вредоносных программ во всех конвейерах. Если вы настроили isSkippable: false этот этап, конвейер не сможет пропустить обнаружение вредоносных программ.

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

- stage: malware_detection
  displayName: Malware detection
  isSkippable: false
  jobs:
  - job: check_job
    ...

Если этап не пропускается, он будет отображаться с отключенным флажком на этапе запуска панели конфигурации.

Снимок экрана: этапы запуска с отключенным этапом.