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
夹? 任何帮助这个话题,不胜感激。 我现在盯着这个太久了…