Как мне запустить один конвейер в конце другого? Использование примера из msdocs приводит к тому, что ввод ресурса конвейера должен быть допустимой ошибкой

Невозможно запустить конвейер после завершения другого конвейера

Оригинал

Я пытаюсь создать несколько конвейеров выпуска для наших приложений angular в конвейерах DevOps yaml. Мы используем рабочее пространство Nx, поэтому важно иметь возможность запускать эти конвейеры в конце сборки рабочего пространства.

Вот пример кода документа, предоставленного Microsoft (https://docs.microsoft.com/en-us/azure/devops/pipelines/process/pipeline-triggers?view=azure-devops&tabs=yaml)

# this is being defined in app-ci pipeline
resources:
  pipelines:
  - pipeline: securitylib   # Name of the pipeline resource
    source: security-lib-ci # Name of the triggering pipeline
    trigger: 
      branches:
      - releases/*
      - master

Вот мой полный конвейер на данный момент:

# Starter pipeline
# Start with a minimal pipeline that you can customize to build and deploy your code.
# Add steps that build, run tests, deploy, and more:
# https://aka.ms/yaml
trigger: none

resources:
  pipelines:
  - pipeline: WorkspaceBuild
    source: OtherPipeline
    project: CommonProject
    trigger: 
      branches: 
      - master
pool:
  vmImage: 'ubuntu-latest'

steps:

- task: DownloadBuildArtifacts@0
  inputs:
    buildType: 'current'
    downloadType: 'single'
    artifactName: 'web-framework'
    downloadPath: '$(System.ArtifactsDirectory)'

- script: |
    cd $(System.ArtifactsDirectory)
    dir .
  displayName: 'Run a one-line script'

- script: |
    echo Add other tasks to build, test, and deploy your project.
    echo See https://aka.ms/yaml
  displayName: 'Run a multi-line script'

Обновлять

Хорошо, исправление именования позволяет запускать каждый конвейер. Однако конвейер сборки по-прежнему не запускает конвейер развертывания.

Соответствующие конвейеры (сборка UPS1_Workspace, развертывание wf-stg)

Тег ресурсов конвейера развертывания

Настройки триггеров конвейера развертывания

Обновление 2

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

Статус конвейера

Запуск результатов этапа конвейера

Начало yml-файла запущенного конвейера


person Craigory Coppola    schedule 21.07.2020    source источник
comment
Публикует ли конвейер сборки какой-либо артефакт с помощью задачи PublishPipelineArtifact?   -  person Giulio Vian    schedule 23.07.2020
comment
Да, это конец. Я проверил, что конвейер публикует, и если я запускаю запущенный конвейер вручную, он загружает его.   -  person Craigory Coppola    schedule 27.07.2020


Ответы (2)


Как мне запустить один конвейер в конце другого? Использование примера из msdocs приводит к ошибке «ввод ресурса конвейера должен быть действительным».

Согласно сообщению об ошибке pipeline resource input must be valid, похоже, что Azure DevOps не выбирает имя конвейера, как указано в файле yaml.

Это должно быть название конвейера. Чтобы решить эту проблему, вы можете попробовать перейти к триггерам конвейера OtherPipeline, переименовать конвейер и использовать это имя в своем полном конвейере:

введите описание изображения здесь

введите описание изображения здесь

Если вышеуказанное не помогло решить вашу проблему, предоставьте несколько снимков экрана с вашим именем YAML и его реальной стоимостью в полном конвейере (просто скройте личную информацию).

Обновление:

Хорошо, исправление именования позволяет запускать каждый конвейер. Однако конвейер сборки по-прежнему не запускает конвейер развертывания.

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

Во-первых, поскольку вы используете YAML, нам не нужно устанавливать триггеры завершения сборки конфигурации в пользовательском интерфейсе:

Итак, нам нужно удалить его из пользовательского интерфейса:

введите описание изображения здесь

Это потому, что:

Раньше вы могли переходить к классическому редактору для вашего конвейера YAML и настраивать триггеры завершения сборки в пользовательском интерфейсе. Хотя эта модель все еще работает, ее больше не рекомендуется использовать. Рекомендуемый подход - указать триггеры конвейера непосредственно в файле YAML. Триггеры завершения сборки, определенные в классическом редакторе, имеют различные недостатки, которые теперь устранены в триггерах конвейера. Например, невозможно запустить конвейер на той же ветви, что и конвейер запуска, с помощью триггеров завершения сборки.

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

resources:
  pipelines:
  - pipeline: WorkspaceBuild
    source: UPS1_Workspace
    project: UPS1_Workspace
    trigger: 
      branches: 
      - master
      - azure-pipelines-wf

В-третьих, если конвейер запуска находится в том же проекте Azure DevOps, вы можете не указывать имя проекта.

resources:
  pipelines:
  - pipeline: WorkspaceBuild
    source: UPS1_Workspace
    trigger: 
      branches: 
      - master
      - azure-pipelines-wf

Если конвейер запуска находится в другом проекте Azure DevOps, необходимо указать имя проекта с помощью project: OtherProjectName. Если конвейер запуска находится в другой организации Azure DevOps, необходимо также создать подключение службы к этому проекту и указать его в своем ресурсе конвейера. Для получения дополнительной информации см. Ресурс конвейера.

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

Обновление2:

Согласно предоставленному вами изображению:

введите описание изображения здесь

Ветвь триггера должна включать ветвь, в которой расположен конвейер UPS1_Workspace вместо конвейера wf-stg.yml.

Например, мой конвейер UPS1_Workspace под веткой DemoBranch:

введите описание изображения здесь

Затем я добавляю ветку DemoBranch в wf-stg.yml как ветвь триггера:

resources:
  pipelines:
  - pipeline: WorkspaceBuild
    source: UPS1_Workspace
    trigger: 
      branches: 
      - master
      - DemoBranch
person Leo Liu-MSFT    schedule 22.07.2020
comment
Привет спасибо! Это исправленная часть проблемы, так как конвейер будет работать. Он не срабатывает всякий раз, когда заканчивается предыдущий конвейер (даже при использовании вкладки триггеров в меню на последнем снимке экрана ничего не происходит, когда заканчивается первая сборка) - person Craigory Coppola; 22.07.2020
comment
Я обновил исходный пост этими деталями, а также изображениями с конвейеров. - person Craigory Coppola; 23.07.2020
comment
@AgentEnder, я обновил свой ответ на ваш обновленный вопрос, пожалуйста, проверьте обновленный ответ, чтобы получить более подробную информацию. Я тестирую его, и у меня он отлично работает. - person Leo Liu-MSFT; 23.07.2020
comment
@AgentEnder, кстати, если обновленный ответ разрешит ваш вопрос, вы можете принять его как Ответ, чтобы он мог помочь другим участникам сообщества, у которых возникают такие же проблемы, и мы могли бы заархивировать эту ветку, спасибо. - person Leo Liu-MSFT; 23.07.2020
comment
Я добавил еще несколько деталей. Я действительно не уверен, какие несоответствия здесь происходят. Документ, который вы связали, - это тот же самый документ, который я связал изначально, и я просматривал его несколько раз. Если вы (или кто-то другой в MSFT) можете помочь разобраться в этом на уровне проекта, мы будем очень признательны. - person Craigory Coppola; 23.07.2020
comment
@AgentEnder, обновите ответ еще раз, проверьте, помогает ли. - person Leo Liu-MSFT; 24.07.2020

После устранения этой ошибки ресурс конвейера pipelinename должен быть действительным - на самом деле это означает, что указанное source: имя конвейера недопустимо.

Похоже, что в 2021 году в AzureDevOps не будет пользовательского интерфейса - это все YAML, что упрощает работу.

Предполагая, что оба репозитория находятся в одной высокоуровневой группе проекта:

  1. В вышестоящем репозитории есть конвейер (исходный конвейер) с произвольным именем - скажем, он называется My Upstream Pipeline (release). Никакой специальной настройки в этом репозитории или его конвейере не требуется.

  2. В нижнем репозитории есть конвейер, который вы хотите запускать после того, как вышестоящий репозиторий успешно построил любую ветвь 'release /'. Вы добавляете к его ямлю следующее заклинание:

resources:
  pipelines:
    - pipeline: alias_name
      source: 'My Upstream Pipeline (release)'
      trigger:
        branches:
          - release/*

Если вы напечатаете «Мой восходящий конвейер (выпуск)», то получите ошибку: Ресурс конвейера alias_name должен быть допустимым.

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

Если вам нужно выполнить дополнительную обработку в нисходящем конвейере на основе идентификатора запускающего конвейера (например, чтобы передать опубликованный артефакт вниз), я бы рекомендовал выбрать alias_name, чтобы соответствовать имени в исходном репозитории также используются символы, которые разрешены в переменных среды. Это связано с тем, что ADO делает информацию об этом инициирующем проекте восходящего потока доступной для нисходящего конвейера через ряд переменных среды, включая alias_name как часть этих имен переменных:

  • RESOURCES_TRIGGERINGALIAS = псевдоним

Тогда следующие переменные будут иметь alias_name в верхнем регистре до ALIAS_NAME:

  • RESOURCES_PIPELINE_ALIAS_NAME_PROJECTID - идентификатор вышестоящего проекта
  • RESOURCES_PIPELINE_ALIAS_NAME_PIPELINEID - идентификатор восходящего конвейера
  • RESOURCES_PIPELINE_ALIAS_NAME_RUNID - восходящая сборка или идентификатор запуска

Затем вы можете создать URL-адрес восходящего (инициирующего) конвейера с помощью: PIPELINEURL="${SYSTEM_TEAMFOUNDATIONSERVERURI}${RESOURCES_PIPELINE_ALIAS_NAME_PROJECTID}/_build?buildId=${RESOURCES_PIPELINE_ALIAS_NAME_RUNID}"

и получить из него опубликованный артефакт, используя

          - task: DownloadPipelineArtifact@2
            name: DownloadFromUpstream
            displayName: 'Download file from upstream'
            condition: eq(variables['Build.Reason'], 'ResourceTrigger')
            inputs:
              source: specific
              project: $(RESOURCES_PIPELINE_ALIAS_NAME_PROJECTID)
              pipeline: $(RESOURCES_PIPELINE_ALIAS_NAME_PIPELINEID)
              runId: $(RESOURCES_PIPELINE_ALIAS_NAME_RUNID)
              preferTriggeringPipeline: true
              artifact: 'published-artifact-name'
              path: .

Ссылки:

  1. https://docs.microsoft.com/en-us/azure/devops/pipelines/process/pipeline-triggers
  2. https://docs.microsoft.com/en-us/azure/devops/pipelines/yaml-schema?view=azure-devops&tabs=schema%2Cparameter-schema#the-pipeline-resource-metadata-as-predefined-variables
person Ed Randall    schedule 15.07.2021