限制 Azure Pipeline 装饰器

Restricting Azure Pipeline decorators

我想限制 azure 管道装饰器注入所有管道。正如我们所知,一旦安装了装饰器,它将应用于组织中的所有项目。我怎样才能将它限制在某些项目中?

我使用 Projects API 并获得了我的项目 ID,然后我将项目 ID 添加到我的 json 模板中作为 targettasktargetid.

  "properties": {
                "template": "custom-postjob-decorator.yml",
                "targetid": "9146bcde-ef7b-492d-8289-b3dce5f750b0"
            }

它没有用,我们是否需要在 decorator.yaml 中提供条件以将其限制在组织中的某些项目中?


我还有几个问题。

现在我不想 运行 我在项目 B 上的装饰器,我定义如下

steps:
- ${{ if in(variables['System.TeamProject'], 'ProjectB')) }}:
  - task: ADOSecurityScanner@1 --> injected decorator

我运行这个并且它仍在将装饰器注入ProjectB。


正如你所说,我创建了两个场景。

  1. 如果任务已经存在则跳过,它就像一个魅力,但它没有显示任何关于跳过部分的消息。我们怎么知道装饰器在管道中被跳过了?
steps:
-  ${{ if eq(variables['Build.task'], 'ADOSecurityScanner@1') }}:
  - task: CmdLine@2
    displayName: 'Skipping the injector'
    inputs:
      script: |
        echo "##vso[task.logissue type=error]This Step '$(Build.task)' is not injected. You dont need this in pipeline"
        exit 1
  1. 我已经使用了微软文档中的条件,也与您上面提到的条件相似。

它没有仅使用条件命令跳过注入器,当我在装饰器中添加任务(powershell)时,pipeline.yaml然后它被跳过与两个 yaml 文件上的任务匹配的装饰器。

如果装饰器在管道中被跳过,它是否显示或记录任何信息。 我观察到当装饰器被跳过并向我显示错误陈述时,它确实显示不同。

我们还需要在 pipeline.yaml 文件中定义任何内容吗?


我 运行 你在上面提供的条件下,装饰器仍然以某种方式注入到 projectB 中。你能告诉我哪里做错了吗

下面是我的基本 azure-pipeline.yaml 文件。

trigger:
- main

pool:
  vmImage: ubuntu-latest

steps:
- script: echo Hello, world!
  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'

请务必阅读这些文档:

最简单的解决方案是向管道装饰器添加条件:

steps:
- ${{ if not(eq(variables['azure-pipelines-tfvc-fixparallel-decorator.skip'], 'true')) }}:
  - task: tf-vc-fixparallel-log@2

装饰器可以使用预定义的变量,包括System.TeamProject或System.TeamProjectId:

System.TeamProject The name of the project that contains this build.

System.TeamProjectId The ID of the project that this build belongs to.

例如:

steps:
- ${{ if in(variables['System.TeamProject'], 'ProjectA', 'ProjectB', 'ProjectC')) }}:
  - task: tf-vc-fixparallel-log@2

如果您还没有,则需要添加 steps:。出于某种原因,返回一个空的 steps[] 是可以的,但是返回 nothing 将导致装饰器失败。


当您想排除项目列表时,只需反转条件即可。所以要排除 'ProjectB':

steps:
- ${{ if not(in(variables['System.TeamProject'], 'ProjectB')) }}:
  - task: ADOSecurityScanner@1 --> injected decorator

你上面的语句明确地插入到 ProjectB 中,没有其他地方。


关于跳过注射器。当不需要 运行 时,上面的 -${{ if ... }}: 完全删除了下面缩进的步骤。他们根本不会出现。

您也可以在任务本身上加上 condition,这样它会显示在时间轴中,但会被跳过:

steps:
- task: ADOSecurityScanner@1 --> injected decorator
  condition: not(in(variables['System.TeamProject'], 'ProjectB'))

您可以将条件与变量结合起来,将其添加到表达式中:

steps:
- ${{ if not(or(in(variables['System.TeamProject'], 'ProjectB'), 
         eq(variables['skipInjector'], 'true')) }}:
  - task: ADOSecurityScanner@1 --> injected decorator

如您所见,您可以将 and(..., ...)or(..., ...) 这些东西组合在一起,形成您需要的复杂表达式。

您可以在管道作业的顶级日志面板中看到装饰器的评估。您需要展开 Job preparation parameters 部分。并确保在启用诊断的情况下对管道进行排队。

当您在装饰器中对任务使用条件时,展开任务日志以查看条件评估:


查看她发布的屏幕截图,包含两个版本的装饰器,一个有条件,一个没有。确保你 uninstall/disable 那个版本。