Gitlab CI/CD实现的集群自动部署方案
关键词:
- gitlab cicd
- 流水线
- 目标机器 ip 组
- ssh 免密登陆并远程执行命令
- 需要提前安装搭建好 gitlab 和 runner, 实践过gitlab cicd
自动部署的执行流程
- 我们提交代码后,根据配置的
gitlab-ci.yml
文件触发流水线,包含test,build,deploy三个阶段
- test 执行单元测试
- build 打包上传到云存储
- deploy 从云存储下载最新包,执行部署
- test、build 阶段都是在同一台runner机器上执行单元测试,并打包上传到云存储
- deploy 阶段由需要由 runner 机器获取到所有要部署机器的一组 ip,runner 机器通过 ssh 命令逐台登陆目标机器执行部署命令完成对集群的自动部署。有个前提需要让runner 机器的用户有免密登陆所有目标机器的权限,可以将runner机器的公钥配置到一台目标机器上,再以这台目标机器作为基础镜像初始化,这样后续的linux实例即可避免扩容时一台台配置目标机器。
方案流程图如下:
gitlab-ci.yml流水线配置案例
stages:
- test
- build
- deploy
test:
stage: test
tags:
- [runner 机器的tag]
script:
- mvn test
only:
- master
build:
stage: build
tags:
- [runner 机器的tag]
script:
- mvn clean package -Dmaven.test.skip=true
- [jar包上传至云存储]
only:
- master
deploy:
stage: deploy
tags:
- [runner 机器的tag]
script:
- sh remote-deploy.sh
only:
- master
remote-deploy.sh 远程部署集群脚本示例
#!/bin/bash
successCount=0
errorCount=0
# 这里可以是通过云厂商的接口获取到目标机器的ip组
ips=("123.456.789" "123.456.789" "123.456.789")
for((i=0; i<${#ips[@]}; i++)) do
# 登陆目标机器执行本地的一个 deploy.sh
ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=no ${ips[i]} < deploy.sh
if [ "$?" == "0" ]; then
let successCount++
echo "${ips[i]} deploy success"
else
let errorCount++
echo "${ips[i]} deploy error"
exit 1
fi
current=`expr ${i} + 1`
remaining=`expr ${#ips[@]} - ${successCount}`
echo "current deploy ${current}, remaining ${remaining}"
done
echo "deploy status, success ${successCount} error ${errorCount}"
ps:deploy.sh是runner机器上部署单台机器的脚本文件
deploy.sh 单台机器部署脚本示例
#!/bin/bash
# 0.上线期间nginx返回204
# 1.下载并解压包
# 2.关闭服务
# 3.获取机器配置
# 4.启动服务
# 5.健康检查
# 6.上线后恢复配置nginx反向代理
ps:部署逻辑需要按照你们的项目具体实现
学习强大的ssh命令
ssh 命令除了登陆到远程服务器之外还能将命令发送到远程机器上执行,前提是需要配置免密登陆
# 在A机器上登陆B机器同时在B机器上执行一条命令
ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=no bIP "pwd"
# 执行多条命令, 分号隔开
ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=no bIP "pwd; ls"
# 执行多行命令, "or'开头和结尾
ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=no bIP "
pwd
ls
"
# 执行本地的一个sh文件
ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=no bIP < deploy.sh
# 执行远程的一个sh文件,使用绝对路径
ssh -o PasswordAuthentication=no -o StrictHostKeyChecking=no bIP "/home/you/deploy.sh"
- -o options 命令选项
- PasswordAuthentication=no 不使用密码认证,当认证失败时直接退出不需要询问密码
- StrictHostKeyChecking=no 第一次登陆服务器时自动拉取key文件,不需要询问
- 其他用法参考linux手册
man ssh
参考文章:
优化和深入
- 在此基础上实现失败回滚,当部署失败后目标机器自动恢复到上一个版本
- 当确认能正常运行后才关掉旧的进程,缩短线上服务不可用时间