Автоматизировать развертывание в 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).
...
Другие вопросы по тегам