#maven #curl #nexus
#maven #curl #nexus
Вопрос:
Я довольно долго боролся с этим.
Предыстория: у нас есть несколько заданий Дженкинса, которые создают банки, и другие задания, которые загружают банки в nexus. В нашем случае мы ищем myJar-1.0.jar
и myJar-1.0-myClassifier.jar
. Очевидно, что они оба созданы с одним и тем же pom.xml
файлом.
Чего я пытаюсь добиться, так это загрузить их оба в Nexus (мы используем Nexus2) через REST API с помощью команды curl с использованием pom.xml
. pom.xml
Файл выглядит примерно так:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>my.group.id</groupId>
<artifactId>myJar</artifactId>
<version>1.0</version>
<name>My Name</name>
<packaging>pom</packaging>
<properties>
<otherJar.version>1.5</otherJar.version>
...
</properties>
<dependencies>
<dependency>
<groupId>x.y</groupId>
<artifactId>art</artifactId>
<version>{$otherJar.version}</version>
</dependency>
...
</dependencies>
</project>
Команда curl, которую я использую для загрузки (jar без классификатора):
curl -v -F r=releases -F hasPom=true -F e=jar -F file=@pom.xml -F file=@myJar-1.0.jar -u user:pass http://link/to/nexus/service/local/artifact/maven/content
и это работает так, как ожидалось. Jar загружается в nexus с идентификатором группы, идентификатором артефакта и версией, указанными в pom.xml досье.
Мой вопрос — после того, как я загружу этот jar, как я могу загрузить jar с classifier
предоставленным у нас одинаковым pom.xml
?
- Должен ли я изменить
pom.xml
файл? Если да, то как? - Должен ли я изменить команду curl? Я пытался добавить
-F c=myClassifier
, но это не сработало. Это привело к ошибке, вызванной Nexus:<html><body><error>Repository with ID='releases' does not allow updating artifacts.</error></body></html>
(потому что уже существует артефакт с тем же groupid, artifactid и version — тот, который я только что загрузил; кажется, что классификатор игнорируется)
Комментарии:
1. Почему у вас есть отдельные задания для сборки и развертывания в Jenkins. Maven может выполнить развертывание без каких-либо проблем, и все будет работать … никаких проблем с Curl и т. Д.
2. Короткий ответ на этот вопрос был бы — это сложно 🙂 Я попытался максимально упростить контекст, чтобы задать вопрос. К сожалению, мы не можем изменить способ определения заданий на данный момент.
3. Все артефакты и pom должны быть загружены одним выстрелом. Поскольку это NXRM 2, вы можете использовать пользовательский интерфейс для проверки этого, просматривая HTTP-трафик, чтобы определить правильные параметры: blog.sonatype.com /…
Ответ №1:
Итак, я попробовал несколько решений и не смог найти то, которое удовлетворяет моим потребностям (загружает несколько jar с одним и тем же pom и разными классификаторами через REST API) с помощью одного или нескольких вызовов.
В итоге я установил maven на компьютер, на котором выполнялись мои скрипты, и использовал maven deploy:deploy-file
следующее:
maven deploy:deploy-file
-DpomFile=pom.xml
-Dfile=myJar-1.0.jar
-Dpackaging=jar // this doesn't have to be specified, it will be taken from the pom file, however in my case the pom was specifying <packaging>pom</packaging> and the jar ended up with .pom extention
-Dclassifiers=myClassifier // here you can define multiple classifiers, comma-separated
-Dtypes=jar // same as above
-Dfiles=myJar-1.0-myClassifier.jar // same as above
-DrepositoryId=nexus
-Durl=http://host:port/nexus/content/repositories/releases
Вы можете найти полную документацию здесь.
Кроме того, обратите внимание, что вы должны определить свои учетные данные репозитория nexus в файле конфигурации maven ( maven_home/conf/settings.xml
). Найдите узел servers
в этом файле и добавьте что-то похожее на это:
<server>
<id>nexus</id>
<username>yourUserName</username>
<password>yourPass</password>
</server>
В конце я хочу подчеркнуть тот факт, что я думаю, что это недостающая функция / ошибка REST API Nexus2. Как вы можете видеть из приведенного выше фрагмента, этого можно достичь, загрузив банки с помощью maven, и это также может быть достигнуто вручную из интерфейса Nexus. Однако мне не удалось сделать это через REST API. Это может быть возможно, потому что я не нашел правильного способа его вызова, но я не смог найти (почти) никакой документации … облом.
Кроме того, последнее замечание по этому вопросу — я оставлю это нерешенным, поскольку это не отвечает на мой первоначальный вопрос (как это может быть достигнуто с помощью REST API?).