繁体   English   中英

Jenkins:使用 Git 检索子模块

[英]Jenkins: Retrieving submodules with Git

目前我一直被困在一个问题上,试图从 Jenkins 中检索存储库的子模块。 我的配置很好,我可以在没有任何子模块的情况下提取存储库。

我还可以使用子模块拉出 repo 的主要组件(两者都在存储库名称中进行身份验证,就像使用 SSH 一样)。 只有当我必须拉取子模块组件时才会出现问题。 我正在运行最新版本的 Jenkins,我在底部添加了一个用于“高级子模块行为”的部分。 我在这里选择了“递归更新子模块”并多次运行构建无济于事。

当我尝试使用 shell 命令在底部添加额外的构建步骤时,存储库的更新也不起作用。 当我在终端中在 jenkins 之外尝试这些命令时,效果很好。 我在 Jenkins 中经常遇到的问题是:

FATAL: Command "git submodule update" returned status code 1:

stdout: 

stderr: Cloning into 'thisismysubmodule'...
fatal: Authentication failed for 'https://git.thisismyrepo.com/scm/ap/thisismysubmodule.git/'

我发现了这个问题: https : //issues.jenkins-ci.org/browse/JENKINS-20941但由于安全问题,我无法在底部使用建议的解决方案。 这里有人有解决这个问题的经验或可能的解决方案吗?

这是使用SSH 代理转发的解决方法。 它对我来说很好。

  1. 首先,编辑<jenkins_home>/.ssh/config并设置ForwardAgent yes
  2. 然后,为 Jenkins 安装SSH 代理插件
  3. 然后,在项目配置中,重置 Git 凭据。
  4. 最后,在项目配置中,设置 SSH Agent 凭据。

在此处输入图片说明Jenkins 项目配置中的 SSH 代理设置

现在已经发布了 git-client 和 git-plug-in 模块的 Beta 版本来解决这个问题。 引用 JIRA 问题。

git客户端插件2.0.0-beta1已经发布到实验更新中心。 它包括 git 子模块认证、JGit 4.3,并且需要 JDK 7。它至少需要 Jenkins 1.625(第一个强制要求 JDK 7 的版本)

使用上面的“附加行为”部分下有一个选项,称为:

使用来自父存储库默认远程的凭据

这解决了我在使用 Jenkins 2.11 和运行 Windows 服务器和从站的插件的测试版时的问题。 我没有检查其他构建机器。 此外,您必须使用相同的身份验证方法,如果使用 http,您也必须将其用于子模块,如果使用 SSH,您必须将其用于子模块,尝试混合方法将无法正常工作。

- 更新 -
不再需要 Beta 版本,请参阅以下页面:
Git 客户端插件
Git插件

我刚碰到这个问题。 对于使用最新版本 Jenkins(2016 年 12 月之后)的任何人,请尝试在 git repo 配置的Advanced sub-modules behaviours部分启用此选项。 Use credentials from default remote of parent repository

一种解决方案是在全局 git 配置文件中声明 netrc 凭据帮助,它将为来自 git 的任何 http 查询提供必要的凭据。

git config --global credential.helper "netrc -f C:/path/to/_netrc.gpg -v"

(确保使用与运行 Jenkins 相同的帐户)

我使用加密的 netrc 文件,但您可以使用未加密的文件开始一些测试。

考虑到我已经尝试了几乎所有可用的选项来使其正常工作(SSH、.netrc、硬编码凭据等),唯一的选项是“andreg”在 JENKINS-20941 问题底部提到的选项:

是的,这个问题对我们来说也很痛苦。 我们让它为我们的 Stash/Jenkins 设置工作的唯一方法是创建一个只读用户并在对子模块的引用中硬编码该用户的凭据。 尽管这是不好的做法,但所有在 git 存储库上工作的用户都至少具有只读访问权限,因此我们认为这并没有造成太大的安全问题。 例如在父 repo .gitmodules 文件中:

[子模块“共享库”] 路径 = 共享库 url = https://username:password@stash.yourcompany.com/scm/project/shared-library.git

然后 Jenkins 作业选择了“递归更新子模块”。

我实际上只是将它移动到一个 shell 命令,在 shell 命令中我告诉它使用哪个凭据助手,因为我在 Windows 上它是 wincred:

git config --global credential.helper wincred
git submodule init 
git submodule sync 
git submodule update --init --recursive

这个解决方案对我有用:

  1. 确保父存储库和子模块存储库的 ssh 凭据相同。
  2. 在 Jenkins 中为父存储库设置凭据。 (源代码管理(选择“Git”)> 存储库)
  3. 设置您的 .gitmodule 文件,以便它使用来自父存储库的 ssh 凭据:

     [submodule "foo/repository"] path = foo/repository url = ssh://jenkins_build_monkey@domain.com/repository
  4. 此解决方案有一个小警告。 任何时候有人克隆父存储库,他们都需要将 url 同步到他们有权访问的那个。 用户第一次初始化子模块时,需要先编辑 .gitmodules 文件并更改 url:

     [submodule "foo/repository"] path = foo/repository url = ssh://username@domain.com/repository

    然后,在终端中:

     git submodule sync git submodule init repository git submodule update --remote repository

    然后将 url 改回 jenkins 构建 url。 除非您再次同步,否则子模块将使用与用户关联的 url。

2016 年 9 月,Jenkins 计划发布一项新功能,允许子模块共享父存储库的凭据。 然后可以在 .gitmodule 中使用 HTTP url 而不是 ssh。

我设法通过简单地在 linux 上添加一个带有凭据的 .netrc 文件来使其工作。 不是最安全的解决方案,但如果您需要使其快速运行,它将助您一臂之力。

如果您知道凭证名称,您还可以明确提供凭证,例如

    stage ('Clone') {
        steps {
            checkout scm
            withCredentials([sshUserPrivateKey(credentialsId: 'bitbucket_ssh', keyFileVariable: 'SSH_KEY')]) {
                sh 'GIT_SSH_COMMAND="ssh -i $SSH_KEY" git submodule update --init'
            }
        }
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM