【问题标题】:How to use Jenkins credentials when running `mvn deploy`?运行`mvn deploy`时如何使用Jenkins凭据?
【发布时间】:2020-06-03 19:24:48
【问题描述】:

我有一个 Maven 项目,想使用 mvn clean deploy 构建它,以便将构建的工件部署到 Nexus 存储库中。

该存储库的访问数据(用户名和密码)存储在 Jenkins 凭据中。

我想在 Jenkins 中调用 mvn deploy,以便从 Jenkins 中读取该 Nexus 存储库的凭据(未在 settings.xml 中硬编码)。

如果我无法访问 Jenkins 服务器上的settings.xml,我该怎么办?

更新 1:

我在“配置文件管理”(JENKINS_URL/configfiles/index) 中创建了一个条目,其中包含以下数据:

输入:Maven settings.xml

全部替换:是

服务器 ID:myServer

凭据:Credentials for the Nexus repository

内容:

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" 
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

  <servers>
    <server>
      <id>myServer</id>
      <username>foo</username>
      <password>bar</password>
    </server>
  </servers>
</settings>

myServer也用在我要构建的工件的pom.xml中:

    <distributionManagement>
        <repository>
            <id>myServer</id>
            <url>http://nexus.mycompany.com</url>
        </repository>
    </distributionManagement>

在作业的配置中,我包含了如下所示的那些设置。 Nexus settings.xml是“配置文件管理”中的配置。

但它不起作用——当构建尝试将工件部署到 Nexus 时,我收到“禁止”错误。

更新 2:当我使用与 Jenkins 中相同的凭据(存储在我的本地 settings.xml)在本地运行 mvn -X deploy 时,我看到以下输出:

[DEBUG] Failed to decrypt password for server XXX release repository: org.sonatype.plexus.components.sec.dispatcher.SecDispatcherException: java.io.FileNotFoundException: /XXXXXXXXXXXXXXX/.m2/settings-security.xml (No such file or directory)
org.sonatype.plexus.components.sec.dispatcher.SecDispatcherException: org.sonatype.plexus.components.sec.dispatcher.SecDispatcherException: java.io.FileNotFoundException: /XXXXXXXXXXXXXXX/.m2/settings-security.xml (No such file or directory)
    at org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher.decrypt(DefaultSecDispatcher.java:121)
    at org.apache.maven.settings.crypto.DefaultSettingsDecrypter.decrypt(DefaultSettingsDecrypter.java:107)
    at org.apache.maven.settings.crypto.DefaultSettingsDecrypter.decrypt(DefaultSettingsDecrypter.java:63)
    at org.apache.maven.internal.aether.DefaultRepositorySystemSessionFactory.newRepositorySession(DefaultRepositorySystemSessionFactory.java:165)

但是settings.xml中的密码根本没有加密:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                  https://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository/>
<interactiveMode/>
<offline/>
<pluginGroups/>
<servers>
  <server>
    <id>NEXUS_REPOSITORY_SNAPSHOTS</id>
    <username>user</username>
    <password>password</password>
  </server>
</servers>
<mirrors/>
<proxies/>
<profiles/>
<activeProfiles/>
</settings>

我发现了一个关于类似错误的报告here

【问题讨论】:

标签: java maven jenkins maven-3


【解决方案1】:

您可以使用 Jenkins config-file-provider 插件(链接:https://plugins.jenkins.io/config-file-provider/)创建一个或多个 Maven settings.xml 文件。

注意: 如果您需要不同的 settings.xml 不同的项目。

然后在 Jenkins 项目的 maven 部署步骤中,您可以选择指向定义的 settings.xml 文件之一(而不是指向通用 Jenkins 服务器 /.m2/settings.xml)

【讨论】:

  • 感谢您的回答。我觉得我在做类似的事情(如果我错了,请纠正我)——请参阅更新 1。
  • 您在更新中说,当构建尝试将工件部署到 Nexus 时出现“禁止”错误。你能分享完整的错误信息吗?
  • 这里是错误信息:Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project PROJECT_NAME: Failed to deploy artifacts: Could not transfer artifact PROJECT_NAME:jar:0.0.8 from/to NEXUS_REPOSITORY_SNAPSHOTS (http://NEXUS_URL/repository/maven-snapshots): Access denied to: http://NEXUS_URL/repository/maven-snapshots/PROJECT_NAME/0.0.8/PROJECT_NAME-0.0.8.jar, ReasonPhrase: Forbidden. -&gt; [Help 1]
  • 您应该避免在 content 上定义服务器。只需使用 服务器凭据 来定义每个服务器并确保您选择的凭据是正确的。此外,确保 jenkins 服务器能够联系到 nexus 服务器,并且所有变量都被正确评估(例如 NEXUS_URL )
  • 同样的问题。如果我写一个 jenkinsfile,我可以做同样的事情,但不是通过在 jenkins 的构建步骤中添加这个文件
猜你喜欢
  • 1970-01-01
  • 2014-05-31
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-25
  • 2011-10-06
  • 2021-05-07
相关资源
最近更新 更多