如何基于路径过滤器条件执行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
相关产品推荐
相关产品推荐

