能否通过Download Package Manager仅下载Azure Artifacts中Maven最新快照WAR文件?
如何从Azure Artifacts Feeds仅下载Maven快照的最新WAR文件
我正尝试从Azure Artifacts Feeds下载Maven构件。使用Download Package Manager任务时,会下载Maven构件最新版本的所有快照WAR文件(当前已下载25个),但仅需最后发布的那一个。当前任务配置如下:
- task: DownloadPackage@1 inputs: packageType: 'maven' feed: '' view: '' definition: '' version: 'latest' files: '*.war' downloadPath: '$(System.DefaultWorkingDirectory)/webapps'下载的文件示例:
rw-r--r-- 1 svc svc 68059451 Nov 23 06:16 tmptmp-20220120.194729-41.war -rw-r--r-- 1 svc svc 68059488 Nov 23 06:16 tmptmp-20220128.181147-53.war -rw-r--r-- 1 svc svc 68059498 Nov 23 06:16 tmptmp-20220128.154115-45.war -rw-r--r-- 1 svc svc 68059467 Nov 23 06:16 tmptmp-20220128.164023-47.war
解决方案
方法一:使用Maven命令拉取最新快照(推荐)
Azure的DownloadPackage@1任务会下载指定SNAPSHOT版本下的所有构件,而Maven本身可以直接拉取仓库中最新的快照构件。通过MavenAuthenticate任务处理Azure Artifacts的认证,再用dependency:get命令获取目标WAR包:
# 先认证Azure Artifacts源 - task: MavenAuthenticate@0 inputs: artifactsFeeds: '你的Feed名称' # 使用Maven拉取最新快照WAR - task: Maven@3 inputs: goals: 'dependency:get' options: '-DgroupId=你的构件GroupId -DartifactId=tmptmp -Dversion=你的版本号-SNAPSHOT -Dtype=war -Ddest=$(System.DefaultWorkingDirectory)/webapps/tmptmp-latest.war' publishJUnitResults: false
替换命令中的你的构件GroupId、你的版本号-SNAPSHOT为实际值,dest参数可以指定下载后的文件名,确保只保留最新的一个。
方法二:下载后清理旧文件(兼容原有DownloadPackage任务)
如果必须使用DownloadPackage@1,可以在下载完成后通过脚本筛选保留最新的文件。利用文件名中的时间戳(格式为YYYYMMDD.HHMMSS-序号)排序后删除旧文件:
Bash脚本示例:
- task: DownloadPackage@1 inputs: packageType: 'maven' feed: '你的Feed名称' view: '' definition: '' version: 'latest' files: '*.war' downloadPath: '$(System.DefaultWorkingDirectory)/webapps' # 清理旧快照文件,保留最新的一个 - task: Bash@3 inputs: targetType: 'inline' script: | cd $(System.DefaultWorkingDirectory)/webapps # 按文件名升序排序,跳过最后一个(最新的),删除其余文件 ls -1v tmptmp-*.war | head -n -1 | xargs rm -f
PowerShell脚本示例:
- task: DownloadPackage@1 inputs: packageType: 'maven' feed: '你的Feed名称' view: '' definition: '' version: 'latest' files: '*.war' downloadPath: '$(System.DefaultWorkingDirectory)/webapps' # 清理旧快照文件,保留最新的一个 - task: PowerShell@2 inputs: targetType: 'inline' script: | $files = Get-ChildItem -Path $(System.DefaultWorkingDirectory)/webapps -Filter "tmptmp-*.war" | Sort-Object Name -Descending $files | Select-Object -Skip 1 | Remove-Item -Force
内容的提问来源于stack exchange,提问作者Pravallika N V L Sabbisetti
相关产品推荐
相关产品推荐

