azure-devops - 如何正确使用负通配符来清除工件中不必要的文件?
问题描述
我有一个构建管道,到目前为止似乎正在按预期工作。然而,困扰我和开发人员的一件事是,生成的工件有很多不必要的文件,这些文件在发布管道使用时会被部署,虽然它不会损害 Web 应用程序,但它会添加所有那些不必要的依赖项(即 dll)和调试(例如 pdb)无用的文件。
这是预期的工件:
这是今天正在生产的:
这是 zip 文件中的内容:
zip 文件也需要看起来像预期的工件。事实上,如果我可以生成内容与上面预期的工件完全一样的 zip 文件,那就太棒了。
请注意,由于列表太长,我从图片中删除了大部分 pdb/dll/xml 文件,但我希望您能理解。
以下是复制任务和相关任务 YAML:
steps:
- task: CopyFiles@2
displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)'
inputs:
SourceFolder: '$(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123'
Contents: |
assets/**
bin/**
Content/**
Scripts/**
Views/**
*.config
*.asax
*.ico
*.txt
TargetFolder: '$(Build.ArtifactStagingDirectory)'
condition: succeededOrFailed()
steps:
- task: CopyFiles@2
displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)'
inputs:
SourceFolder: Project123
Contents: |
Bundles/**
!(packages.config|phantomjs-license.txt)
TargetFolder: '$(Build.ArtifactStagingDirectory)'
steps:
- task: ArchiveFiles@2
displayName: 'Archive $(Build.ArtifactStagingDirectory)'
inputs:
rootFolderOrFile: '$(Build.ArtifactStagingDirectory)'
includeRootFolder: false
verbose: true
steps:
- task: PublishBuildArtifacts@1
displayName: 'Publish Artifact: Release'
inputs:
ArtifactName: Release
我尝试了不同的负通配组合,但我似乎无法正确删除不必要的文件以实现像预期工件一样的文件。
我不想使用 Powershell 任务,如果可能的话,我想在复制任务中使用负通配符来删除这些文件。
解决方案
经过这么多尝试/错误,我终于巧合地找到了解决方案!!!
这个想法基本上是将复制任务TargetFolder属性设置为不仅根Build.ArtifactStagingDirectory,而且设置为最终发布的子文件夹(例如 Release 或 Drop),如下所示:
TargetFolder: '$(Build.ArtifactStagingDirectory)/Release'
确保存档文件路径也更新到该子文件夹位置:
archiveFile: '$(Build.ArtifactStagingDirectory)/Release/$(Build.BuildId).zip'
最后,确保发布工件PathtoPublish属性也调整到子文件夹:
PathtoPublish: '$(Build.ArtifactStagingDirectory)/Release'
ArtifactName: Release
我还重新安排了复制任务,我认为将包含AngularOutput的Bundles目录复制到_PublishedWebsites会更有意义,这样_PublishedWebsites将作为我们想要存档/发布的所有工件内容的源目录
因此,这里是更新的工作副本/存档/发布 YAML!
steps:
- task: CopyFiles@2
displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123'
inputs:
SourceFolder: Project123
Contents: |
Bundles/**
!(packages.config|phantomjs-license.txt)
TargetFolder: '$(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123'
steps:
- task: CopyFiles@2
displayName: 'Copy Files to: $(Build.ArtifactStagingDirectory)/Release'
inputs:
SourceFolder: '$(Build.ArtifactStagingDirectory)/_PublishedWebsites/Project123'
Contents: |
assets/**
bin/**
Bundles/**
Content/**
Scripts/**
Views/**
Web.config
ApplicationInsights.config
*.asax
*.ico
*.txt
TargetFolder: '$(Build.ArtifactStagingDirectory)/Release'
condition: succeededOrFailed()
steps:
- task: ArchiveFiles@2
displayName: 'Archive $(Build.ArtifactStagingDirectory)/Release'
inputs:
rootFolderOrFile: '$(Build.ArtifactStagingDirectory)/Release'
includeRootFolder: false
archiveFile: '$(Build.ArtifactStagingDirectory)/Release/$(Build.BuildId).zip'
verbose: true
steps:
- task: PublishBuildArtifacts@1
displayName: 'Publish Artifact: Release'
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)/Release'
ArtifactName: Release
结果发布