云CI(mesos)的pipeline中的缺失用户名解决方法

背景

云CI如果使用Jenkinsfile来实现pipeline,slave实际是在docker里跑的,根据pipeline插件的实现,docker里会有一个和调用者一样的uid。
有id却没有名称,在大部分场景没有问题,但是在需要用户名才能操作的地方,就会有问题,我们已经碰到如下几个场景:
- fortify扫描时,由于没有用户名和home,导致fortify扫描失败,参见http://stackoverflow.com/questions/36990026/couldnt-get-lock-for-fortify-sca5-10-log-sca-log
- CI过程中,我们需要提交将自动生成的头文件和配置文件上传到gerrit中,由于gerrit采用ssh方式操作,而ssh操作是必须要有用户名的,因此,云CI的pipeline里也是会git push 失败。

解决思路

jenkins调用从节点的docker时,会将调用者的uid:gid通过 -u: uid: {gid}的docker参数放入docker中。(详见jenkins的console output中的docker run指令)
由于jenkins的调用者是一个未来的、动态的,不可能在之前的docker镜像制作过程中预料到这个用户。因此,docker内部会出现有id却没有用户名的现象。
那能否在docker里使用useradd添加用户呢?
答案是否定的。jenkins pipeline的docker run使用和jenkins一样的id,一般是一个普通用户,不是root用户(除非jenkins的工程师违规操作,直接用root用户干活,这是极其业余的做法)。
因此无法使用useradd进行操作(useradd会改动/etc/passwd文件,涉及系统锁等,不是简单在docker制作中加入chmod a+w /etc/passwd就能解决的)
那怎么解决呢?
老外给了一种解决方案,就是在jenkins的pipeline中再build一次镜像,将动态加入的用户信息通过docker build写入到新镜像里(docker build的默认用户是root,因此可以useradd)(大家一定要区分清楚jenkins执行Jenkinsfile和docker执行Dockerfile的差异)

解决举措

Jenkinsfile加入docker build的过程

Jenkinsfile的实例代码如下:

#!groovy
node ("mesos") {
        stage("Prepare"){
            checkout scm
            sh ("id -u > uid.txt")
        def myEnv = docker.build("ci:power")
        myEnv.inside {
        ...
        }
    }
}

这里最关键的就是如何将id信息传递给docker build。
由于涉及jenkins和docker build涉及不同领域,传递环境变量在大量实验中都失败了。
因此,这里采用文件来传递信息(所有软件都会基于文件系统),这是最简单最通用的方案。
将id -u输出的uid输出到uid.txt中
docker build的过程中,加载这个文件,获取里面的uid。

添加Dockerfile

在Jenkinsfile旁边(我们是项目的根目录)加入Dockerfile,专门用于CI中的docker build。
Dockerfile实例如下:

FROM docker.zte.com.cn:5000/power/ubuntu:develop
COPY uid.txt /
RUN useradd jenkins -u $(cat /uid.txt) --shell /bin/bash --create-home
USER jenkins
  • FROM是jenkins中本来要使用的镜像,这里基于它进行信息添加。
  • COPY很关键,docker build的过程,已经不是基于jenkins的$WORKSPACE了,而是另起一个文件系统,因此,必须用COPY或ADD将uid.txt导入,否则无法获取。
  • useradd 的用户名和Jenkinsfile里的一样即可,纠结耦合问题的,用uid.txt类似的方法从Jenkinsfile传递到这里即可解决耦合。
  • $(cat /uid.txt)是获取文件里面信息的最简单方法了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值