Jenkins 如何将私钥和密码短语传输到 Git?

时间:2021-01-26 22:04:25

标签: git docker jenkins

换句话说:在 Jenkins 代理上的 Docker 中运行 Git 时要挂载什么?

在我的 Jenkins 服务器上,我使用凭证系统来存储带有密码的私钥,以访问具有公钥的 Git 存储库。这基本上工作正常,并且身份验证没问题。

Jenkins 代理安装的包不多,但安装了 SSH、Java(用于运行代理)和 Docker(因此作业可以运行任何东西)。当 Git 作为常规包安装时,Jenkins 可以查看我的存储库。

我的挑战是该系统是旧的 Red Hat 7,由于超出范围的原因我无法更新。我坚持使用非常旧的软件包,所以我尝试通过 Docker 运行尽可能多的东西,以便能够使用较新的版本。例如,Docker 容器中的 Git 可以使用如下图像运行:https://hub.docker.com/r/alpine/git

现在,当我用在 Docker 中运行 Git 的脚本替换 /usr/bin/git 时,它在命令行上运行良好。但是当从 Jenkins 运行时,我看到它由于版本而被拾取,但随后我收到错误“权限被拒绝(公钥)”代码 128。

据我所知,Jenkins 将私钥放在一个临时文件位置,以便 Git 可以读取它。我假设 Jenkins 使用类似 GIT_SSH_COMMAND="ssh -i /path/to/key" 的机制来告诉 Git 在哪里可以找到私钥。 但是我找不到Jenkins实际使用的位置!我无法在构建日志中看到 Jenkins 在那里做了什么。 -- 在 Jenkins 上调查我的工作区和环境变量,我现在很确定 $WORKSPACE_TMP 包含构建期间所需的关键文件。 就我而言,这是在 /var/jenkins 中,因此应该足以安装。

我尝试将几个文件系统位置(我在网上找到的可能与传输密钥文件有关)从 Jenkins 代理挂载到 Git 容器中......但我仍然遇到相同的错误.我错过了什么?

脚本 /usr/bin/git 如下所示:

#!/bin/sh
docker run --rm \
    -v ${HOME}:/root \
    -v /var/jenkins:/var/jenkins \
    -v $(pwd):/git \
    alpine/git "$@"

我也试过像 -v $(pwd):$(pwd) -w $(pwd) 但还是一样。

构建日志看起来像这样,其中 XXX 隐藏了私人数据:

Running as SYSTEM
Building remotely on Smith (docker) in workspace /var/jenkins/workspace/test2
Selected Git installation does not exist. Using Default
The recommended git tool is: NONE
using credential xxx
 > git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url xxx.git # timeout=10
Fetching upstream changes from xxx.git
 > git --version # timeout=10
 > git --version # 'git version 2.30.0'
using GIT_SSH to set credentials xxx
 > git fetch --tags --force --progress -- xxx.git +refs/heads/*:refs/remotes/origin/* # timeout=10
ERROR: Error fetching remote repo 'origin'
hudson.plugins.git.GitException: Failed to fetch from xxx.git
    ...
Caused by: hudson.plugins.git.GitException: Command "git fetch --tags --force --progress -- xxx.git +refs/heads/*:refs/remotes/origin/*" returned status code 128:
stdout: 
stderr: xxx: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

由于作业在结帐期间失败,我无法运行任何命令来检查环境中的临时文件或变量。

同样,当我用常规 Git 包替换脚本时,一切正常。但这不是我想要的,因为在那种情况下,我必须在该系统上使用非常旧的 Git 版本。

我在网上搜索了几个小时,但没有找到任何线索。我仍然希望有另一个我可以安装的临时存储密钥的位置。或者任何关于詹金斯实际上在那里做什么的暗示。任何帮助表示赞赏!


第二天,我得到了一些线索,但没有解决方案。我在 Jenkins 中添加了关于 $WORKSPACE_TMP 的提示。我更新了这个问题的标题,以反映它可能主要不是关于挂载,而是更多关于如何在容器中进行身份验证。

我想可能 STDIN 上的某些内容不正确……但是将 -i-a STDIN 添加到 docker run 没有帮助。也许在那里使用那个包装脚本不是一个好主意?也许使用 https://hub.docker.com/r/alpine/git 中描述的函数会更好? -- 我尝试将其添加到 ~/.profile 中,但它不起作用,但是使用 ~/.bashrc 我在 Agent 启动时看到了该功能!

function git () {
    (docker run -i --rm -v ${HOME}:/root -v /var/jenkins:/var/jenkins -v $(pwd):/git alpine/git "$@")
}

不幸的是,当我运行作业时,Jenkins 一直告诉我“无法运行程序“git”(在目录“/var/jenkins/workspace/test2”中):错误=2,没有这样的文件或目录”。我还尝试使用代理的配置,如程序目录和启动命令的前缀/后缀,但没有任何成功。

今天完成。也许我应该从源代码开始编译 Git,而不是这样搞砸?

0 个答案:

没有答案