【问题标题】:Restricting Azure Pipeline decorators限制 Azure Pipeline 装饰器
【发布时间】:2021-11-26 13:56:13
【问题描述】:

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

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

  "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. 我使用了 microsoft 文档中的条件,也类似于您上面提到的条件。

它并没有仅使用条件命令跳过注入器,当我在装饰器和 pipeline.yaml 中添加任务(powershell)时,它会跳过与两个 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'

【问题讨论】:

  • 请更新您上面的问题,如果您需要更多关于这个确切主题的信息。或者创建一个新问题并 @jessehouwing 在 cmets 中提及我,以便通知我。那我去看看。
  • 再次,请编辑/改写原始问题。或者在 cmets 中问一些小问题。 StackOverflow 不希望进行公告板式的对话,而是要求您继续按摩您的问题,直到您找到确切的问题。您可以通过在 cmets 中使用 @mention(如 @jessehouwing)或在我的答案中添加评论来吸引像我这样的人的注意力。在这种情况下,我会收到通知。见:stackoverflow.com/help/how-to-ask
  • 您能分享您现有的所有装饰器的相关部分,并解释您对其中的每件作品的期望吗?我认为您可能有一些被证明是错误的期望/假设,但我不知道它们,因此很难为您提供具体的后续步骤。

标签: azure-devops azure-pipelines azure-devops-extensions azure-pipelines-decorator


【解决方案1】:

请务必阅读这些文档:

最简单的解决方案是在管道装饰器中添加一个条件:

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

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

System.TeamProject 包含此构建的项目的名称。

System.TeamProjectId 此构建所属项目的 ID。

例如:

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 部分。并确保在启用诊断的情况下对管道进行排队。

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


查看她发布的截图,包括两个版本的装饰器,一个有条件,一个没有条件。确保您卸载/禁用该其他版本。

【讨论】:

  • 谢谢,上述解决方案有效,移除了另一个喷油器。
猜你喜欢
  • 1970-01-01
  • 2023-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多