【问题标题】:How should I trigger one pipeline at the end of another? Using the example from msdocs leads to "pipeline resource input must be valid" error我应该如何在另一个管道的末端触发一个管道?使用 msdocs 中的示例会导致“管道资源输入必须有效”错误
【发布时间】:2020-11-11 03:31:55
【问题描述】:

其他管道完成后无法触发管道

原创

我正在尝试在 devops yaml 管道中为我们的 Angular 应用程序构建多个发布管道。我们正在使用 Nx 工作区,因此能够在工作区构建结束时触发这些管道非常重要。

这是微软提供的示例文档代码 (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'

更新

好的,修复命名允许每个管道运行。但是,构建管道仍然不会触发部署管道。

Respective Pipelines (UPS1_Workspace build, wf-stg deploys)

Deployment pipeline resources tag

Deployment pipeline triggers settings

更新 2

嘿,这仍然不起作用。我从触发器 ui 面板中删除了所有 CI 设置,并确保未勾选覆盖框。这里还有一些有助于诊断的图片

Pipeline Status's

Triggering Pipeline Step Results

Start of triggered pipeline's yml file

【问题讨论】:

  • 构建管道是否使用 PublishPipelineArtifact 任务发布任何工件?
  • 是的,到了最后。我已经验证了管道发布,如果我手动运行触发的管道,它会下载它

标签: azure-pipelines nrwl-nx


【解决方案1】:

我应该如何在另一个管道的末端触发一个管道?使用 msdocs 中的示例会导致“管道资源输入必须有效”错误

根据错误消息pipeline resource input must be valid,Azure devops 似乎没有选择 yaml 文件中提到的管道名称。

它应该是管道的名称。要解决此问题,您可以尝试转到管道 OtherPipeline 的触发器并重命名管道并在完整管道中使用该名称:

如果上述方法不能解决您的问题,请提供一些关于您的 YAML 名称和完整管道中的实际值的屏幕截图(仅隐藏个人信息)。

更新:

好的,修复命名允许每个管道运行。然而,建 管道仍然不会触发部署管道。

在您提供的屏幕截图中,需要注意三点。

首先,由于您使用的是 YAML,我们不需要在 UI 中设置配置构建完成触发器:

所以,我们需要从 UI 中删除它:

那是因为:

以前,您可能已经导航到 YAML 的经典编辑器 UI 中的管道和配置的构建完成触发器。尽管 该模型仍然有效,不再推荐。推荐的 方法是直接在 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 项目中,您 必须使用项目指定项目名称:OtherProjectName。如果 触发管道位于另一个 Azure DevOps 组织中,您必须 还创建到该项目的服务连接并在 您的管道资源。有关详细信息,请参阅管道资源。

更多详情请查看文档Trigger one pipeline after another

更新2:

根据您提供的图片:

触发分支应该包括管道UPS1_Workspace所在的分支,而不是管道wf-stg.yml

比如我的管道UPS1_Workspace在分支DemoBranch下:

然后我在wf-stg.yml中添加分支DemoBranch作为触发分支:

resources:
  pipelines:
  - pipeline: WorkspaceBuild
    source: UPS1_Workspace
    trigger: 
      branches: 
      - master
      - DemoBranch

【讨论】:

  • 嘿,谢谢!这解决了问题的一部分,因为管道现在将运行。它不会在上一个管道完成时触发(即使在上一个屏幕截图中使用菜单中的触发器选项卡,第一次构建完成时也不会发生任何事情)
  • 我用这些细节以及管道中的图片更新了原始帖子。
  • @AgentEnder,我已经为您更新的问题更新了答案,请查看更新后的答案以获取更多详细信息。我对其进行了测试,它在我这边运行良好。
  • @AgentEnder,顺便说一句,如果更新的答案解决了您的问题,您可以Accept it as an Answer,这样它可以帮助遇到同样问题的其他社区成员,我们可以存档这个帖子,谢谢。跨度>
  • 我添加了更多细节。我真的不确定这里发生了什么差异。您链接的文档与我最初链接的文档相同,并且我已经查看了好几次。如果您(或 MSFT 的其他人)可以在项目级别的基础上帮助解决这个问题,我们将不胜感激。
【解决方案2】:

刚刚解决了这个错误管道资源管道名称必须是有效的——这实际上意味着给定的source:管道名称是无效的。

2021 年 AzureDevOps 上似乎没有 UI - 都是 YAML,这让事情变得更简单。

假设两个存储库在同一个高级项目分组中:

  1. 上游存储库有一个管道(源管道),它有一个任意名称 - 假设它被命名为 My Upstream Pipeline (release)。 此存储库或其管道不需要特殊配置。

  2. 下游存储库有一个管道,您希望在上游成功构建任何“发布/”分支后触发该管道。您将以下咒语添加到其 yaml:

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

如果您输入错误“我的上游管道(发布)”,则会收到错误消息 管道资源alias_name必须有效

将构建的下游 repo 的分支是默认分支 - 我认为除了更改默认分支之外没有其他方法可以改变它。

如果您需要根据触发管道的身份在下游管道中进行任何额外处理(例如,将已发布的工件向下传递),我建议选择 alias_name 来匹配上游存储库的名称,也使用环境变量中合法的字符。这是因为 ADO 通过许多环境变量将有关上游触发项目的信息提供给下游管道,并将 alias_name 合并为这些变量名的一部分:

  • RESOURCES_TRIGGERINGALIAS = 别名名称

那么以下变量将 alias_name 大写为 ALIAS_NAME

  • RESOURCES_PIPELINE_ALIAS_NAME_PROJECTID - 上游项目 ID
  • RESOURCES_PIPELINE_ALIAS_NAME_PIPELINEID - 上游管道 ID
  • RESOURCES_PIPELINE_ALIAS_NAME_RUNID - 上游构建或运行 ID

然后,您可以使用以下命令构造上游(触发)管道的 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

【讨论】:

    猜你喜欢
    • 2022-10-17
    • 1970-01-01
    • 2020-06-14
    • 2022-08-11
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 1970-01-01
    相关资源
    最近更新 更多