如何在 Azure DevOps Server 2020 中包含带有共享 YAML 模板的 PS 代码?

问题描述

我们在 YAML 构建中广泛使用共享的 YAML 模板。像这样:

trigger: none

resources:
  repositories:
    - repository: templates
      type: git
      name: DFDevOps\cicd-templates
      ref: refs/tags/stable-1
      # http://tdc1tfsapp01:8080/tfs/DefaultCollection/DFDevOps/_git/cicd-templates

name: $(BuildVersionPrefix).$(DayOfYear)$(Date:HH)

jobs:
  - job: Build
    pool:
      demands: DotNetFramework
    workspace:
      clean: outputs
    timeoutInMinutes: 180
    steps:
      - checkout: self # self represents the repo where the initial Pipelines YAML file was found
        clean: true
        lfs: true

      - template: ci/ci-build.yml@templates
        parameters:
          releaseBranch: $(ReleaseBranch)

但是,共享的 YAML 模板通常需要执行 Powershell 代码。到目前为止,我们要么将其嵌入,要么将其放入模板加载的 PS 模块中。

我讨厌这两种方法。我讨厌嵌入,因为:

  1. 没有智能
  2. 无单元测试
  3. 没有关于管道故障的正确错误报告

我讨厌放入模块,因为它与原点分离并且需要大量开销。

我的问题 - 是否可以将 PS 代码放在与 YAML 模板相同的存储库中的专用 ps1 文件中,并且在运行时可用?

解决方法

因此,checkout: self 将指代该特定管道 YAML 所在的存储库 - 而不是模板存储库(除非它们是相同的)。

我会在管道中添加第二个签出步骤 - checkout: templates - 然后在您的 powershell 脚本任务的输入中(在模板中),指定您刚刚签出的脚本的路径:

        scriptType: filePath
        scriptPath: $(Build.SourcesDirectory)/templates/pathToscript.ps1

模板只是在编译时就地扩展到管道中,因此它应该可以访问该文件夹。您现在可以通过下载扩展的管道在 YAML 管道编辑器中验证这一点:Download full YAML