Azure devops PR上的有条件阶段执行

Azure devops PR上的有条件阶段执行,azure-devops,azure-pipelines,Azure Devops,Azure Pipelines,我当前的项目结构有两个文件夹,每个文件夹都有自己的package.xml和单独的部署脚本 src src1 (added Newley) 分支机构名称:发展 当前策略:对PR提升事件运行SRC验证 问题陈述:现在我已经添加了SRC1,我希望有一个PR策略,以便: 每当提出PR时,如果PR仅包含src1中的更改,则应运行src1验证 每当提出PR时,如果PR仅包含Src中的更改,则应运行Src验证 每当引发PR时,如果PR中都包含更改,则应运行两个管道 有没有办法在Azure DevO

我当前的项目结构有两个文件夹,每个文件夹都有自己的
package.xml
和单独的部署脚本

src
src1 (added Newley)
分支机构名称:发展

当前策略:对PR提升事件运行SRC验证

问题陈述:现在我已经添加了SRC1,我希望有一个PR策略,以便:

  • 每当提出PR时,如果PR仅包含src1中的更改,则应运行src1验证

  • 每当提出PR时,如果PR仅包含Src中的更改,则应运行Src验证

  • 每当引发PR时,如果PR中都包含更改,则应运行两个管道


有没有办法在Azure DevOps/VSTS工具中实现此用例?

最简单的方法是创建两个版本:

  • 运行src验证
  • 运行src1验证
  • 在PR中创建生成验证策略,并使用路径过滤器过滤生成:

    在其fir src上方,再添加一个相应的滤波器


    请参阅更多信息。

    您可以创建包含多个作业的单个生成验证管道。在这个管道中,您可以在脚本任务中运行
    git diff--name only HEAD~1
    ,以获取更改的文件夹。然后用于多个作业

    请参阅下面的示例:下面的yaml管道中有三个作业

    第一个作业GetFolder将运行git命令以获取更改的文件夹。然后,如果更改了SCR1文件夹,则将变量
    SCR1文件夹
    设置为
    true
    ,如果更改了SCR2文件夹,则将变量
    SCR2文件夹
    设置为
    true
    。有关在脚本中设置输出变量的更多信息,请参阅

    第二个作业SRC1依赖于作业GetFolder。然后再执行 jobGetFolder,条件是变量
    SCR1Folder
    true
    eq(dependencies.GetFolder.outputs['Flag.SCR1Folder'],'true')

    第三个作业SRC2依赖于作业GetFolder和作业“SRC1”。如果变量
    SCR2Folder
    true
    eq(dependencies.GetFolder.outputs['Flag.SCR2Folder'],'true')
    ,它将在作业GetFolder和作业“SRC1”之后运行

    我在yaml管道上方进行了测试。如果只更改了src1文件夹。然后运行作业GetFolder和作业SRC1,跳过作业SRC2

    如果只更改了src2文件夹。然后运行作业GetFolder和作业SRC2,跳过作业SRC1


    如果两个文件夹都已更改,则作业SRC2将在作业SRC1之后运行。

    我猜这将在PR合并事件中起作用。我对PR提升活动感兴趣,如果不符合PR验证政策,则不允许合并PR。如果这是一个错误的理解,请让我知道。谢谢你的时间。嗨,B TANAND,这正是你需要的,它是在PR提升事件中——在构建验证策略中,如果构建失败(构建失败= =验证策略不满足),合并不会发生。嗨,Shayki,让我们考虑一个只有SRC已经改变的场景。尽管src验证通过,我们将无法合并PR,因为在策略中我们还添加了两个其他管道(src1/两者),对吗?不,我们可以合并,因为我们在每个管道中添加了“路径过滤器”。好的,谢谢。让我试试这个。如果正确答案有效,我们将投票赞成。谢谢你花时间在这件事上。这件事很有魅力。尽管有一个观察结果表明,如果我们同时运行两个src-src1,它将检查repo 3次。一次用于Get文件夹,第二次用于Src,第三次用于src1。我们是否可以优化此脚本,以便在管道中只克隆一次?与当前的设置一样,克隆时间大约是实际克隆时间的三倍。提前感谢。如果您使用的是云托管代理。每个作业将使用一个。如果作业src和src1需要源代码。您必须克隆回购协议三次。如果src和src1不需要源代码。您可以添加步骤以跳过克隆回购。
    trigger: none
    
    pool:
     vmImage: windows-latest
    
    jobs:
    - job: GetFolder
      steps:
      - powershell: |
          $folders= git diff --name-only HEAD HEAD~1
          $folders
          if($folders -cmatch ".*/*SCR1/.*"){
            echo "##vso[task.setvariable variable=SCR1Folder;isOutput=true]true" 
            }
          if($folders -cmatch ".*/*SCR2/.*"){
            echo "##vso[task.setvariable variable=SCR2Folder;isOutput=true]true" 
             }
        name: Flag
    
    - job: SRC1
      dependsOn: GetFolder
      condition: and(succeeded(), eq(dependencies.GetFolder.outputs['Flag.SCR1Folder'], 'true'))
      steps:
      - powershell: echo "run src1 validation"
       
    - job: SRC2
      dependsOn: 
      - GetFolder
      - SRC1
      condition: and(succeeded('GetFolder'),eq(dependencies.GetFolder.outputs['Flag.SCR2Folder'], 'true'))
      steps:
      - powershell: echo "run src2 validation"