设置azure-pipelines.yaml以在发生更改或手动触发时在子目录上运行

设置azure-pipelines.yaml以在发生更改或手动触发时在子目录上运行,azure,azure-devops,azure-pipelines,Azure,Azure Devops,Azure Pipelines,年初我问了以下问题: 基本上,我的设置是我的“微服务”是monorepo中的子目录。我希望根据这些子目录中是否有更改,为每个子目录分别设置触发器。我试图避免polyrepo,但这听起来似乎是解决办法。否则,只要项目中的任何地方发生了变化,就会触发所有内容进行重建和重新部署 我开始遇到问题,所以我禁用了它。以下两个主要问题: 似乎当管道在CI或CD阶段失败时,我会手动触发它,但由于某种原因,它找不到更改,也不会运行。我必须修改azure pipeline.yaml,方法是注释掉检查更改的任务,

年初我问了以下问题:

基本上,我的设置是我的“微服务”是monorepo中的子目录。我希望根据这些子目录中是否有更改,为每个子目录分别设置触发器。我试图避免polyrepo,但这听起来似乎是解决办法。否则,只要项目中的任何地方发生了变化,就会触发所有内容进行重建和重新部署

我开始遇到问题,所以我禁用了它。以下两个主要问题:

  • 似乎当管道在CI或CD阶段失败时,我会手动触发它,但由于某种原因,它找不到更改,也不会运行。我必须修改azure pipeline.yaml,方法是注释掉检查更改的任务,然后运行。或者我必须做出一些小的改变,重新承诺,重新启动,等等
  • 有时我只是想手动触发子目录及其关联的管道,我必须执行前面的操作
所以我禁用了它,并在触发时停止管道重建和重新部署所有内容,并手动在我想要的子目录上运行

如何在azure pipeline.yaml中实现此功能

  • 仅在发生更改时在子目录上运行
  • 在有手动触发器时运行,即使没有更改

  • 您需要结合两件事:

    • 一个是检测子文件夹中的更改,如(代码在powershell中)
    $editedFiles=git diff HEAD~--仅限名称
    $editedFiles | ForEach对象{
    开关-通配符($\ux){
    'SubFolderA/*'{Write Output“##vso[task.setvariable=MicroserviceA]true}
    #剩下的路径过滤器
    }
    }
    
    (您也可以通过检测更改来实现)

    • 并使用变量
      Build.reason
    所以你会得到类似于这个的情况

    or(eq(variables['MicroserviceA'], true), eq(variables['Build.Reason'], 'Manual'))
    
    如果使用阶段进行分离,则需要创建一个新阶段,并在其中设置检测子文件夹更改的逻辑,使其他阶段依赖于此阶段,并在其他阶段条件下使用。但是,您需要记住[阶段依赖项及其命名]

    阶段:
    -阶段:A
    工作:
    -职位:A1
    步骤:
    -powershell:|
    $editedFiles=git diff HEAD~--仅限名称
    $editedFiles | ForEach对象{
    开关-通配符($\ux){
    'SubFolderA/*'{Write Output“##vso[task.setvariable=MicroserviceA;isooutput=true]true}
    #剩下的路径过滤器
    }
    }
    姓名:detectChange
    -阶段:B
    条件:或(和(successed(),eq(dependencies.A.outputs['A1.detectChange.MicroserviceA'],true)),eq(变量['Build.Reason'],'Manual'))
    德彭森:A
    工作:
    -职位:B1
    步骤:
    -脚本:从B阶段回显hello
    
    上述方式触发手动触发的所有零件,如果您希望能够选择一个您可以使用

    参数:
    -名称:configs
    类型:字符串
    默认值:“全部”
    触发器:无
    工作:
    -${{如果或(包含(parameters.configs,'MicroserviceA'),包含(parameters.configs,'all'))}:
    -工作:微服务
    步骤:
    -脚本:echo构建微服务。。。
    -${{如果或(包含(parameters.configs,'MicroserviceB'),包含(parameters.configs,'all'))}:
    -工作:微服务
    步骤:
    -脚本:echo Building MicroService B。。。
    -${{如果或(包含(parameters.configs,'MicroserviceC'),包含(parameters.configs,'all'))}:
    -工作:微服务
    步骤:
    -脚本:echo Building MicroService。。。
    
    如何实现此功能?您所指的具体功能是什么?Hi@eox.dev,此票证是否有任何更新?如果您有任何问题,请随时告诉我。如果答案可以帮助,你可以考虑接受它。
    or(eq(variables['MicroserviceA'], true), eq(variables['Build.Reason'], 'Manual'))