gpt4 book ai didi

git - Jenkins - Git 子模块凭据与父 repo 不同

转载 作者:IT王子 更新时间:2023-10-29 00:49:30 28 4
gpt4 key购买 nike

背景

Jenkins 被用于从具有 Git 子模块的 Git 存储库构建工件。子模块不在同一个仓库中,甚至不在与父项目相同的端点。问题是父存储库检查得很好,因为凭据 ssh key A 与主/父存储库相关联,但不出所料,在子模块上失败,因为凭据 ssh key B 与 Jenkins 的存储库无关' 的观点。

令人惊讶的是,Jenkins 没有更好的开箱即用的 Git 子模块支持;是时候做出贡献了。

问题

  1. 有没有办法为单个 Git 存储库存储多个凭据?
  2. 如果答案是否定的,为什么 Jenkins 在Advanced sub-modules behaviours 下提供了Use credentials from default remote of parent repository 的选项,如下所示?
  3. 还有什么其他方法可以处理具有不同凭据的 Jenkins 和 Git 子模块?

enter image description here

系统信息

在 Docker 机器上运行 Jenkins(本地)

在 CentOS 上运行 Jenkins(生产环境)

Jenkins 版本:2.60.2(两者)

Git 插件版本:3.6.4(两者)

最佳答案

  1. 否 - git 插件 supports only a single key (截至撰写本文时)
  2. 根据 git plugin docs ,默认行为是根本不对子模块使用凭据。 bool 标志告诉插件改为使用父凭据。它在下面使用的 git 插件不支持使用任何其他凭证的想法。
  3. 这很难找到,但我的 Github 项目遇到了同样的问题 - 它使用了模块和 Github does not allow the same deploy key to be used across projects .

为了解决这个问题,我首先 set up a github app ,安装它,并分配项目及其子模块。这个应用程序能够生成可用于克隆的访问 key - 所以我使用这些凭据进行克隆。我在 git 插件行为中禁用了子模块,并在运行 submodule initsubmodule update< 之前使用 native git 命令更新子模块 URL 以使用用户名和密码 克隆子模块。

steps {
withCredentials([usernamePassword(credentialsId: 'github-app-credentials',
usernameVariable: 'GITHUB_APP',
passwordVariable: 'GITHUB_ACCESS_TOKEN')]) {
checkout ([
$class: 'GitSCM',
userRemoteConfigs: [[
credentialsId: '',
url: "https://x-access-token:$GITHUB_ACCESS_TOKEN@github.com/<ORG>/<PROJECT>.git"
]],
branches: [[ name: '*/main' ]],
extensions: [[
$class: 'SubmoduleOption',
disableSubmodules: true
]]
])
sh '''
git config --file=.gitmodules submodule.SUBMODULE_A.url https://x-access-token:$GITHUB_ACCESS_TOKEN@github.com/<ORG>/<SUBMODULE_A>.git
git config --file=.gitmodules submodule.SUBMODULE_B.url https://x-access-token:$GITHUB_ACCESS_TOKEN@github.com/<ORG>/<SUBMODULE_B>.git
git submodule init update
git restore .gitmodules

# rest of build
'''
}
}

这标志着 Jenkins 中的一个安全问题,因为 GITHUB_ACCESS_TOKEN 被插入到一个字符串中,以便将其传递给 git URL。我不认为这是可以修复的,因为 checkout 命令不会引用任何环境变量。然而,看起来像这些access tokens are ephemeral因此有所缓解。

我相信您也可以通过使用 GIT_SSH_COMMAND 来使用部署 key 。环境变量,尽管这留给读者作为练习。

下次有人建议使用 git submodule 时,请帮我打他们。

关于git - Jenkins - Git 子模块凭据与父 repo 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47275354/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com