【问题标题】:Adding condition for selecting branch to fetch the yaml template in Azure pipelines在 Azure 管道中添加选择分支以获取 yaml 模板的条件
【发布时间】:2021-11-12 02:51:25
【问题描述】:

我在名为“DevOps”的单独存储库中添加了 .Net CI CD 管道的 yaml 模板。每个 .Net 服务管道都从“DevOps”调用此 yaml 模板。

在 DevOps 中,我有两个分支 - 一个是主要分支,一个是测试版。

.Net 服务管道中源代码/开发分支的所有触发器都应使用“DevOps”测试分支中的模板。 .Net 服务管道中主分支的管道触发器应使用 main 中的模板。- 这是要求。

我使用了正则表达式/if 条件/语法,使用 when/if,所有这些要么抛出表达式/条件错误,要么只是从 main 中获取模板。下面是我做过的各种尝试的截图(老的有评论)。

有没有办法在存储库语法中实现条件?

更新: 根据 Kotaro 的解决方案,我已经更新了如下所示的管道。我希望可以在资源语法中添加变量

但这就是我尝试运行管道时得到的结果:

【问题讨论】:

    标签: azure-devops yaml azure-pipelines


    【解决方案1】:

    这个怎么样?

    trigger: none
    
    
    pr: none
    
    resources:
      repositories:
      - repository: main
        type: git
        ref: main
        name: xxxxx/DevOps
    
      - repository: beta
        type: git
        ref: beta
        name: xxxxx/DevOps
        
    steps:
      - ${{ if ne(variables['Build.SourceBranchName'], 'main') }}:
        - template: aaaaa.yml@beta
      - ${{ if eq(variables['Build.SourceBranchName'], 'main') }}:
        - template: aaaaa.yml@main
    
    

    【讨论】:

    • 是的!这是我一直在寻找的逻辑。谢谢!
    【解决方案2】:

    没有。在这里你不能使用表达式。恐怕这里连运行时参数都不允许。

    【讨论】:

    • 那么根据CI触发器就没有办法提及DevOps的分支了?
    • 不,你不能。只是目前没有办法使用那里的条件/表达式。
    • 好的谢谢@Krzysztof
    【解决方案3】:

    您不能动态更改分支。

    创建一个管道并使用 REST API 调用它。

    来源未经核实。

    variables:
      devOpsOrg: https://dev.azure.com/{ devOpsname } #  https://dev.azure.com/{ devOpsname }/{project name}/
      devopsProject: {project name}
      DevOpspipelineId: {id} # https://dev.azure.com/{ devOpsname } #  https://dev.azure.com/_build?definitionId={id}&_a=summary
      ${{ if ne(variables['Build.SourceBranchName'], 'main') }}:
        DevOpsbranchName: "beta"
      ${{ if eq(variables['Build.SourceBranch'], 'main') }}:
        DevOpsbranchName: "main"
    
    steps:
    - template: devops-login-pipelines.yml
      parameters:
        devopsOrg: $(devopsOrg)
        devopsProject: $(devopsProject)
    
    - script: |
        PIPELINE_ID=`az pipelines list --query "[?name == '$PIPELINE_NAME'].id | [0]"`  
        PIPELINES=`az pipelines show --id $PIPELINE_ID -o json`
    
        echo $PIPELINES | jq '.triggers[0].branchFilters |= '.+'["+${DEV_OPS_BRANCH_NAME}"]' \
            > pipeline.json
    
        az devops invoke --http-method PUT --area build \
            --resource definitions \
            --route-parameters project=$DEV_OPS_PROJECT definitionId=$PIPELINE_ID \
            --query-parameters branchName=develop \
            -o json \
            --in-file pipeline.json
        fi
    env:
        DEV_OPS_PROJECT: $(devopsProject)
        PIPELINE_ID: $(DevOpspipelineId)
        DEV_OPS_BRANCH_NAME: $(DevOpsbranchName)
    
    

    devops-login-pipelines.yml

    parameters:
      devopsOrg: 'https://dev.azure.com/xxxxxxx'
      devopsProject: 'xxxxxxxx'
    
    steps:
      # Updating the python version available on the linux agent
      - task: UsePythonVersion@0
        inputs:
          versionSpec: '3.x'
          architecture: 'x64'
      
      # Updating pip to latest
      - script: python -m pip install --force-reinstall --upgrade pip
        displayName: 'Upgrade pip'
      
      # Updating to latest Azure CLI version.
      - script: pip install azure-cli==2.5.1
        displayName: 'upgrade azure cli'
      
      - script: az --version
        displayName: 'Show Azure CLI version'
      
      - script: az extension add -n azure-devops
        displayName: 'Install Azure DevOps Extension'
      
      - script: echo ${AZURE_DEVOPS_CLI_PAT} | az devops login
        env:
          AZURE_DEVOPS_CLI_PAT: $(System.AccessToken)
          DEV_OPS_ORG: ${{parameters.devopsOrg}}
        displayName: 'Login Azure DevOps Extension'
      
      - script: |
          az devops configure --defaults organization=${DEV_OPS_ORG} project=${DEV_OPS_PROJECT} \
                              --use-git-aliases true
        displayName: 'setting configure'
        env:
          DEV_OPS_ORG: ${{parameters.devopsOrg}}
          DEV_OPS_PROJECT: ${{parameters.devopsProject}}
      
    

    【讨论】:

    • 谢谢@Kotaro。我会试试这个并在下周初恢复
    • 我已根据您的解决方案和我收到的错误更新了问题的详细信息。请让我知道我哪里出错了。 P.S:我试图在这里避免脚本部分的最大值。这就是为什么修改解决方案
    • 我遵循了这种方法,它与您的解决方案类似。 stackoverflow.com/questions/57532138/… ;它抛出“值已定义错误。我也看到了本文档中设置的示例 - docs.microsoft.com/en-us/azure/devops/release-notes/2021/…。没有任何作用
    • 存储库标签不应该支持动态变化的分支。所以你必须用另一种方式来做。您应该能够通过 API 调用来动态执行分支规范。
    猜你喜欢
    • 1970-01-01
    • 2022-08-10
    • 1970-01-01
    • 2020-06-22
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    • 2023-02-25
    相关资源
    最近更新 更多