Jenkins:在 docker 容器中克隆一个私有仓库

Gie*_*ers 7 git ssh git-clone jenkins docker

我知道在 SO 上已经有很多关于这个主题的问题,我尝试了他们提出的几乎所有解决方案,但我目前无法让它工作(我想要的方式)是)。

问题

我有一个在 Jenkins 中启动的 docker 容器,在这个 docker 容器中,我尝试克隆一个私有存储库。为此,我需要将我的公共 Jenkins 密钥添加到我的 Git 存储库中,并且我的 docker 容器需要知道这个 SSH 密钥。

我目前的工作解决方案

我已经能够通过在 my 中执行以下操作来做到这一点Jenkinsfile

docker.image('php_jenkins_test').inside('--env COMPOSER_HOME=$WORKSPACE/.composer -v /etc/passwd:/etc/passwd:ro -v /home/jenkins/.ssh:/home/jenkins/.ssh:ro') {
    sshagent(['jenkins-ssh-publickey']) {
        sh "./test/run-tests.sh"
    }
}
Run Code Online (Sandbox Code Playgroud)

由于以下原因,我将我的etc/passwd/home/jenkins/.ssh作为只读卷挂载:

  • Jenkins Docker 插件以 Jenkins 用户身份运行。这个用户的 UID 和 GID 在我的 Docker 容器中是未知的。因此我不得不安装/etc/passwd.
  • 当从 Git 存储库中提取时,我的known_hosts(和我的密钥?)需要在我的 docker 容器中知道。由于/etc/passwd将 jenkins 用户映射到/home/jenkins,我还必须在我的来宾计算机上安装 Jenkins 的 SSH 目录。
  • sshagent-command树立SSH插座等等,我的钥匙是我的容器内访问(纠正我,如果我错了,我是相当新的詹金斯和码头工人)。

就像我说的:这已经有效了。通过此设置,我可以在 Jenkins 的 docker 容器中克隆私有 git 存储库。

那么有什么问题呢?

我发现安装/home/jenkins/.ssh有点......危险。我挂载为只读,但与70个多家开发商的组织工作,我如果其中一个需要我的代码示例和删除:ro,没准他们会搞砸了詹金斯的.ssh-folder,这是非常,非常坏的。

因此,我正在寻找一种无需挂载 - 文件.ssh夹即可克隆私有存储库的方法。毕竟,这不是sshagent-plugin 的用途吗?

到目前为止我尝试过的

由于我/etc/passwd/home/jenkinsdocker容器安装了它,它会在某个时间点查找-folder。由于sshagent会处理密钥,我想我只需要关心known_hosts-file。所以我在我的 Dockerfile 中尝试了以下内容:

RUN mkdir -p /home/jenkins/.ssh
RUN chmod 700 /home/jenkins/.ssh
RUN ssh-keyscan -t rsa (url to git) >> /home/jenkins/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)

不幸的是,这将在root-user下创建目录和文件,因此当我以jenkins-user身份运行我的容器(Jenkins docker 插件所做的)时,我无法访问/home/jenkins/....

因此,我尝试在由 Jenkins 用户运行的容器中的 shell 脚本中执行此操作:

mkdir -p /home/jenkins/.ssh
chmod 700 /home/jenkins/.ssh
ssh-keyscan -t rsa (url to git) >> /home/jenkins/.ssh/known_hosts
Run Code Online (Sandbox Code Playgroud)

再一次:没有运气,因为 jenkins-user 不允许在/home/.

回到Dockerfile,让我们尝试添加以下行:

RUN chown $(id -u $(whoami)):$(id -g $(whoami)) -R /home/jenkins
Run Code Online (Sandbox Code Playgroud)

再次没有运气,因为whoami返回root,而不是jenkins。因此,让我们对其进行硬编码:

RUN chown $(id -u jenkins):$(id -g jenkins) -R /home/jenkins
Run Code Online (Sandbox Code Playgroud)

再一次,没有运气。我现在得到的消息是"id: jenkins: no such user"

我被卡住了

所以你知道了:我被卡住了。如何在 Jenkins 的.sshdocker容器中克隆私有存储库而无需挂载-folder?非常感谢有关此主题的任何帮助。我现在盯着这个太久了......