【问题标题】:Different agent pool or demands for the same Azure Pipeline based on trigger基于触发器的不同代理池或对同一 Azure Pipeline 的需求
【发布时间】:2020-02-11 16:01:56
【问题描述】:

我有一个用 YAML 编写的 Azure 管道,只要对 master 分支进行更改,它就会从 CI 触发器运行。它也可以从 Pull Requests 或用户针对任何分支手动触发。

由于使用了许多许可组件,master 的构建需要在特定代理上运行。其他构建没有,事实上我更希望它们在其他代理上运行。

所以我的问题是,有没有办法根据触发构建的原因或构建正在构建的分支在 YAML 管道中指定不同的代理/池?我希望这是在管道中永久配置的行为,而不是要求用户更新他们希望在其他地方构建的每个分支上的 YAML。

我在有关 pool/demands/condition 关键字的文档部分中看不到任何明显的内容。

【问题讨论】:

    标签: azure-devops azure-pipelines


    【解决方案1】:

    我通过将作业的steps 放入模板来解决这个问题,然后在管道中创建一组具有不同condition 条目的作业,以便我们可以根据这些条件设置demands

    骨架版本如下所示:

    - stage: Build
        jobs:
        - job: TopicBranchAndPullRequestBuild
          condition: or(startsWith(variables['Build.SourceBranch'], 'refs/heads/topic'), startsWith(variables['Build.SourceBranch'], 'refs/pull'))
          displayName: 'Build topic Branch or Pull Request'
    
          pool:
            name: the-one-and-only-pool
            demands:
              - HasLicensedComponents -equals false
          steps:
            - template: build-template.yml
    
        - job: MasterAndReleaseBranchBuild
          condition: or(eq(variables['Build.SourceBranch'], 'refs/heads/master'), startsWith(variables['Build.SourceBranch'], 'refs/heads/release'))
          displayName: 'Build master or release Branch'
          pool:
            name: the-one-and-only-pool
            demands:
              - HasLicensedComponents -equals true
          steps:
            - template: build-template.yml
    
    

    显然,此处给出的值仅作为示例,但除此之外,这就是我的工作。

    【讨论】:

      【解决方案2】:

      你能试试表达吗?我已经在变量组上成功使用了它,因此它可能适用于代理池。

      - ${{ if eq(variables['build.SourceBranchName'], 'prod') }}:
        - pool: Host1
      - ${{ if eq(variables['build.SourceBranchName'], 'staging') }}:
        - pool: Host2
      - ${{ if not(and(eq(variables['build.SourceBranchName'], 'staging'), eq(variables['build.SourceBranchName'], 'prod'))) }}:
        - pool: Host3
      

      在此处动态拉取变量组的原始解决方法的功劳:https://github.com/MicrosoftDocs/vsts-docs/issues/3702#issuecomment-574278829

      【讨论】:

        【解决方案3】:

        pool 关键字指定用于管道的作业 的池。池规范还包含有关作业的运行策略的信息。您可以在管道、阶段或作业级别指定池。在层次结构的最低级别指定的池用于运行作业。

        有没有办法在 YAML 中指定不同的代理/池 管道基于什么触发了构建,或者构建的哪个分支 正在建造吗?

        对于这个问题,你可以为不同的分支创建不同的yaml文件,在对应的yaml文件中指定不同的代理池。

        您可以通过如下所示的选项切换到管道中不同分支的yaml文件:

        【讨论】:

        • 为了更清楚,我希望能够在管道中创建一个规则,当从 master 分支运行时强制它在特定主机上运行,​​并允许它在除来自其他任何地方的主机。我希望这是自动的,而不是要求人们在每个分支中手动更新 yaml。我将更新问题以反映这一点。
        • 你可以尝试用两个作业来实现它。第一个job可以通过power shell task确定源分支。如果是master,则将变量vm设置为代理的名称。然后将第二个作业中的池设置为:vmImage: $(vm)
        • @James Telfer 没有获得您的最新信息,上述评论中的解决方法对您有帮助吗?或者,如果您有任何疑虑,请随时在此处分享。
        【解决方案4】:
        parameters:
          - name: self_hosted_agent
            displayName: Choose your pool agent
            type: string
            default: windows-latest
            values:
            - windows-latest
            - self-hosted
          - name: agent_name
            displayName: Choose your agent
            type: string
            default: 'Laptop Clint'
            values:
            - 'Laptop Clint'
            - 'Laptop Eastwood'
        
        variables:
          - name: pool_agent_key
            ${{ if eq(parameters.self_hosted_agent, 'windows-latest') }}:
              value: vmImage
            ${{ if eq(parameters.self_hosted_agent, 'self-hosted') }}:
              value: name
          - name: pool_agent_value
            ${{ if eq(parameters.self_hosted_agent, 'windows-latest') }}:
              value: windows-latest
            ${{ if eq(parameters.self_hosted_agent, 'self-hosted') }}:
              value: Iot-Windows
          - name: agent_name
            value: ${{ parameters.agent_name }}
        
        stages:
          - stage: build
            displayName: Build    
            pool: 
              ${{ variables.pool_agent_key }}: ${{ variables.pool_agent_value }}
              ${{ if eq(parameters.self_hosted_agent, 'self-hosted') }}:
                demands: 
                  - agent.name -equals ${{ variables.agent_name }}
        

        【讨论】:

        • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
        猜你喜欢
        • 1970-01-01
        • 2019-05-03
        • 2019-12-15
        • 2022-11-11
        • 1970-01-01
        • 1970-01-01
        • 2021-06-21
        • 2023-03-18
        相关资源
        最近更新 更多