如何通过Curl从Artifactory下载最新的.war格式构件?
解决Artifactory Curl查询返回所有构件而非最新的问题
我懂你的困扰——用pattern search API确实会返回所有匹配的.war构件,没法直接拿到最新的那个。下面给你两种实用的解决思路:
方法1:用Artifactory AQL(推荐方案)
Artifactory的AQL(Artifactory Query Language)是更灵活的查询工具,能直接在服务器端完成筛选和排序,不用本地额外处理。
执行下面的Curl命令,它会定位到指定仓库路径下的所有.war文件,按创建时间降序排序,只返回最新的那一个:
curl -X POST "https://artifactory.xxx.com/artifactory/api/search/aql" \ -H "Content-Type: text/plain" \ -d 'items.find({ "repo": "bds-snapshot", "path": "com/test/sample/mobile-project-api/0.0.1-SNAPSHOT", "name": {"$match": "*.war"} }).sort({"$desc": ["created"]}).limit(1)'
如果要直接下载最新构件,可以从返回结果里提取downloadUri字段,或者把命令改成自动获取链接并下载:
DOWNLOAD_URL=$(curl -s -X POST "https://artifactory.xxx.com/artifactory/api/search/aql" \ -H "Content-Type: text/plain" \ -d 'items.find({"repo": "bds-snapshot","path": "com/test/sample/mobile-project-api/0.0.1-SNAPSHOT","name": {"$match": "*.war"}}).sort({"$desc": ["created"]}).limit(1)' | \ jq -r '.results[0].downloadUri') curl -O "$DOWNLOAD_URL"
方法2:解析Pattern Search结果本地筛选
如果你更习惯用原来的pattern search API,可以借助jq工具(JSON处理工具)在本地解析返回结果,筛选出最新构件:
- 先获取所有构件并提取最新那个的URI:
LATEST_WAR_URI=$(curl -s "https://artifactory.xxx.com/artifactory/api/search/pattern?pattern=bds-snapshot:com/test/sample/mobile-project-api/0.0.1-SNAPSHOT/*.war" | \ jq -r '.results | sort_by(.created) | last().uri')
- 拼接下载链接并执行下载:
curl -O "https://artifactory.xxx.com$LATEST_WAR_URI"
注:这种方法需要你的环境已安装jq,可以用包管理器安装(比如apt install jq或brew install jq)。
小提醒
对于SNAPSHOT构件,文件名里通常会带时间戳(比如mobile-project-api-0.0.1-20240520.143000-1.war),你也可以按文件名排序,但优先推荐用Artifactory的created字段排序,因为它是构件上传到仓库的准确时间,比文件名里的时间戳更可靠。
内容的提问来源于stack exchange,提问作者user7486728
相关产品推荐
相关产品推荐

