4

问题

我正在尝试在 Jenkins 中构建我的应用程序,它位于 Github 上的私有仓库中,还有一个私有子模块。

我可以通过设置凭据来克隆 Jenkins 中的私有存储库,但 Jenkins 无法克隆子模块,这是构建失败的输出:

Started by an SCM change
Building in workspace /var/lib/jenkins/jobs/Project/workspace
Fetching changes from the remote Git repository
Fetching upstream changes from git@github.com:user/repogit
using GIT_SSH to set credentials 
Checking out Revision 9cc99b67cc676d0ea8ccd489a8327f5c6dbb8d7f (origin/branch)
[workspace] $ /bin/sh -xe /tmp/hudson2710403018107019432.sh
+ git submodule update --init --recursive
Initialized empty Git repository in /var/lib/jenkins/jobs/repository/submodule/.git/
ERROR: Repository not found.
fatal: The remote end hung up unexpectedly
Clone of 'git@github.com:user/submodule.git' into submodule path 'repository/submodule/' failed
Build step 'Execute shell' marked build as failure
Discard old builds...
#156 is removed because status FAILURE is not to be kept
Publishing Clover coverage report...
No Clover report will be published due to a Build Failure
Sending e-mails to: 
Finished: FAILURE

这是我在詹金斯尝试做的事情

  • 试图设置附加行为“高级子模块行为”,但没有成功。
  • 尝试在使用 phpunit 运行测试之前设置一个新步骤:

git submodule update --init --recursive

  • 也尝试在我的子模块的项目上设置一个 git 存储库,而不仅仅是正在测试的主存储库,也没有运气。

所有这些都会导致 Jenkins 找不到子模块的存储库的错误。

关于如何解决这个问题的任何想法?

(用户名、路径和存储库是正确的,我只是将它们更改为在此处发布)

4

1 回答 1

5

解决了。在我的凭证中,我使用的是直接 SSH 密钥(选项“直接输入”),而不是放入文件中。

我刚刚将密钥(公共和私有)放在 ~/.ssh 中,并将我的凭据更改为“来自 Jenkins master ~/.ssh”选项。

问题是子模块没有使用我指定给主存储库的凭据,它试图使用默认的 ssh 密钥 (.ssh/id_rsa)。

另一种解决方案是将 -i my_key 传递给 git 子模块步骤(仅当您的密钥不在默认路径 (~/.ssh/id_rsa) 时才需要)

另外不要忘记为您的密钥提供正确的权限,在我的情况下,我必须:

chown apache ~/.ssh/id_rsa*
chmod 700 ~/.ssh/id_rsa*
于 2014-02-26T19:42:11.307 回答