Jenkins:在Docker容器中克隆私有存储库

我知道在这里已经有很多关于这个话题的问题了,我尝试了几乎所有的解决scheme,但是我现在处于无法工作的状态(我想要的方式是)。

问题

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

我目前的工作解决scheme

我已经能够通过在我的Jenkinsfile执行以下操作来完成此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" } } 

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

  • Jenkins Docker插件作为Jenkins用户运行。 这个用户的UID和GID在我的Docker容器中是不知道的。 所以我不得不挂载/etc/passwd
  • 当从Git仓库中取出时,我的known_hosts容器中需要知道我的known_hosts (和我的键?)。 由于/etc/passwd将jenkins用户映射到/home/jenkins ,所以我必须在我的客户机上安装Jenkins的SSH目录。
  • sshagent命令设置了SSH套接字,以便我的密钥可以在我的容器中访问(纠正我,如果我错了,我是相当新的jenkins和docker)。

就像我说的:这已经起作用了。 通过这个设置,我可以在Jenkins中的Docker容器中克隆私有的git仓库。

那么问题是什么呢?

我发现/ /home/jenkins/.ssh有点危险。 我把它挂载为只读,但我在一个拥有70多个开发者的组织中工作,如果其中一个以我的代码为例,并删除:ro ,他们很可能会搞垮Jenkins的.ssh -folder和this非常非常糟糕

所以我正在寻找一种方法克隆私人存储库,而无需挂载.ssh夹。 毕竟,这不是什么sshagent插件是什么?

我到目前为止所尝试过的

由于我的docker容器挂载了/etc/passwd它会在某个时间点查找/home/jenkins -folder。 由于sshagent会照顾我想要的key,所以我只需要关心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 

不幸的是,这将创buildroot目录下的目录和文件,所以当我运行我的容器作为jenkins -user(Jenkins jenkins插件所做的)时,我无法访问/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 

再一次:没有运气,因为jenkins用户不允许在/home/创build目录。

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

 RUN chown $(id -u $(whoami)):$(id -g $(whoami)) -R /home/jenkins 

再次没有运气,因为whoami返回root ,而不是jenkins 。 所以让我们在下面对它进行硬编码:

 RUN chown $(id -u jenkins):$(id -g jenkins) -R /home/jenkins 

再次,没有运气。 我现在得到的消息是“id:jenkins:没有这样的用户”

我卡住了

所以你有它:我卡住了。 如何克隆jenkinsdocker容器中的私人存储库,而无需安装.ssh夹? 任何帮助这个话题,不胜感激。 我现在盯着这个太久了…