6

众所周知,Nexus 3 还没有 REST API,这对我来说很奇怪。我只能使用 wget 或 curl 手动下载工件。但是当我使用 Maven 3 时,所有快照工件都使用这样的时间戳命名:

myartifact-1.0-20161215.141522-4.tar.gz

所以我想知道如何从回购中获取最新的快照?我想自动化工件的下载过程,但随着名称的变化,我没有找到任何方法来实现这一点。

谢谢。

4

5 回答 5

6

如果在存储库中只保留一个 SNAPSHOT 是一个有效的选项

此 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任务来解决这个问题:

Maven - 删除快照

并将其配置为每分钟运行一次,删除除 1 个早于 0 天的快照版本之外的所有版本:

在此处输入图像描述

于 2018-06-27T09:23:09.230 回答
6

您可以在 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()的额外信息。然后,您可以使用它来获取baseVersionMaven 使用的 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\"]"
}

希望这会有所帮助!

于 2017-05-02T12:31:56.303 回答
3

目前这是不可能的。在我们构建 REST API 时,我们正在专门研究这样的用例,您应该期待在不久的将来会出现这种功能。

正如评论中提到的那样,您可能有一个用例,暂时最好仍然使用 Nexus Repository Manager 2。如果您熟悉 Groovy 和脚本,您还可以通过集成 API 扩展 Nexus Repository Manager 3 来完成您所描述的事情(我很乐意看到这一点)。有关使用它的更多信息在这里:https ://books.sonatype.com/nexus-book/reference3/scripting.html

于 2016-12-15T15:29:57.517 回答
2

在 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
于 2019-12-12T17:35:58.380 回答
0

我在这里的另一篇文章中找到了答案:Nexus 3 Rest api to check if component exists

我在评论区

found = found.unique().sort(); 

行并使用以下参数调用它:

-d'<reponame>,<groupid>,<artifactid>,<version>-SNAPSHOT,latest'

YMMV,但这为我做到了。然后,我能够使用此查询的结果构造一个 wget。

于 2017-10-20T18:38:25.573 回答