【问题标题】:Azure Pipeline File-based Trigger and TagsAzure Pipeline 基于文件的触发器和标记
【发布时间】:2020-01-30 14:15:32
【问题描述】:

是否可以使用基于文件的触发器制作构建管道?

假设我有以下目录结构。

Microservices/
    |_Service A
        |_Test_Stage
            |_Testing_Config
        |_QA_Stage
            |_QA_Config
        |_Prod_stage
            |_Prod_Config
    |_Service B
        |_Test_Stage
            |_Testing_Config
        |_QA_Stage
            |_QA_Config
        |_Prod_stage
            |_Prod_Config

我只想拥有一个 YAML 构建管道文件。 基于变量 $(Project) & $(Stage) 创建不同的构建。 是否可以检查触发触发器的目录/文件并相应地设置变量?

此外,如果可以在运行后使用这些变量将标签设置为工件,那就太好了。

谢谢 韩国

【问题讨论】:

    标签: azure azure-devops azure-pipelines-build-task


    【解决方案1】:

    是否可以检查启动触发器的目录/文件和 相应地设置变量?

    当然可以。但是没有直接的方法,因为我们不提供任何预定义的变量来存储此类消息,因此您需要额外的复杂工作来获得它。

    #1:

    虽然没有变量可以直接存储消息,例如修改了哪个文件夹和哪个文件,但是您可以通过api跟踪commit messageBuild.SourceVersion来获取它。

    GET https://dev.azure.com/{organization}/{project}/_apis/git/repositories/{repositoryId}/commits/{commitId}/changes?api-version=5.1
    

    从它的响应体中,你可以直接知道它的路径和文件:

    由于响应体是 JSON 格式,你可以使用一些 JSON 函数来解析这个路径值。请参阅此 similar 脚本作为参考。

    然后使用 powershell 脚本set these value as pipeline variable 下一个代理作业/任务可以使用它们。

    另外,在您的场景中,所有这些都应该在下一个工作开始之前完成。因此,您可以考虑使用管道decorator 创建一个简单的扩展。在装饰器中定义上述所有步骤,以便在每个管道的 pre-job 中完成。


    #2

    想你应该觉得上面的方法有点复杂。所以我宁愿建议你可以使用commit messge。例如,在提交消息中指定project namefile name,通过变量Build.SourceVersionMessage 获取它们。

    然后使用 powershell 脚本(我上面提到过)将它们设置为变量。

    这比使用 api 解析提交体更方便。

    希望其中一位能提供帮助。

    【讨论】:

    • Liang 非常感谢您对 PowerShell 方法的回复。这当然是一个很好的解决方案。
    【解决方案2】:

    感谢您的回复。 我使用 Bash 脚本尝试了不同的方法。 因为我只使用 ubuntu 图片。

    我为目录微服务的最后一次提交使用过滤制作“git log”。 通过一些 awk(不是那么令人满意的解决方案),我得到了项目和阶段并将它们写入管道变量。 当 Microservices/* 路径发生变化时,管道才会被触发。

    trigger:
      batch: true
      branches:
        include:
        - master
      paths:
        include: 
        - Microservices/*
    

    触发器激活时的第一个作业是 Dynamic_variables 作业。 这个工作我只用来设置变量 $(Project) & $(Stage)。构建标签也是用这些变量设置的,所以我可以区分版本中的工件。

    jobs:
      - job: Dynamic_Variables
        pool:
          vmImage: 'ubuntu-latest'
        steps:
          - checkout: self
          - task: Bash@3
            name: Dynamic_Var
            inputs:
              filePath: './scripts/multi-usage.sh'
              arguments: '$(Build.SourcesDirectory)'
            displayName: "Set Dynamic Variables Project"
          - task: Bash@3
            inputs:
              targetType: 'inline'
              script: |
                set +e
                if [ -z $(Dynamic_Var.Dynamic_Project) ]; then
                echo "target Project not specified";
                exit 1;
                fi
                echo "Project is:" $(Dynamic_Var.Dynamic_Project)
            displayName: 'Verify that the Project parameter has been supplied to pipeline'
          - task: Bash@3
            inputs:
              targetType: 'inline'
              script: |
                set +e
                if [ -z $(Dynamic_Var.Dynamic_Stage) ]; then
                echo "target Stage not specified";
                exit 1;
                fi
                echo "Stage is:" $(Dynamic_Var.Dynamic_Stage)
            displayName: 'Verify that the Stage parameter has been supplied to pipeline'
    

    我在此作业中运行的 Bash 脚本如下所示:

    #!/usr/bin/env bash
    set -euo pipefail
    
    WORKING_DIRECTORY=${1}
    cd ${WORKING_DIRECTORY}
    
    CHANGEPATH="$(git log -1 --name-only --pretty='format:' -- Microservices/)"
    Project=$(echo $CHANGEPATH | awk -F[/] '{print $2}')
    CHANGEFILE=$(echo $CHANGEPATH | awk -F[/] '{print $4}')
    Stage=$(echo $CHANGEFILE | awk -F[-] '{print $1}')
    echo "##vso[task.setvariable variable=Dynamic_Project;isOutput=true]${Project}"
    echo "##vso[task.setvariable variable=Dynamic_Stage;isOutput=true]${Stage}"
    echo "##vso[build.addbuildtag]${Project}"
    echo "##vso[build.addbuildtag]${Stage}"
    

    如果有人有更好的解决方案,请告诉我 awk 命令。 非常感谢。 韩国

    【讨论】:

      猜你喜欢
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-11
      • 1970-01-01
      相关资源
      最近更新 更多