GitLab CI/CD实现的集群自动部署方案

121 阅读2分钟

Gitlab CI/CD实现的集群自动部署方案

关键词:

  • gitlab cicd
  • 流水线
  • 目标机器 ip 组
  • ssh 免密登陆并远程执行命令
  • 需要提前安装搭建好 gitlab 和 runner, 实践过gitlab cicd

自动部署的执行流程

  1. 我们提交代码后,根据配置的 gitlab-ci.yml 文件触发流水线,包含test,build,deploy三个阶段
  • test 执行单元测试
  • build 打包上传到云存储
  • deploy 从云存储下载最新包,执行部署
  1. test、build 阶段都是在同一台runner机器上执行单元测试,并打包上传到云存储
  2. 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文件,不需要询问
  1. 其他用法参考linux手册man ssh

参考文章:

优化和深入

  1. 在此基础上实现失败回滚,当部署失败后目标机器自动恢复到上一个版本
  2. 当确认能正常运行后才关掉旧的进程,缩短线上服务不可用时间