Nexus 3: как получить последний снимок?

Как мы все знаем, в Nexus 3 пока нет REST API, что для меня очень странно. Я могу загружать артефакты только вручную, используя wget или curl. Но поскольку я использую Maven 3, все артефакты моментальных снимков именуются с использованием таких временных меток:

myartifact-1.0-20161215.141522-4.tar.gz

Итак, я хочу знать, как я могу получить последние снимки из репо? Я хочу автоматизировать процесс загрузки артефактов, но по мере изменения имен я не нашел способа добиться этого.

Спасибо.


person hawarden_    schedule 15.12.2016    source источник
comment
Просто любопытно: почему вы используете Nexus 3 вместе с Maven?   -  person J Fabian Meier    schedule 15.12.2016
comment
Поскольку наш проект основан на maven (Java), что бы вы сделали?   -  person hawarden_    schedule 15.12.2016
comment
Мы используем Nexus 2.x до тех пор, пока Nexus 3 полностью не удовлетворит наши потребности.   -  person J Fabian Meier    schedule 15.12.2016
comment
Просто отметим: я не уверен насчет Nexus, но с Artifactory это возможно. Например. Я создал крошечный скрипт, который загружает артефакты для меня на работе и использует REST API. Вы можете увидеть это здесь: github.com/pwittchen/ydownloader. Если вы можете обновить свою инфраструктуру, вы можете рассмотреть такой вариант.   -  person Piotr Wittchen    schedule 15.12.2016
comment
К сожалению, мы использовали Nexus 3 несколько месяцев и не можем вернуться к Nexus 2.   -  person hawarden_    schedule 15.12.2016
comment
Возможный дубликат Sonatype Nexus 3 — получить последний снимок   -  person Alberto    schedule 27.06.2018
comment
В Nexus 3 теперь есть нужный вам REST API. stackoverflow.com/questions/ 37280818/   -  person user1717259    schedule 15.08.2019


Ответы (5)


Если допустимо хранить только один SNAPSHOT в репозитории

Этот вызов API будет работать: ${nexusUrl}/service/rest/beta/search/assets/download?maven.groupId=${groupId}&maven.artifactId=${artifactId}&maven.baseVersion=${version}

Хотя, наконец, появился API Nexus3 (подробнее об этом в блоге Sonatype), API еще не предоставляет означает получение последней версии SNAPSHOT. Мы надеемся, что в будущем эта ситуация улучшится: NEXUS-14407 отслеживает этот запрос функции.

Но до тех пор я решаю проблему, определяя задачу Maven - Delete SNAPSHOT:

«Maven —

и настроить его на запуск каждую минуту, удаляя все версии моментальных снимков, кроме 1, старше 0 дней:

введите описание изображения здесь

person Alberto    schedule 27.06.2018
comment
Это очень полезный ответ. По состоянию на апрель 2019 года эта функция была добавлена. Документация находится здесь community.sonatype. ком/т/. - person user1717259; 16.08.2019

Вы можете создать сценарий в 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\"]"
}

Надеюсь, это поможет!

person Florent Dupont    schedule 02.05.2017
comment
Я бы настоятельно рекомендовал запустить это внутри блока try/finally и закрыть транзакцию (через tx.close()) внутри части finally. Я использовал это как отправную точку для сценария, и после 12-48 часов работы моя установка Nexus зависала и больше не отвечала на запросы артефактов. Этот сценарий даже включен в заявку, в которой точно описывается моя ситуация. - person richid; 27.10.2017

В настоящее время это невозможно. Мы рассматриваем такие варианты использования, как этот, особенно при создании REST API, и вы должны ожидать эту функциональность в ближайшем будущем.

Как упоминалось в комментариях, у вас может быть вариант использования, в котором было бы лучше пока использовать Nexus Repository Manager 2. Если вы хорошо разбираетесь в Groovy и написании сценариев, вы также можете расширить Nexus Repository Manager 3 через Integration API, чтобы делать то, что вы описываете (и я, например, хотел бы это увидеть). Подробнее об этом можно узнать здесь: https://books.sonatype.com/nexus-book/reference3/scripting.html

person DarthHater    schedule 15.12.2016
comment
Привет, ты разработчик Nexus? Да, в настоящее время я просматриваю Groovy REST API, я создал проект Maven и хотел бы знать, должен ли я загрузить скрипт в свой репозиторий Nexus и запустить скрипт с помощью curl? - person hawarden_; 15.12.2016
comment
Я ПОЧТИ разработчик, то есть время от времени пишу плохой код. Здесь есть множество сценариев (включая сценарии оболочки для загрузки и т. д.), на которые вы можете опираться, чтобы делать то, что вы хотите: github.com/sonatype/nexus-book-examples/tree/nexus-3.x/ - person DarthHater; 15.12.2016
comment
ха-ха, спасибо, я уже сделал клон git, но в примере почти ничего нет, только javadoc, который не так полезен. - person hawarden_; 15.12.2016
comment
Вы захотите использовать этот скрипт для загрузки файла (при необходимости изменив имя пользователя/пароль) github.com/sonatype/nexus-book-examples/blob/nexus-3.x/ и пример файла json, который вы можете изменить с помощью вашего скрипта будет примерно так: github.com/sonatype/nexus-book-examples/blob/nexus-3.x/ - person DarthHater; 15.12.2016

Используя новый REST API на Nexus v3 (точная версия 3.17.0), у меня сработал следующий запрос на получение последнего снимка:

/service/rest/v1/search/assets/download?sort=version&maven.artifactId=artifactId&maven.baseVersion=x.y.z-SNAPSHOT&maven.extension=jar
person aruizca    schedule 12.12.2019

Я нашел ответ в другом сообщении здесь: Nexus 3 Rest API для проверить, существует ли компонент

Я прокомментировал в

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

строку и вызвал ее со следующими параметрами:

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

YMMV, но это сделало это для меня. Затем я смог создать wget с результатом этого запроса.

person Glenn Buckholz    schedule 20.10.2017