众所周知,Nexus 3 还没有 REST API,这对我来说很奇怪。我只能使用 wget 或 curl 手动下载工件。但是当我使用 Maven 3 时,所有快照工件都使用这样的时间戳命名:
myartifact-1.0-20161215.141522-4.tar.gz
所以我想知道如何从回购中获取最新的快照?我想自动化工件的下载过程,但随着名称的变化,我没有找到任何方法来实现这一点。
谢谢。
此 API 调用将起作用:${nexusUrl}/service/rest/beta/search/assets/download?maven.groupId=${groupId}&maven.artifactId=${artifactId}&maven.baseVersion=${version}
虽然最终有一个Nexus3 API(请参阅Sonatype 的博客中的更多内容),但该 API 还没有提供获取最新 SNAPSHOT 版本的方法。这种情况有望在未来得到改善:NEXUS-14407正在跟踪此功能请求。
但在那之前,我通过定义一个Maven - Delete SNAPSHOT
任务来解决这个问题:
并将其配置为每分钟运行一次,删除除 1 个早于 0 天的快照版本之外的所有版本:
您可以在 Groovy 中创建一个脚本并将其上传到 Nexus 以执行您想要的操作。
这是我用来返回给定组和存储库的所有版本的脚本示例。
内容version.json
:
{
"name": "version",
"type": "groovy",
"content": "import org.sonatype.nexus.repository.storage.Query;
import org.sonatype.nexus.repository.storage.StorageFacet;
import groovy.json.JsonOutput;
def groupId = args.split(',')[0];
def repositoryId = args.split(',')[1];
def repo = repository.repositoryManager.get(repositoryId);
StorageFacet storageFacet = repo.facet(StorageFacet);
def tx = storageFacet.txSupplier().get();
tx.begin();
def components = tx.findComponents(Query.builder().where('group = ').param(groupId).build(), [repo]);
def found = components.collect {
def baseVersion = it.attributes().child('maven2').get('baseVersion');
\"${baseVersion}\"
};
found = found.unique();
tx.commit();
def result = JsonOutput.toJson(found);
return result;"
}
这里有趣的部分是tx.findComponents()
返回泛型Component
类。此类通过函数提供有关其容器attributes()
的额外信息。然后,您可以使用它来获取baseVersion
Maven 使用的 ie 版本(带有-SNAPSHOT
后缀)。
要安装此脚本,只需运行以下命令:
curl -v -X POST -u <NEXUS_ADMIN>:<NEXUS_PWD> --header "Content-Type:application/json" http://<SERVER_NEXUS>/nexus/service/siesta/rest/v1/script -d @version.json
然后,您可以使用以下方法轻松测试它:
curl -v -X POST -u <NEXUS_ADMIN>:<NEXUS_PWD> --header "Content-Type: text/plain" "http://<SERVER_NEXUS>/nexus/service/siesta/rest/v1/script/version/run" -d "com.my.groupid,snapshots"
这将返回您想要的所有版本:
{
"name" : "version",
"result" : "[\"1.5.2-SNAPSHOT\",\"1.5.3-SNAPSHOT\",\"1.6.1-SNAPSHOT\",\"1.5.0-SNAPSHOT\"]"
}
希望这会有所帮助!
目前这是不可能的。在我们构建 REST API 时,我们正在专门研究这样的用例,您应该期待在不久的将来会出现这种功能。
正如评论中提到的那样,您可能有一个用例,暂时最好仍然使用 Nexus Repository Manager 2。如果您熟悉 Groovy 和脚本,您还可以通过集成 API 扩展 Nexus Repository Manager 3 来完成您所描述的事情(我很乐意看到这一点)。有关使用它的更多信息在这里:https ://books.sonatype.com/nexus-book/reference3/scripting.html
在 Nexus v3(确切版本 3.17.0)上使用新的 REST API,以下检索最新快照的请求对我有用:
/service/rest/v1/search/assets/download?sort=version&maven.artifactId=artifactId&maven.baseVersion=x.y.z-SNAPSHOT&maven.extension=jar
我在这里的另一篇文章中找到了答案:Nexus 3 Rest api to check if component exists
我在评论区
found = found.unique().sort();
行并使用以下参数调用它:
-d'<reponame>,<groupid>,<artifactid>,<version>-SNAPSHOT,latest'
YMMV,但这为我做到了。然后,我能够使用此查询的结果构造一个 wget。