Как загружать банки с разными классификаторами и одинаковыми pom.xml на Nexus 2 из REST API с curl?

#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?).