目前在使用gitlab的CI/CD流程,配置的runner类型是kubernets集群上的容器runner,这种类型runner的特点是,可以根据你的需求,配置不同的基础镜像来运行不同的任务,不需要将所有任务都在同一台机器上进行打包,避免不同组件不同环境之间互相干扰。例如有的前端项目需要node:9.5.0版本来进行打包,而有的需要12.9版本打包,如果将两个任务放在同一个机器里跑,那就会发生环境冲突。为了避免这种问题,就可以将两个环境放在单独的两个容器里。
但是都放到容器里以后,遇到了这样一个问题:
- 拉取git代码的时候需要ssh权限,主机方式编译时,只需要把每个主机的公钥放到你的git账号里就可以了。而pod是用完就销毁的,不可能每次执行打包任务之前都往账号里删除旧公钥,添加一次新公钥
针对这个问题,组里提出了一个方案:将pod所在主机的私钥通过hostPath的方式挂载到Pod内,这样就只需要将k8s节点的公钥账号里即可。但是经过思考后放弃了这种方案,原因有以下几点:
- 在pod内可以直接获取到k8s节点的私钥信息,存在敏感信息泄露的问题
- 增加一台k8s节点,就需要添加一次公钥
- 需要修改runner的配置文件
后面经git维护人员提醒,固定一对密钥,将公钥放到git账号里,每次往pod里注入公钥不就可以了。搜索后发现,gilab的CI/CD任务里支持这种操作。然后还需要使用gitlab里的自定义变量,将公钥信息保存到变量里,避免在CI/CD的日志里泄露私钥信息。
保存到变量里的操作是:
- 点击gitlab项目左侧边栏的operation,再点击CI/CD
- 在CI/CD界面,点击Variables右边的expand按钮,会出来一个变量的编辑界面
- 点击Add Variable按钮
- 在key一栏里,为变量取一个名字,假设是
git_private_key
,后面在CI/CD任务里可以用$git_private_key
的方式直接调用这个变量。 - 将私钥信息填入
value
下面的输入框,type
即变量类型,选file
,即以文件的方式保存这个私钥信息。这个时候变量$git_private_key
里保存的就是私钥文件的临时路径。 - 最后点击
Add Variable
按钮保存变量
变量配置好以后,在CI/CD任务里,在pod里注入私钥文件的脚本命令是:
script:
- mkdir ~/.ssh
- chmod 0700 ~/.ssh/
- cp $git_private_key ~/.ssh/id_rsa
- chmod 0600 ~/.ssh/id_rsa
- ssh-keyscan git.domain.com >> ~/.ssh/known_hosts
最后一条命令是先搜索内网git域名地址,将git服务器的信息保存到~/.ssh/known_hosts
文件里,避免后面进行git clone
操作的时候提示是否连接,需要输入yes
的情况。
配置好了以后,就可以愉快的使用git clone
来拉取ssh://
开头地址的仓库代码了。
网友评论