环境描述
本次试验的目的就是:业务模块服务器提交代码,触发流水线,gitlab-runner远程到该服务器进行操作。
gitlab-runner:172.16.194.01,容器安装,宿主机生成id_rsa
;
业务模块服务器:172.16.194.02;
两个服务器相关端口已经打通。
配置变量
.gitlab-ci.yml
虽然是一个yaml格式的一个文件,但是script的内容其实就是一个shell脚本。既然是脚本,不可避免的要涉及到一些环境变量,而一些敏感的环境变量我们不推荐把它直接写进到gitlab-ci.yml
里,比较好的方案是存储到gitlab里。
打开gitlab的web页面,点开对应的project
—Settings
—CI/CD
—Variables
,如图:
这里面存储的值比如DEPLOY_SERVER
,对应的value就是172.16.194.02
,即模块服务器的IP,保存之后,这样的环境变量不用在.gitlab-ci.yml
里声明就可以直接通过$变量名
的形式使用。
这里注意一下,SSH_PRIVATE_KEY
对应的就是我们刚刚生成的那个宿主机的id_rsa
内容,不是路径啊是整个文件的内容,我知道这个框很小,但是请放心,塞的进去。
完整gitlab-ci.yml
现在在模块服务器的代码根目录做一个gitlab-ci.yml,主要目的就是让gitlab-runner
在模块服务器的/tmp/test
目录下生成一个111.txt
文件:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47# 定义 stages
stages:
- build
- test
before_script:
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
- eval $(ssh-agent -s)
# 清除一些系统中复制出现的换行符\r,并重定向到/dev/null防止泄露
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add - > /dev/null
# 创建~/.ssh目录,并配置权限(非root运行的runner)
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
after_script:
- echo "FINISH!!!"
# 也可以在这里指定环境变量,效果一样
variables:
- IMAGE: java:latest
- CONTAINER_NAME: daily_report_java
- VERSION: "1.8" # 注意这里的双引号
# 定义 job1
job1:
stage: test
tags:
- my-tag
script:
- echo "I am job1"
- echo "I am in test stage"
environment:
name: production
url: http://$DEPLOY_SERVER
# 定义 job2
job2:
stage: build
tags:
- my-tag
script:
- echo "I am job2"
- echo "I am in build stage"
- echo $IMAGE:$VERSION
- echo $CONTAINER_NAME
- ssh root@$DEPLOY_SERVER "cd /tmp/test && echo '123123'> 111.txt"
这里说一下before_script
段:第一行代码判断ssh-agent是否存在,不存在则下载;第二行执行ssh-agent;第三行将server端的私钥加入到ssh-agent的管理下;四、五行创建.ssh文件夹,并给予正确的权限。
还有before_script
不是before-script,这样会被gitlab-runner当成一个job…
执行一下,来到web端可见job状态是OK:
点开build这个job,查看细节,可见文中的环境变量也被正确的读取了:
同时在模块服务器上的111.txt
也生成了,实验成功!
如果要使用ansible搭配批量部署,可以考虑让gitlab-runner去操作ansible服务器,然后在gitlab-ci.yml去调用ansible的脚本。
参考资料
https://docs.gitlab.com/ee/ci/ssh_keys/
https://wangjunming.com/Shi%20Yong%20gitlab%20CI%20CDJiang%20Cheng%20Xu%20Bu%20Shu%20Dao%20Yuan%20Cheng%20Fu%20Wu%20Qi.html
https://zhuanlan.zhihu.com/p/51163261
https://blog.51cto.com/11750513/2422946
https://laogen.site/gitlab-ci/example-docker-ssh-deploy/