Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nexus 3 : how to get latest snapshot?

As we all know Nexus 3 does not have REST API yet, which is very weird for me. I can only download artifacts manually using wget or curl. But as I'm using Maven 3, all the snapshots artifacts are named using timestamps like this :

myartifact-1.0-20161215.141522-4.tar.gz

So I want to know how I can get latest snapshots from a repo? I want to automate the download process of artifacts but as names change I didn't find any way to achieve this.

Thanks.

like image 796
hawarden_ Avatar asked Dec 15 '16 14:12

hawarden_


2 Answers

If keeping only one SNAPSHOT in the repository is a valid option

This API call will work: ${nexusUrl}/service/rest/beta/search/assets/download?maven.groupId=${groupId}&maven.artifactId=${artifactId}&maven.baseVersion=${version}

Though there is finally a 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 is tracking this feature request.

But until then I'm workarounding the problem by defining a Maven - Delete SNAPSHOT Task:

Maven - Delete SNAPSHOT

and configuring it to run every minute deleting all but 1 snapshot versions older than 0 days:

enter image description here

like image 191
Alberto Avatar answered Sep 28 '22 07:09

Alberto


You can create a script in Groovy and upload it to Nexus to do what you want.

Here's an example of a script I used to write to return all versions for a given group and repository.

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

The interesting part here is the tx.findComponents() that returns generic Component class. This class provides extra information about its container with the function attributes(). You can then use it to get the baseVersion i.e. the version Maven used to use (with the -SNAPSHOT suffix).

To install this script, just run the following :

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

You can then test it easily with :

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"

This will return all versions you want as you wanted :

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

Hope this'll help !

like image 40
Florent Dupont Avatar answered Sep 28 '22 05:09

Florent Dupont