自动部署到sonatype的oss maven存储库 [英] automate deployment to sonatype's oss maven repository

查看:115
本文介绍了自动部署到sonatype的oss maven存储库的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有几个github java项目.我已手动将其中之一部署到sonatype的存储库中,以便将其发布在maven Central中.

I've got several github java projects. One of them I've manually deployed to sonatype's repository so that it gets published in maven central.

从某种意义上来说,这似乎是一个痛苦的过程,因为这似乎涉及到太多的难题,无法完成,并且需要大量的手动工作,我想实现这一点的自动化. 所以我实际上停止了这样做,因为这是太多的工作.有大量文档表明这是可行的,并且相当多的文档表明它某种程度上涉及使用 nexus-staging-maven-plugin 进行操作. 不幸的是,所有这些文档(都是典型的Maven风格)都跳过了一些基本细节,这些细节使我能够以一种直接的方式找出使我能够自动将发布版本自动发布到sonatype存储库的最小步骤(即,没有我手动批准的内容).

This has been a somewhat painful process in the sense that it seems to involve too many hoops to jump through and a lot of manual work and I'd like to automate that. So I actually stopped doing that because it was just too much work. There's plenty of documentation that suggests this is possible and quite a bit that suggest that it somehow involves doing something with the nexus-staging-maven-plugin. Unfortunately all of that documentation is (in typical maven style) skipping over the essential details that would allow me to figure out in a straightforward way the minimum amount of steps necessary that allow me to automatically publish release builds to the sonatype repository (i.e. without me manually approving things).

所以,我的 pom 中需要出现什么内容(假设是沼泽标准的简单而不复杂的Java项目),包括sonatype存储库的url,我发现的所有文档似乎都坚持使用localhost:8081,并进行发布(最好通过 mvn发布插件 )进行必要的Maven咒语,让其签署工件并拥有将生成的工件部署到声纳,批准并准备好同步到Maven Central等.

So, what is the blurb that needs to be present in my pom (assume a otherwise bog standard uncomplicated java project), including urls for the sonatype repository, all documentation I've found seems to insist localhost:8081 is it, and the required maven incantations to make it do a release (preferably via the mvn release plugin), have it sign the artifacts, and have it deploy the resulting artifacts to sonatype, approved and all ready to be synced to maven central, etc.

因此,我有点想在红宝石世界中替代宝石推"的专家,以一种方便的衬板完成这项工作.这是给出我批准的jar文件的一个简单案例,如何使它以最少的麻烦最终在maven中央.

So, I'm sort of looking for the maven replacement of a "gem push" in the ruby world, which gets the job done in a convenient one liner. It's a simple case of given a jar file approved by me, how do I get it to end up in maven central with the least amount of fuss.

我非常感谢一些已经设置好的pom文件示例,可以复制和修改.

I'd very much appreciate some examples of pom files already setup to do this that I can copy and adapt.

这是我的工作 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)使我走上了正轨,但仅靠我自己还不够.

The comment (@aurelien-thieriot) below put me on the right track but was not enough by itself.

最后,我将 sonatype父pom 放到我的pom 文件中.

In the end I took the sonatype parent pom and flattened it into my pom file.

这使我可以正常使用 mvn发布插件 .它将工件上传到sonatype分级存储库.然后,要释放工件,我实际上需要登台存储库ID. 您可以从 https://oss.sonatype.org/index.html# stagingRepositories .

This allows me to use the mvn release plugin normally. It uploads the artifacts to the sonatype staging repository. Then to release the artifacts, I actually needed the staging repository id. You can find this from the repositories view in https://oss.sonatype.org/index.html#stagingRepositories.

在我的情况下,命令行变为:

In my case the command line became:

mvn nexus-staging:release -Ddescription="Release 1.33" -DstagingRepositoryId=comjillesvangurp-1002

没有正确的ID,它仍然无法解决,仍然失败: Sonatype Maven登台插件问题

Without the right id it doesn't figure it out and still fails: Sonatype Maven Staging Plugin Issue

因此95%是自动化的,但是我仍然需要每次都弄清 stagingRepositoryId .

So 95% automated but I still need to figure out the stagingRepositoryId every time.

mvn release:perform实际上告诉您登台存储库的ID. 我猜您可以编写一个脚本,从输出中提取此ID,然后将其传递到下一步.如果有人知道也可以使mvn release:perform进行分阶段发布的mvn巫毒,将不胜感激.

mvn release:perform actually tells you the id of the staging repository. I guess you could write a script that extracts this id from the output and then passes it in to the next step. If somebody knows some mvn voodoo to make mvn release:perform do the staging release as well, it would be much appreciated.

推荐答案

为方便Maven项目,Sonatype提供了一个父POM,您可以使用所有基本配置将其添加到您的项目中:

For the convenience of Maven projects, Sonatype is providing a parent POM you can add to your project with all the basic configuration:

https://docs.sonatype.org/display/Repository/Sonatype+OSS+Maven+Repository+Usage+Guide#SonatypeOSSMavenRepositoryUsageGuide-Changesto%7B%7Bpom.xml%7D%7D

重要的几位是:

  <parent>
    <groupId>org.sonatype.oss</groupId>
    <artifactId>oss-parent</artifactId>
    <version>7</version>
  </parent>

以及源代码存储库的详细信息:

And the source code repository details:

  <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会正确填写您的凭据:

You will also need GPG to be install on your computer (Required to sign the packages) and our settings.xml correctly filled with your credentials:

  <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>

在那之后,您应该能够使用两个步骤发布:

After that, you should be able to use the two steps release:

$ mvn release:prepare

$ mvn release:perform

不幸的是,我不知道使流程中的手动批准部分自动化的任何方法(在oss.sonatype.org中).但这已经可以为您节省一些时间.

Unfortunately, I don't know any way of automate the manual approval part of the process (In oss.sonatype.org). But that should already save you some times.

如上所示,该文档可能有些混乱,但是非常完整,可以为您提供各种情况所需的全部知识.

The documentation, as shown above, is probably a bit convoluted but is very complete and gives you all you need to know for various scenarios.

实际上,我认为我错了,并且在自动批准过程中有一部分.有趣.

In fact I think I am wrong and there is a part on automate approval process. Interesting.

对于这一部分,您是正确的,详细信息非常有限.不过,我希望配置的第一部分已经对您有所帮助.我需要进一步研究这些分阶段的东西(或者也许其他人已经做到了!)

And for this part you are right, the details are quite limited. Though, I hope the first part of the configuration already helps you a little bit. I need to look further into this staging stuff (Or maybe someone else would have already done it !)

EDIT_AGAIN:

EDIT_AGAIN:

我需要实际尝试一下,但这听起来像是以下内容:

I need to actually try it but it would sound like something as follow:

        <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>

根据文档,应使用正确的登台工作流(包括关闭)替换部署,这样将离开最新步骤:

According to the documentation, the deploy should be replaced by the right staging workflow (Including the close) and it would left the latest step:

$ mvn nexus-staging:release -Ddescription="Yippie!"

要测试...

这篇关于自动部署到sonatype的oss maven存储库的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆