travis-ci 无法部署到 sonatype
travis-ci failing to deploy to sonatype
我已经开始使用 travis-ci 来自动化我的构建。我有几个开源项目,它们都从它们去 Maven Central 的地方部署到 nexus sonatype。它们都是 Java 个使用 Maven 构建并 github 作为 repo 的项目。
多年来我一直在手动执行此操作,并且我有适当的密钥和登录名并且我的 pom 兼容等。
实施第一个很容易,它是一个 single module project and it builds and deploys just fine. Then I did a second one, a multi module project 并且以几乎相同的方式工作。然而,我的第三个让我感到困惑。
基于这个东西的 Maven 构建有点棘手,但它在本地 运行 很好,我什至 运行 在 travis 上成功构建了它。但是部署不起作用。
问题是,当它尝试连接到 nexus sonatype 时,我收到授权错误:
Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project madura-bundles:
Failed to deploy artifacts: Could not transfer artifact nz.co.senanque:madura-bundles:pom:4.5.6 from/to sonatype-nexus-staging (https://oss.sonatype.org/service/local/staging/deploy/maven2/):
Failed to transfer file: https://oss.sonatype.org/service/local/staging/deploy/maven2/nz/co/senanque/madura-bundles/4.5.6/madura-bundles-4.5.6.pom.
Return code is: 401, ReasonPhrase: Unauthorized.
看来我没有正确设置我的 sonatype 凭据。但我设置它的方式与我对其他两个项目所做的相同。 Specifically 我进入 Nexus Sonatype 并获取我的访问用户令牌并将它们添加到我的环境中(SONATYPE_USERNAME 和 SONATYPE_PASSWORD,我删除了这两个并重新输入它们以防万一是一个错字)。我还添加了对本地 Maven 设置文件中的引用:
...
<server>
<id>ossrh</id>
<username>${env.SONATYPE_USERNAME}</username>
<password>${env.SONATYPE_PASSWORD}</password>
</server>
...
本地maven设置文件是我项目中的一个文件,.travis.ymlmaven命令引用它。 travis.yml 文件有一个与其他两个(工作)项目相同的部署部分,除了我一直在添加额外的位来尝试使其工作。但是 none 的差异看起来是相关的。工作部署如下所示:
deploy:
provider: script
script: "mvn versions:set -DnewVersion=${TRAVIS_TAG} && mvn clean deploy -B -U -P release --settings travis/settings.xml"
on:
tags: true
所以这只会在 repo 被标记并且使用标记作为版本号时才会开始。在其他项目中,这工作正常,但在我试图开始工作的项目中却不行。该标记确实会按应有的方式触发部署,但部署失败。
有谁知道为什么我在一个项目上部署而不是另一个项目?感谢您的帮助。
好的,我明白了。问题是失败项目的父 pom 没有发布配置文件,工作项目的父 pom 有一个。两种情况下的发布配置文件如下所示:
<profile>
<id>release</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.3</version>
<extensions>true</extensions>
<configuration>
<serverId>ossrh</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
</plugins>
</build>
</profile>
需要使用 gpg 插件对生成的工件(jar 文件、javadoc 文件等)进行签名并将它们部署到 nexus。在没有这个的情况下尝试部署到 nexus,但是因为它没有对 serverId:ossrh 的引用,所以它不会从 Maven 设置文件中获取凭据,因此我收到授权错误。
发布配置文件需要在父项目和所有模块项目上。我已经将它添加到模块中但忘记了父项。
我已经开始使用 travis-ci 来自动化我的构建。我有几个开源项目,它们都从它们去 Maven Central 的地方部署到 nexus sonatype。它们都是 Java 个使用 Maven 构建并 github 作为 repo 的项目。 多年来我一直在手动执行此操作,并且我有适当的密钥和登录名并且我的 pom 兼容等。 实施第一个很容易,它是一个 single module project and it builds and deploys just fine. Then I did a second one, a multi module project 并且以几乎相同的方式工作。然而,我的第三个让我感到困惑。 基于这个东西的 Maven 构建有点棘手,但它在本地 运行 很好,我什至 运行 在 travis 上成功构建了它。但是部署不起作用。 问题是,当它尝试连接到 nexus sonatype 时,我收到授权错误:
Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project madura-bundles:
Failed to deploy artifacts: Could not transfer artifact nz.co.senanque:madura-bundles:pom:4.5.6 from/to sonatype-nexus-staging (https://oss.sonatype.org/service/local/staging/deploy/maven2/):
Failed to transfer file: https://oss.sonatype.org/service/local/staging/deploy/maven2/nz/co/senanque/madura-bundles/4.5.6/madura-bundles-4.5.6.pom.
Return code is: 401, ReasonPhrase: Unauthorized.
看来我没有正确设置我的 sonatype 凭据。但我设置它的方式与我对其他两个项目所做的相同。 Specifically 我进入 Nexus Sonatype 并获取我的访问用户令牌并将它们添加到我的环境中(SONATYPE_USERNAME 和 SONATYPE_PASSWORD,我删除了这两个并重新输入它们以防万一是一个错字)。我还添加了对本地 Maven 设置文件中的引用:
...
<server>
<id>ossrh</id>
<username>${env.SONATYPE_USERNAME}</username>
<password>${env.SONATYPE_PASSWORD}</password>
</server>
...
本地maven设置文件是我项目中的一个文件,.travis.ymlmaven命令引用它。 travis.yml 文件有一个与其他两个(工作)项目相同的部署部分,除了我一直在添加额外的位来尝试使其工作。但是 none 的差异看起来是相关的。工作部署如下所示:
deploy:
provider: script
script: "mvn versions:set -DnewVersion=${TRAVIS_TAG} && mvn clean deploy -B -U -P release --settings travis/settings.xml"
on:
tags: true
所以这只会在 repo 被标记并且使用标记作为版本号时才会开始。在其他项目中,这工作正常,但在我试图开始工作的项目中却不行。该标记确实会按应有的方式触发部署,但部署失败。 有谁知道为什么我在一个项目上部署而不是另一个项目?感谢您的帮助。
好的,我明白了。问题是失败项目的父 pom 没有发布配置文件,工作项目的父 pom 有一个。两种情况下的发布配置文件如下所示:
<profile>
<id>release</id>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.3</version>
<extensions>true</extensions>
<configuration>
<serverId>ossrh</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
</plugins>
</build>
</profile>
需要使用 gpg 插件对生成的工件(jar 文件、javadoc 文件等)进行签名并将它们部署到 nexus。在没有这个的情况下尝试部署到 nexus,但是因为它没有对 serverId:ossrh 的引用,所以它不会从 Maven 设置文件中获取凭据,因此我收到授权错误。 发布配置文件需要在父项目和所有模块项目上。我已经将它添加到模块中但忘记了父项。