Sonatype Nexus 3 - 获取最新快照
Sonatype Nexus 3 - get latest snapshot
我们刚刚将 nexus 安装升级到最新版本 (3.x)。有没有办法获取给定快照工件的最新版本? Nexus 2 有一个不错的 API,但不再受支持。
同样的问题(但针对旧版本)已在此处得到解答:
Sonatype Nexus REST Api fetch latest build version
非常感谢任何想法。
最好的,
丹尼尔
这是可能的,但不是在 1-liner 中。您需要为您之后的每个快照工件获取 maven-metadata.xml(请注意,多模块项目对包括父模块在内的每个模块都有不同的时间戳)。
我们使用 xlstproc 来提取相关变量,因此我们仍然可以从命令行 运行 无需像 maven 或 ivy 这样的重量级工具来进行解析。
如果您要求 x.y.z-SNAPSHOT
,则默认情况下将下载最新的 x.y.z-timestamp
快照版本。不需要做任何额外的事情
如果您要查找最新的 x.y.z-SNAPSHOT
版本,其中 x
、y
、z
被猜测 - Nexus never had this functionality(有效仅适用于插件)。而且我认为这没有任何好的用例。如果需要这样做,您可能做错了什么。您始终应该使用特定版本。实际上,即使是第一个功能,我也想不出好的用例。
Nexus 2 had a nice API which is not supported anymore.
听起来你指的是这些:
/service/local/artifact/maven/content
/service/local/artifact/maven/redirect
If you're asking to find the latest x.y.z-SNAPSHOT version where the x, y, z are guessed - Nexus never had this functionality (it worked only for plugins).
这完全是不正确的 - 请参阅以下文章,其中清楚地表明您可以指定 LATEST、RELEASE 或 SNAPSHOT 基本版本。
It's possible but not in a 1-liner.
是的 - 除非你手边有一个工具,例如 artifact-resolver,它确实使用一行命令来获取工件。
真是个笑话:Nexus 3 没有 REST API。
我发现了一个可以缓解我的问题的 hack。原来 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"
最近我们在nexus 3.12.1-01版本遇到了同样的问题,所以肯定没有休息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"])'
希望对您有所帮助
我整理了一个可以上传到 Nexus 的 groovy 脚本,它通过 POST 请求解决了这个特定问题。
您可以在此处找到脚本和一些使用说明:https://github.com/rbjorklin/resolve-latest-nexus-artifact
可以用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}"
Bash 使用 curl
、jq
、sort
和 tail
的单行代码:
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
截至 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
与 repository
、group
和 name
参数一起使用。按 version
排序将为您提供带时间戳的最新快照。
使用 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
就我而言,我没有收到任何回复,因为我缺少我的 Nexus 服务器所需的凭据。一旦我将它们添加到 CURL 和 WGET 命令中,它就对我有用了。
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 --user admin:yourpassword -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 --user=admin --password=mypassword $download_url
总结 user1717259 的回答(使用 Nexus 3.37.3-02)。
Bash one-liner 使用 curl
和 sed
:
BASE_URL="https://your-nexus-server.com"
# All of the following query parameters are optional, and
# defaults to <empty> if not specified otherwise, and
# wildcards can be used as well.
params="repository=<the-repository-id>"
params+="&maven.groupId=<the-group-id>"
params+="&maven.artifactId=<the-atifact-id>"
params+="&maven.baseVersion=<the-version>" # can be <empty>, `1.2.3`, `1.2.3-SNAPSHOT`, or `1.2.*`, etc.
params+="&maven.extendsion=<the-extension>"
params+="&maven.classifier=<the-classifier>"
params+="&sort=<the-sort-field>" # can be <empty>, `group`, `name`, `version`, 'repository'
params+="&direction=<the-sort-direction>" # can be `asc`, and `desc` (the default)
params+="&prerelease=<empty, true, or false>" # default (<empty>) to search releases and prereleases
DOWNLOAD_URL=$(curl -s -k -i "$BASE_URL/service/rest/v1/search/assets/download?$params" | sed -n -E 's/^Location: ([^\r\n]+).*$//p')
版本比较示例:
1.2.3
< 1.3.0-SNAPSHOT
< 1.3.0-CD2-SNAPSHOT
< 1.3.0-CD12-SNAPSHOT
< 1.3.0-RC1
< 1.3.0
< 1.4.0-SNAPSHOT
我们刚刚将 nexus 安装升级到最新版本 (3.x)。有没有办法获取给定快照工件的最新版本? Nexus 2 有一个不错的 API,但不再受支持。
同样的问题(但针对旧版本)已在此处得到解答: Sonatype Nexus REST Api fetch latest build version
非常感谢任何想法。
最好的, 丹尼尔
这是可能的,但不是在 1-liner 中。您需要为您之后的每个快照工件获取 maven-metadata.xml(请注意,多模块项目对包括父模块在内的每个模块都有不同的时间戳)。
我们使用 xlstproc 来提取相关变量,因此我们仍然可以从命令行 运行 无需像 maven 或 ivy 这样的重量级工具来进行解析。
如果您要求 x.y.z-SNAPSHOT
,则默认情况下将下载最新的 x.y.z-timestamp
快照版本。不需要做任何额外的事情
如果您要查找最新的 x.y.z-SNAPSHOT
版本,其中 x
、y
、z
被猜测 - Nexus never had this functionality(有效仅适用于插件)。而且我认为这没有任何好的用例。如果需要这样做,您可能做错了什么。您始终应该使用特定版本。实际上,即使是第一个功能,我也想不出好的用例。
Nexus 2 had a nice API which is not supported anymore.
听起来你指的是这些:
/service/local/artifact/maven/content
/service/local/artifact/maven/redirect
If you're asking to find the latest x.y.z-SNAPSHOT version where the x, y, z are guessed - Nexus never had this functionality (it worked only for plugins).
这完全是不正确的 - 请参阅以下文章,其中清楚地表明您可以指定 LATEST、RELEASE 或 SNAPSHOT 基本版本。
It's possible but not in a 1-liner.
是的 - 除非你手边有一个工具,例如 artifact-resolver,它确实使用一行命令来获取工件。
真是个笑话:Nexus 3 没有 REST API。
我发现了一个可以缓解我的问题的 hack。原来 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"
最近我们在nexus 3.12.1-01版本遇到了同样的问题,所以肯定没有休息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"])'
希望对您有所帮助
我整理了一个可以上传到 Nexus 的 groovy 脚本,它通过 POST 请求解决了这个特定问题。
您可以在此处找到脚本和一些使用说明:https://github.com/rbjorklin/resolve-latest-nexus-artifact
可以用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}"
Bash 使用 curl
、jq
、sort
和 tail
的单行代码:
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
截至 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
与 repository
、group
和 name
参数一起使用。按 version
排序将为您提供带时间戳的最新快照。
使用 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
就我而言,我没有收到任何回复,因为我缺少我的 Nexus 服务器所需的凭据。一旦我将它们添加到 CURL 和 WGET 命令中,它就对我有用了。
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 --user admin:yourpassword -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 --user=admin --password=mypassword $download_url
总结 user1717259 的回答(使用 Nexus 3.37.3-02)。
Bash one-liner 使用 curl
和 sed
:
BASE_URL="https://your-nexus-server.com"
# All of the following query parameters are optional, and
# defaults to <empty> if not specified otherwise, and
# wildcards can be used as well.
params="repository=<the-repository-id>"
params+="&maven.groupId=<the-group-id>"
params+="&maven.artifactId=<the-atifact-id>"
params+="&maven.baseVersion=<the-version>" # can be <empty>, `1.2.3`, `1.2.3-SNAPSHOT`, or `1.2.*`, etc.
params+="&maven.extendsion=<the-extension>"
params+="&maven.classifier=<the-classifier>"
params+="&sort=<the-sort-field>" # can be <empty>, `group`, `name`, `version`, 'repository'
params+="&direction=<the-sort-direction>" # can be `asc`, and `desc` (the default)
params+="&prerelease=<empty, true, or false>" # default (<empty>) to search releases and prereleases
DOWNLOAD_URL=$(curl -s -k -i "$BASE_URL/service/rest/v1/search/assets/download?$params" | sed -n -E 's/^Location: ([^\r\n]+).*$//p')
版本比较示例:
1.2.3
< 1.3.0-SNAPSHOT
< 1.3.0-CD2-SNAPSHOT
< 1.3.0-CD12-SNAPSHOT
< 1.3.0-RC1
< 1.3.0
< 1.4.0-SNAPSHOT