Автоматизировать развертывание в oss maven репозитории sonatype
У меня есть несколько проектов GitHub Java. Один из них я вручную развернул в репозитории sonatype, чтобы он был опубликован в maven central.
Это был довольно болезненный процесс в том смысле, что он, кажется, включает слишком много обручей для прыжка и много ручной работы, и я хотел бы автоматизировать это. Так что я на самом деле перестал это делать, потому что это было слишком много работы. Существует множество документов, которые предполагают, что это возможно, и довольно много, которые предполагают, что это как-то связано с выполнением чего-либо с помощью nexus-staging-maven-plugin. К сожалению, вся эта документация (в типичном стиле maven) пропускает важные детали, которые позволили бы мне простым способом вычислить минимальное количество необходимых шагов, которые позволили бы мне автоматически публиковать релизные сборки в репозиторий sonatype (т.е. без меня). ручное одобрение вещей).
Итак, что такое реклама, которая должна присутствовать в моем pom (предположим, что это стандартный несложный java-проект), включая URL-адреса для репозитория sonatype, вся документация, которую я нашел, настаивает на том, что localhost:8081 это и требуется заклинания maven, чтобы заставить его выпустить релиз (предпочтительно через плагин релиза mvn), подписать артефакты и развернуть полученные артефакты в sonatype, одобренный и готовый для синхронизации с центральным maven и т. д.
Итак, я в некотором роде ищу замену "мощного толчка" в мире рубинов, который выполняет свою работу в удобной линейке. Это простой случай получения одобренного мною файла jar, как мне получить его в maven central с наименьшим количеством суеты.
Я был бы очень признателен за некоторые примеры файлов pom, уже настроенных для этого, которые я могу копировать и адаптировать.
Редактировать:
Вот мой рабочий файл pom:
<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>com.jillesvangurp</groupId>
<artifactId>jsonj</artifactId>
<version>1.34-SNAPSHOT</version>
<name>JsonJ</name>
<description>A framework for working with json in Java the "proper" way. No mappings or model classes, it's all just lovely json, but in Java.</description>
<url>https://github.com/jillesvangurp/jsonj</url>
<licenses>
<license>
<name>MIT license</name>
<url>https://github.com/jillesvangurp/jsonj/blob/master/LICENSE</url>
<distribution>repo</distribution>
</license>
</licenses>
<scm>
<url>git://git@github.com:jillesvangurp/jsonj.git</url>
<connection>scm:git:git@github.com:jillesvangurp/jsonj.git</connection>
<developerConnection>scm:git:git@github.com:jillesvangurp/jsonj.git</developerConnection>
</scm>
<repositories>
<repository>
<id>sonatype-nexus-snapshots</id>
<name>Sonatype Nexus Snapshots</name>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
<releases>
<enabled>false</enabled>
</releases>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
</repositories>
<distributionManagement>
<snapshotRepository>
<id>sonatype-nexus-snapshots</id>
<name>Sonatype Nexus Snapshots</name>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</snapshotRepository>
<repository>
<id>sonatype-nexus-staging</id>
<name>Nexus Release Repository</name>
<url>https://oss.sonatype.org/service/local/staging/deploy/maven2/</url>
</repository>
</distributionManagement>
<developers>
<developer>
<id>jillesvangurp</id>
<name>Jilles van Gurp</name>
<url>http://www.jillesvangurp.com</url>
<timezone>gmt+1</timezone>
<roles>
<role>Main Developer</role>
</roles>
</developer>
</developers>
<organization>
<name>www.jillesvangurp.com</name>
<url>http://jillesvangurp.com</url>
</organization>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<verbose>true</verbose>
<fork>true</fork>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.8.1</version>
<executions>
<execution>
<id>documentation</id>
<phase>prepare-package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>gathersource</id>
<phase>prepare-package</phase>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6</version>
<extensions>true</extensions>
<configuration>
<!-- The Base URL of Nexus instance where we want to stage -->
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<serverId>sonatype-nexus-staging</serverId>
</configuration>
</plugin>
</plugins>
<extensions>
<extension>
<artifactId>wagon-webdav-jackrabbit</artifactId>
<groupId>org.apache.maven.wagon</groupId>
<version>2.2</version>
</extension>
</extensions>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.1</version>
<configuration>
<mavenExecutorId>forked-path</mavenExecutorId>
<useReleaseProfile>false</useReleaseProfile>
<arguments>-Psonatype-oss-release</arguments>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<profiles>
<profile>
<id>sonatype-oss-release</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<dependencies>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>6.8.7</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-all</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
<exclusions>
<exclusion>
<artifactId>junit</artifactId>
<groupId>junit</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>xom</groupId>
<artifactId>xom</artifactId>
<version>1.2.5</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>commons-lang</groupId>
<artifactId>commons-lang</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>com.jillesvangurp</groupId>
<artifactId>efficientstring</artifactId>
<version>1.11</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.2.3</version>
</dependency>
</dependencies>
</project>
Приведенный ниже комментарий (@aurelien-thieriot) поставил меня на правильный путь, но сам по себе его не хватило.
В конце концов я взял pom родительского типа и поместил его в файл pom.
Это позволяет мне использовать плагин mvn release как обычно. Он загружает артефакты в репозиторий сценического типа. Затем, чтобы освободить артефакты, мне на самом деле нужен был идентификатор промежуточного хранилища. Вы можете найти это в представлении репозиториев в https://oss.sonatype.org/index.html.
В моем случае командная строка стала:
mvn nexus-staging:release -Ddescription="Release 1.33" -DstagingRepositoryId=comjillesvangurp-1002
Без правильного идентификатора он не может понять это и все равно не работает: Sonatype Maven Staging Plugin Issue
Таким образом, 95% автоматизированы, но мне все еще нужно вычислять stagingRepositoryId каждый раз.
Редактировать:
mvn release:perform
на самом деле говорит вам идентификатор промежуточного хранилища. Я думаю, вы могли бы написать скрипт, который извлекает этот идентификатор из вывода и затем передает его на следующий шаг. Если кто-то знает что-нибудь, что нужно сделать mvn release:perform
Сделайте также постановочный релиз, это будет высоко ценится.
2 ответа
Для удобства проектов Maven Sonatype предоставляет родительский POM, который вы можете добавить в свой проект со всей базовой конфигурацией:
https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide
Важные биты:
<parent>
<groupId>org.sonatype.oss</groupId>
<artifactId>oss-parent</artifactId>
<version>7</version>
</parent>
И детали репозитория исходного кода:
<scm>
<connection>scm:svn:http://foo.googlecode.com/svn/trunk/</connection>
<developerConnection>scm:svn:https://foo.googlecode.com/svn/trunk/</developerConnection>
<url>http://foo.googlecode.com/svn/trunk/</url>
</scm>
Вам также понадобится установить GPG на ваш компьютер (необходим для подписи пакетов) и наши settings.xml
правильно заполнены вашими учетными данными:
<servers>
<server>
<id>sonatype-nexus-snapshots</id>
<username>your-jira-id</username>
<password>your-jira-pwd</password>
</server>
<server>
<id>sonatype-nexus-staging</id>
<username>your-jira-id</username>
<password>your-jira-pwd</password>
</server>
</servers>
После этого вы сможете использовать два этапа выпуска:
$ mvn release:prepare
$ mvn release:perform
К сожалению, я не знаю какого-либо способа автоматизировать часть процесса ручного утверждения (In oss.sonatype.org). Но это уже должно спасти тебя несколько раз.
Документация, как показано выше, вероятно, немного запутанная, но очень полная и дает вам все, что вам нужно знать для различных сценариев.
РЕДАКТИРОВАТЬ:
На самом деле, я думаю, что я не прав, и есть часть процесса автоматизации процесса утверждения. Интересно.
И в этой части вы правы, детали довольно ограничены. Впрочем, я надеюсь, что первая часть конфигурации вам немного поможет. Мне нужно посмотреть дальше на эту постановку (или, может быть, кто-то еще сделал бы это!)
EDIT_AGAIN:
Мне нужно попробовать, но это будет звучать так:
<plugins>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6</version>
<extensions>true</extensions>
<configuration>
<!-- The Base URL of Nexus instance where we want to stage -->
<nexusUrl>https://oss.sonatype.org/service/local/staging/deploy/maven2/</nexusUrl>
<serverId>sonatype-nexus-staging</serverId>
</configuration>
</plugin>
</plugins>
Согласно документации, развертывание должно быть заменено правильным промежуточным рабочим процессом (включая закрытие), и он оставит последний шаг:
$ mvn nexus-staging:release -Ddescription="Yippie!"
ДЛЯ ТЕСТИРОВАНИЯ...
Таким образом, 95% автоматизированы, но мне все еще нужно вычислять stagingRepositoryId каждый раз.
Ты можешь использовать mvn nexus-staging:rc-list
В частности, делая mvn release:rc-list
и используя grep
или что-то еще, чтобы отфильтровать вывод от этого по некоторой форме идентификатора группы или другой подстроки, которую вы знаете stagingRepositoryId
быть, вы можете определить полный stagingRepositoryId
значение
Например, идентификатор группы для моего проекта nu.validator
и мой stagingRepositoryId
значения все в форме nuvalidator-NNNN
где NNNN
часть это число, которое началось с 1000
с моим первым выпуском и что система увеличивается на 1 каждый раз, когда я выпускаю; так nuvalidator-1000
, nuvalidator-1001
, и так далее.
Итак, в скрипте Python, который я использую для своей сборки, я просто делаю это:
output = subprocess.check_output("mvn nexus-staging:rc-list -DnexusUrl=https://oss.sonatype.org/ -DserverId=ossrh")
for line in output.split('\n'):
if "nuvalidator" in line:
stagingRepositoryId = "nuvalidator-" + line[8:23]
...
Это потому, что соответствующие строки возвращаются в mvn nexus-staging:rc-list
вывод в виде:
...
[INFO] central_bundles-3514 OPEN Implicitly created (auto staging).
[INFO] central_bundles-3515 OPEN Implicitly created (auto staging).
[INFO] central_bundles-3521 OPEN Implicitly created (auto staging).
[INFO] nuvalidator-1008 OPEN Implicitly created (auto staging).
...