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.
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 !