Nexus 3 : how to get latest snapshot?

前端 未结 5 1609
日久生厌
日久生厌 2021-02-10 05:20

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 snap

相关标签:
5条回答
  • 2021-02-10 05:47

    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 !

    0 讨论(0)
  • 2021-02-10 06:01

    I found the answer in another post here: Nexus 3 Rest api to check if component exist

    I commented in the

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

    line and called it with the following parameters:

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

    YMMV but this did it for me. I was then able to construct a wget with the result of this query.

    0 讨论(0)
  • 2021-02-10 06:02

    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:

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

    0 讨论(0)
  • 2021-02-10 06:03

    Using the new REST API on Nexus v3 (exact version 3.17.0) the following request to retrieve the latest snapshot worked for me:

    /service/rest/v1/search/assets/download?sort=version&maven.artifactId=artifactId&maven.baseVersion=x.y.z-SNAPSHOT&maven.extension=jar
    
    0 讨论(0)
  • 2021-02-10 06:12

    This is currently not possible. We are looking at use cases like this one specifically as we build the REST API and you should expect this functionality in the nearish future.

    As alluded to in the comments, you might have a use case where it would be best to still use Nexus Repository Manager 2, for the time being. If you are handy with Groovy and scripting, you might also extend Nexus Repository Manager 3 via the Integration API to do what you describe (and I for one would love to see that). More info on using that is here: https://books.sonatype.com/nexus-book/reference3/scripting.html

    0 讨论(0)
提交回复
热议问题