Nexus 3:如何获取最新快照?

Nexus 3 : how to get latest snapshot?

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

myartifact-1.0-20161215.141522-4.tar.gz

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

谢谢。

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

正如评论中提到的,您可能有一个用例,暂时最好仍然使用 Nexus Repository Manager 2。如果您对 Groovy 和脚本编写很得心应手,您还可以通过集成 API 扩展 Nexus Repository Manager 3 来执行您描述的操作(我个人很乐意看到)。有关使用它的更多信息,请访问:https://books.sonatype.com/nexus-book/reference3/scripting.html

您可以在 Groovy 中创建脚本并将其上传到 Nexus 以执行您想要的操作。

这是我用来写入 return 给定组和存储库的所有版本的脚本示例。

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;"
}

这里有趣的部分是 return 通用 Component class 的 tx.findComponents()。此 class 使用函数 attributes() 提供有关其 容器 的额外信息。 然后您可以使用它来获取 baseVersion 即 Maven 过去使用的版本(带有 -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"

这将 return 您想要的所有版本:

{
  "name" : "version",
  "result" : "[\"1.5.2-SNAPSHOT\",\"1.5.3-SNAPSHOT\",\"1.6.1-SNAPSHOT\",\"1.5.0-SNAPSHOT\"]"
}

希望这会有所帮助!

我在另一个 post 中找到了答案:

我在

评论了
found = found.unique().sort(); 

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

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

YMMV 但这对我有用。然后我能够用这个查询的结果构建一个 wget。

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

此 API 调用将起作用:${nexusUrl}/service/rest/beta/search/assets/download?maven.groupId=${groupId}&maven.artifactId=${artifactId}&maven.baseVersion=${version}

尽管终于有一个 Nexus3 API (see more on this in Sonatype's blog), the API does not yet provide the means to get the last SNAPSHOT version. This situation will hopefully be improved in the future: NEXUS-14407 正在跟踪此功能请求。

但在那之前,我通过定义一个 Maven - Delete SNAPSHOT 任务来解决这个问题:

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

在 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