Gitlab-runner实现跨服务器部署

环境描述

本次试验的目的就是:业务模块服务器提交代码,触发流水线,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页面,点开对应的projectSettingsCI/CDVariables,如图:
抱光妹

这里面存储的值比如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/

感谢您请我喝咖啡~O(∩_∩)O,如果要联系请直接发我邮箱chenx1242@163.com,我会回复你的
-------------本文结束感谢您的阅读-------------