You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于路径过滤器条件执行YAML流水线中的指定任务?

混合应用与NuGet类库的YAML流水线触发方案

方案1:配置两个独立CI流水线

直接创建两个独立的YAML流水线文件,分别对应应用程序和NuGet类库,各自设置专属触发器与路径过滤器,分支变更时仅触发对应路径有变更的流水线。

应用程序流水线(app-pipeline.yml)

trigger:
  branches:
    include:
      - main
      - develop
  paths:
    include:
      - apps/*
    exclude:
      - nugets/*

stages:
- stage: Build_Deploy_Apps
  jobs:
  - job: Build_And_Deploy
    steps:
    - script: dotnet build ./apps/MyApp/MyApp.csproj --configuration Release
      displayName: '构建应用程序'
    # 添加部署步骤(如Azure App Service部署、容器推送等)

NuGet类库流水线(nuget-pipeline.yml)

trigger:
  branches:
    include:
      - main
      - develop
  paths:
    include:
      - nugets/*
    exclude:
      - apps/*

stages:
- stage: Pack_Publish_NuGet
  jobs:
  - job: Pack_And_Publish
    steps:
    - script: dotnet pack ./nugets/MyLibrary/MyLibrary.csproj --configuration Release --output $(Build.ArtifactStagingDirectory)
      displayName: '打包NuGet包'
    - task: NuGetCommand@2
      inputs:
        command: 'push'
        packagesToPush: '$(Build.ArtifactStagingDirectory)/**/*.nupkg'
        nuGetFeedType: 'internal'
        publishVstsFeed: '内部包源名称/ID'
      displayName: '发布至内部NuGet源'

方案2:通过路径变更设置变量,条件触发对应任务

在单个流水线中先检测路径变更,输出变量标记是否需要构建应用或NuGet,后续阶段/作业根据变量值决定是否执行。

trigger:
  branches:
    include:
      - main
      - develop
  paths:
    include:
      - apps/*
      - nugets/*

variables:
  - name: shouldBuildApps
    value: 'false'
  - name: shouldBuildNugets
    value: 'false'

stages:
- stage: Detect_Changes
  jobs:
  - job: Check_Path_Changes
    outputs:
      buildApps: $[steps.set_output_vars.outputs.buildApps]
      buildNugets: $[steps.set_output_vars.outputs.buildNugets]
    steps:
    - bash: |
        # 获取本次提交变更的文件列表
        CHANGED_FILES=$(git diff --name-only HEAD~1 HEAD)
        # 判断是否有apps文件夹下的变更
        if echo "$CHANGED_FILES" | grep -q "^apps/"; then
          echo "##vso[task.setvariable variable=buildApps;isOutput=true]true"
        fi
        # 判断是否有nugets文件夹下的变更
        if echo "$CHANGED_FILES" | grep -q "^nugets/"; then
          echo "##vso[task.setvariable variable=buildNugets;isOutput=true]true"
        fi
      displayName: '检测路径变更'
      name: set_output_vars
      # 若使用Windows代理,替换为PowerShell脚本
      # pwsh: |
      #   $changedFiles = git diff --name-only HEAD~1 HEAD
      #   if ($changedFiles -match "^apps/") {
      #     Write-Host "##vso[task.setvariable variable=buildApps;isOutput=true]true"
      #   }
      #   if ($changedFiles -match "^nugets/") {
      #     Write-Host "##vso[task.setvariable variable=buildNugets;isOutput=true]true"
      #   }

- stage: Build_Apps
  condition: eq(dependencies.Detect_Changes.outputs['Check_Path_Changes.buildApps'], 'true')
  jobs:
  - job: Build_Deploy_App
    steps:
    - script: dotnet build ./apps/MyApp/MyApp.csproj --configuration Release
      displayName: '构建应用'
    # 添加部署步骤

- stage: Build_Nugets
  condition: eq(dependencies.Detect_Changes.outputs['Check_Path_Changes.buildNugets'], 'true')
  jobs:
  - job: Pack_Publish_NuGet
    steps:
    - script: dotnet pack ./nugets/MyLibrary/MyLibrary.csproj --configuration Release --output $(Build.ArtifactStagingDirectory)
      displayName: '打包NuGet包'
    - task: NuGetCommand@2
      inputs:
        command: 'push'
        packagesToPush: '$(Build.ArtifactStagingDirectory)/**/*.nupkg'
        nuGetFeedType: 'internal'
        publishVstsFeed: '内部包源名称/ID'
      displayName: '发布NuGet包'

方案3:始终触发流水线,按需执行任务

流水线始终触发,但每个阶段/作业仅在对应路径有变更时执行;若应用依赖NuGet包,可设置阶段依赖关系,确保NuGet构建完成后再执行应用构建。

trigger:
  branches:
    include:
      - main
      - develop
  paths:
    include:
      - apps/*
      - nugets/*

stages:
- stage: Build_Nugets
  condition: |
    $[
      git diff --name-only HEAD~1 HEAD | grep -q "^nugets/"
    ]
  jobs:
  - job: Pack_Publish_NuGet
    steps:
    - script: dotnet pack ./nugets/MyLibrary/MyLibrary.csproj --configuration Release --output $(Build.ArtifactStagingDirectory)
      displayName: '打包NuGet包'
    - task: NuGetCommand@2
      inputs:
        command: 'push'
        packagesToPush: '$(Build.ArtifactStagingDirectory)/**/*.nupkg'
        nuGetFeedType: 'internal'
        publishVstsFeed: '内部包源名称/ID'
      displayName: '发布NuGet包'

- stage: Build_Apps
  # 若应用依赖NuGet包,设置依赖关系;否则可去掉dependsOn
  dependsOn: Build_Nugets
  condition: |
    $[
      or(
        git diff --name-only HEAD~1 HEAD | grep -q "^apps/",
        git diff --name-only HEAD~1 HEAD | grep -q "^nugets/"
      )
    ]
  jobs:
  - job: Build_Deploy_App
    steps:
    - script: dotnet build ./apps/MyApp/MyApp.csproj --configuration Release
      displayName: '构建应用'
    # 添加部署步骤

注意:若使用Windows代理,需将bash脚本替换为PowerShell版本,逻辑一致。

内容的提问来源于stack exchange,提问作者bubbleking

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 15:15:44