Azure DevOps构建管道中API与集成测试工件发布的问题咨询
问题解答
1. 直接使用你提供的待添加任务不可行
你当前的待添加任务和原API发布任务共用了同一个输出目录$(Build.ArtifactStagingDirectory)/$(Build.BuildId),这会导致两个项目的发布文件互相覆盖或混合,最终生成的两个工件内容都会出错。
2. 正确的实现方案
方案一:给集成测试指定独立输出目录(推荐)
修改集成测试任务的输出路径,和API的发布目录彻底隔离,无需额外清理操作,就能保证两个工件的独立性:
# 原API发布任务保持不变 - task: DotNetCoreCLI@2 displayName: Publish and Zip Project inputs: command: publish arguments: '--configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(Build.BuildId)' modifyOutputPath: false zipAfterPublish: true publishWebProjects: false projects: '**/My.API.csproj' - task: PublishPipelineArtifact@1 displayName: Publish App inputs: targetPath: $(Build.ArtifactStagingDirectory)/$(Build.BuildId) artifact: MyApi-Release publishLocation: pipeline # 修改后的集成测试发布任务 - task: DotNetCoreCLI@2 displayName: Publish and Zip Integration Testing Project inputs: command: publish arguments: '--configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(Build.BuildId)-IntTests' modifyOutputPath: false zipAfterPublish: true publishWebProjects: false projects: '**/My.API.IntegrationTests.csproj' - task: PublishPipelineArtifact@1 displayName: Publish Integration Testing App inputs: targetPath: $(Build.ArtifactStagingDirectory)/$(Build.BuildId)-IntTests artifact: MyApi-IntTest-Release publishLocation: pipeline
方案二:若必须复用目录(不推荐),需在发布集成测试前清理目录
如果你一定要用同一个目录,需要在集成测试的DotNetCoreCLI任务前添加清理步骤,确保目录为空:
# 原API发布任务保持不变 - task: DotNetCoreCLI@2 displayName: Publish and Zip Project inputs: command: publish arguments: '--configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(Build.BuildId)' modifyOutputPath: false zipAfterPublish: true publishWebProjects: false projects: '**/My.API.csproj' - task: PublishPipelineArtifact@1 displayName: Publish App inputs: targetPath: $(Build.ArtifactStagingDirectory)/$(Build.BuildId) artifact: MyApi-Release publishLocation: pipeline # 添加清理目录任务 - task: DeleteFiles@2 displayName: Clean up staging directory for integration tests inputs: SourceFolder: '$(Build.ArtifactStagingDirectory)/$(Build.BuildId)' Contents: '**' RemoveDotFiles: true # 集成测试发布任务(复用原目录) - task: DotNetCoreCLI@2 displayName: Publish and Zip Integration Testing Project inputs: command: publish arguments: '--configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)/$(Build.BuildId)' modifyOutputPath: false zipAfterPublish: true publishWebProjects: false projects: '**/My.API.IntegrationTests.csproj' - task: PublishPipelineArtifact@1 displayName: Publish Integration Testing App inputs: targetPath: $(Build.ArtifactStagingDirectory)/$(Build.BuildId) artifact: MyApi-IntTest-Release publishLocation: pipeline
关键说明
- 独立目录方案更简洁可靠,避免了文件冲突和额外清理步骤,是Azure DevOps管道的常规做法。
zipAfterPublish: true会自动将输出目录的内容压缩成zip包,每个项目的独立目录会生成各自的zip文件,发布后两个工件完全分离。
内容的提问来源于stack exchange,提问作者Punter Vicky
相关产品推荐
相关产品推荐

