Sonatype Nexus 3 - 获取最新的快照版本

19

我们刚刚将nexus升级到了最新版本(3.x)。有没有办法获取给定快照构件的最新版本?Nexus 2有一个不再支持的好API。

同样的问题(但是针对旧版本)已经在这里回答过: Sonatype Nexus REST Api fetch latest build version

非常感谢任何想法。

最好的祝福, 丹尼尔


https://books.sonatype.com/nexus-book/3.0/reference/scripting.html#_writing_scripts请点击以上链接以访问有关编写脚本的文档。 - user180100
看起来这是关于 Nexus 插件的问题,而不是通过 REST API 获取数据。 - Mikhail Kopylov
12个回答

18
截至2019年4月,Sonatype Nexus 3已经有一个REST API用于访问最新的构件。相关文档在这里。

http://community.sonatype.com/t/nxrm-3-16-rest-search-and-filtering-enhancements/1586

使用此端点/service/rest/v1/search/assets/download,并提供repositorygroupname参数。按version排序可获取最新的时间戳快照。

https://nexus.blahblah.com/service/rest/v1/search/assets/download?repository=maven-snapshots&group=com.my.company&name=myArtefact&sort=version&direction=desc


2
这位先生来两杯威士忌!这正好解决了我的使用情况:拥有一个链接,可以自动检索最新的快照/发布。 - AbstractVoid
2
您也可以使用通配符来缩小搜索范围,例如:&version=2.1*(在OSS 3.21.2上测试通过) - Ignacio A. Poletti
感谢您提供精确的答案和示例链接! - shaki
1
还有一些其他有用的参数,例如&maven.baseVersion=master-SNAPSHOT&maven.classifier=sql&maven.extension=zip - Karsten Spang
1
还要注意,如果使用curl,则需要-L选项来实际下载找到的构件,以及-o选项来指定输出文件名。 - Karsten Spang

6

Nexus 2曾经拥有一个不再支持的好API。

看起来你在提到这些内容:

/service/local/artifact/maven/content
/service/local/artifact/maven/redirect

如果您要查找猜测的x、y、z的最新x.y.z-SNAPSHOT版本-Nexus从未具备此功能(仅适用于插件)。 这是不正确的-请参阅以下文章,其中清楚地显示可以指定LATEST、RELEASE或SNAPSHOT基础版本。

https://support.sonatype.com/hc/en-us/articles/213465488-How-can-I-retrieve-a-snapshot-if-I-don-t-know-the-exact-filename-

这是可能的,但不是一行代码就能实现的。

是的,除非你有一个方便的工具,比如artifact-resolver,它可以使用一行命令来获取一个构件。


4

关于Nexus 3没有REST API,真是个笑话。

我发现了一个小技巧,解决了我的问题。原来ansible有一个不错的maven_artifact模块,可以自动找到最新的快照版本。而且你可以在本地运行ansible。所以最终看起来像这样:

ansible all -i localhost, -c local -m maven_artifact -a "repository_url=https://my-nexus/repository/maven-snapshots/ group_id=com.whatever artifact_id=my-artifact version=2.0-SNAPSHOT dest=./my-artifact.jar"

这并没有解释如果最新的快照不小心不是2.0-SNAPSHOT该如何下载。 - Kalle Richter

4

Bash一行命令使用curljqsorttail

NEXUS_URL=https://your-nexus.com
MAVEN_REPO=maven-snapshots
GROUP_ID=...
ARTIFACT_ID=...
VERSION=2.0.1-SNAPSHOT
FILE_EXTENSION=jar

download_url=$(curl -X GET "${NEXUS_URL}/service/rest/v1/search/assets?repository=${MAVEN_REPO}&maven.groupId=${GROUP_ID}&maven.artifactId=${ARTIFACT_ID}&maven.baseVersion=${VERSION}&maven.extension=${FILE_EXTENSION}" -H  "accept: application/json"  | jq -rc '.items | .[].downloadUrl' | sort | tail -n 1)

wget $download_url

你很棒! :) - odinsy
想要回应第一条评论,你是最棒的!这个帮我节省了很多时间,当我试图构建一个Docker镜像来部署快照到我们的集群时。谢谢! - Duncan Krebs

1
如果您请求 x.y.z-SNAPSHOT,则默认情况下将下载最新的x.y.z-timestamp快照版本。无需进行任何其他操作。
如果您要查找x.y.z-SNAPSHOT的最新版本,其中xyz是猜测的 - Nexus从未具备此功能(仅对插件有效)。而且我认为没有任何好的用例。如果需要这样做,则您可能正在做错事情。您应该始终使用特定的版本。实际上,即使对于第一个功能,我也想不出好的用例。

1

你可以使用 curl 下载

curl -L --header 'Accept: application/json' "https://${NEXUS_URL}/service/rest/beta/search/assets/download?repository=${NEXUS_REPO_NAME}&maven.groupId=${MVN_GROUP_ID}&maven.artifactId=${MVN_ARTIFACT_ID}&maven.baseVersion=${APP_VERSION}&maven.extension=${MVN_EXTENSION}"

1
最近我们在Nexus版本3.12.1-01上遇到了同样的问题,因此没有REST API可以直接获取最新的快照。
我们使用Python一行代码解决了这个问题。
JSON_RESPONSE=$(curl -u un:pw -X GET "http://nexus-host/nexus/service/rest/beta/search/assets?maven.groupId=sample.group.id&maven.artifactId=sample&maven.extension=jar" -H  "accept: application/json")

echo $JSON_RESPONSE | python -c 'import sys, json; lines = json.load(sys.stdin)["items"]; sortedlines = sorted(lines, key=lambda k: k["downloadUrl"], reverse=True); print(sortedlines[0]["downloadUrl"])'

希望它有所帮助。

1

使用OSS 3.21.2-03版本,我使用以下URL检索了最新的快照,该文件为zip扩展名:

{nexus_host}/service/rest/v1/search/assets/download?sort=version&repository={repository_name}&group={group_id}&name={artifact-id}&maven.extension=zip

0

0

这是可能的,但不是一行代码就能搞定的。你需要获取每个快照构件的maven-metadata.xml文件(注意,多模块项目中每个模块包括父模块都有不同的时间戳)。

我们使用xlstproc来提取相关变量,因此我们仍然可以在命令行上运行,而无需像maven或ivy这样的重量级工具来进行解析。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接