【问题标题】:Attempting to use scm:tag in a Jenkins job for a Git repository that requires a username/password尝试在需要用户名/密码的 Git 存储库的 Jenkins 作业中使用 scm:tag
【发布时间】:2014-04-15 12:47:44
【问题描述】:

我正在尝试按照 Axel Fontaine (http://axelfontaine.com/blog/final-nail.html) 的描述配置 Jenkins/Maven/Git 发布构建作业。我按照他的描述对我的 POM 进行了添加,并相应地配置了我的 Jenkins 工作。

在源代码管理部分,我输入了我们内部托管的 Stash 实例的存储库 URL(需要用户名和密码 - SSH 密钥不是一个选项):https://stash.mycompany.com/scm/st_proj/my_repo.git

我提供了用户名/密码凭据。

在博文中,我创建了一个 Maven 前置步骤,其目标是 versions:set -DnewVersion=$BUILD_NUMBER

正如在博文中一样,我将构建目标设置为deploy scm:tag

当作业执行时,我收到以下错误。

[ERROR] Provider message:
[ERROR] The git-push command failed.
[ERROR] Command output:
[ERROR]
(gnome-ssh-askpass:32706):  Gtk-WARNING **: cannot open display:
error: unable to read askpass response from '/usr/libexec/openssh/gnome-ssh-askpass'
fatal: could not read Username for 'https://stash.mycompany.com': No such device or address

我意识到这是因为 Git 命令试图提示我输入用户名和密码,但由于这是作为 Jenkins 的作业运行的,因此没有任何显示器可以将提示发送到。

为什么在我之前在作业配置中设置用户名和密码时提示我输入用户名和密码?我知道它们是正确的,因为它们是克隆存储库所必需的。

【问题讨论】:

  • 您是否在 settings.xml 文件中正确设置了服务器?本地以及您的 CI 系统上?
  • 我是这么认为的,@khmarbaise。对于这个问题,我应该关注哪些服务器设置?
  • 你有没有在你的 jenkins 服务器上手动尝试过这些东西?关于https://stash.mycompany.com': No such device or address 的提示看起来像网络问题。
  • @khmarbaise,如果我以 Jenkins 用户身份从命令行运行 git push,则会提示我输入用户名和密码。输入这些,我收到消息no changes added to commit。所以我不认为这个问题是网络问题。

标签: git maven jenkins


【解决方案1】:

您还需要在 maven 中配置您的 git 凭据。

首先在<settings> <servers><settings> <servers>下的maven settings.xml中声明一个服务器

<server>
    <id>gitserver</id>
    <username>git-user</username>
    <password>**************</password>
</server>

然后在你的项目pom.xml属性中引用你的服务器

<project.scm.id>gitserver</project.scm.id>

http://maven.apache.org/maven-release/maven-release-plugin/faq.html#credentials

【讨论】:

    【解决方案2】:

    另一个(更好的)解决方案:

    在 Jenkins 中,不要使用 scm:tag 目标,而是使用 Git Publisher 构建后操作。在这里您可以设置标签并将其推送到存储库,插件使用存储在 Jenkins 中的凭据!

    【讨论】:

    • 我知道这篇文章已经有一年了。但是你知道我们是否可以使用 pom.xml 中定义的版本创建一个新标签吗? v-${project.version} 之类的 [将解析为 v-2.0.0 之类的]?我不确定 ${project.version} 是否会在这里解决?
    • @user320550 我不知道有什么办法可以做到这一点,但你可以换一种方式。如果您使用 EnvInject 插件 (wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin),您可以从签出目录中读取包含您的版本号的属性文件。该版本将可供您在标签中使用。然后,您可以使用 Maven 版本插件在构建时在 POM 中设置版本。这样一来,您的版本号都是从同一来源设置的。
    【解决方案3】:

    在研究了一段时间后,我找到了一种解决方法——如果不是解决方案的话。 (仍然欢迎解决方案)

    1. 登录到 Jenkins 构建从站(以运行构建作业的用户身份)
    2. 设置凭证缓存git config --global credential.helper 'cache --timeout 600'

    现在,当凭据用于克隆存储库时,它们会被 Git 缓存以供后续推送命令使用。

    【讨论】:

    • 这解决了我的问题。 Git Publisher 构建后操作不是一个选项,因为我想指定要标记的 git 提交 ID(不依赖于 HEAD 作为提交标记)。
    • 我很确定 Git Publisher 标记了为构建签出的版本。
    • 我们也遇到过类似的问题,凭证助手使用的默认超时时间为 900 秒,因此当构建时间(偶尔)超过 15 分钟时,它无法推送 :) 感谢您的指点我们的解决方案!
    猜你喜欢
    • 2023-02-04
    • 1970-01-01
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    相关资源
    最近更新 更多