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

时间:2016-12-15 14:35:07

标签: maven nexus nexus3

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

myartifact-1.0-20161215.141522-4.tar.gz

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

感谢。

5 个答案:

答案 0 :(得分: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()提供有关其容器的额外信息。 然后,您可以使用它来获取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"

这将返回您想要的所有版本:

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

希望这会有所帮助!

答案 1 :(得分:3)

目前无法做到这一点。我们正在研究像这样的用例,因为我们构建了REST API,您应该在不久的将来期待这个功能。

正如评论中所提到的,您可能有一个用例,目前最好仍然使用Nexus Repository Manager 2。如果您使用Groovy和脚本编写方便,您也可以通过Integration API扩展Nexus Repository Manager 3以执行您所描述的操作(我希望您能够看到它)。有关使用的更多信息,请访问:https://books.sonatype.com/nexus-book/reference3/scripting.html

答案 2 :(得分:3)

如果在存储库中仅保留一个快照是有效的选择

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

尽管最终有一个Nexus3 API(请参阅此in Sonatype's blog的更多信息),但该API尚未提供获取最新SNAPSHOT版本的方法。希望将来可以改善这种情况:NEXUS-14407正在跟踪此功能请求。

但是直到那时,我都通过定义Maven - Delete SNAPSHOT任务来解决该问题:

Maven - Delete SNAPSHOT

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

enter image description here

答案 3 :(得分:1)

在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

答案 4 :(得分:0)

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

我在

中评论过
found = found.unique().sort(); 

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

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

YMMV,但这对我来说。然后我能够使用此查询的结果构造一个wget。