架构篇 -- 搭建gitlab ci远程自动化部署

001.后端服务自动化部署


本文将以pass-runtime服务为例子,进行介绍,有相关自动部署需求,可参考此文档。

最近换了份工作公司要求使用gitlab ci去部署,原来比较习惯使用jenkins,但是还是要适应新挑战,看了网上比较多的文章一般都不是合适,然后自己写一份,希望能帮助到有缘人。各位道友,多多指教!

确认环境

gitlab 使用ci自动部署需要确认基础环境,是否已经配置好jdk和maven,如果没有环境先,自行安装基础环境。

注意:操作过程需要使用到两台云服务器,需要账号密码账号密码地址
服务器A:部署gitlab进行管理代码
服务器B:部署要运行项目

核心步骤

1. 服务器B安装gitlab runner,并进行注册

如果已经存在,则不需要安装

部署服务器安装gitlab runner,指令如下
(1)、添加yum源

curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-ci-multi-runner/script.rpm.sh | sudo bash

(2)、安装runner

  yum install gitlab-ci-multi-runner

(3)、向GitLab-CI注册runner

gitlab-ci-multi-runner registe

填写相关信息

# 填写gitlab ci地址
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com )
http://XX.xx.x.x/ci
# 输入您获得的注册Runner的令牌:
Please enter the gitlab-ci token for this runner
8-zB8AX_*********_gF

# 输入Runner的描述,你可以稍后在GitLab的UI中进行更改:
Please enter the gitlab-ci description for this runner
[hostame] my-runner

# 输入与Runner关联的标签,稍后可以在GitLab的UI中进行更改:
Please enter the gitlab-ci tags for this runner (comma separated):
my-tag,another-tag
deploy

# 选择Runner是否应该选择没有标签的作业,可以稍后在GitLab的UI中进行更改(默认为false):
Whether to run untagged jobs [true/false]:
[false]: true


选择是否将Runner锁定到当前项目,稍后可以在GitLab的UI中进行更改。Runner特定时有用(默认为true):

Whether to lock Runner to current project [true/false]:
[true]: true

# 输入Runner执行者:
Please enter the executor: ssh, docker+machine, docker-ssh+machine, kubernetes, docker, parallels, virtualbox, docker-ssh, shell:
shell

相关信息位置,核心就是链接地址url和token信息。如果注册成功会有显示。

架构篇 -- 搭建gitlab ci远程自动化部署_第1张图片
架构篇 -- 搭建gitlab ci远程自动化部署_第2张图片

注意:如果项目有共享runner请记得关闭。

2.编写脚本

脚本一共有两个:
1. 核心启动脚本负责项目启动,关闭,重启,目前状态。
2. 启动前的业务处理,每次打包前进行服务jar的替换等等。
核心启动脚本(pass-runtime.sh)

#!/bin/sh

API_NAME=pass-runtime
JAR_NAME=$API_NAME\.jar
#PID  代表是PID文件
PID=$API_NAME\.pid
LOG=$API_NAME.log

#使用说明,用来提示输入参数
usage() {
    echo "Usage: sh 执行脚本.sh [start|stop|restart|status]"
    exit 1
}

#检查程序是否在运行
is_exist(){
  pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
  #如果不存在返回1,存在返回0
  if [ -z "${pid}" ]; then
   return 1
  else
    return 0
  fi
}

#启动方法
start(){
  is_exist
  if [ $? -eq "0" ]; then
    echo ">>> ${JAR_NAME} is already running PID=${pid} <<<"
  else
    nohup java -Xms256m -Xmx512m -jar $JAR_NAME  > $LOG 2>&1 &
    echo $! > $PID
    echo ">>> start $JAR_NAME successed PID=$! <<<"
   fi
  }

#停止方法
stop(){
  #is_exist
  pidf=$(cat $PID)
  #echo "$pidf"
  echo ">>> api PID = $pidf begin kill $pidf <<<"
  kill $pidf
  rm -rf $PID
  sleep 2
  is_exist
  if [ $? -eq "0" ]; then
    echo ">>> api 2 PID = $pid begin kill -9 $pid  <<<"
    kill -9  $pid
    sleep 2
    echo ">>> $JAR_NAME process stopped <<<"
  else
    echo ">>> ${JAR_NAME} is not running <<<"
  fi
}

#输出运行状态
status(){
  is_exist
  if [ $? -eq "0" ]; then
    echo ">>> ${JAR_NAME} is running PID is ${pid} <<<"
  else
    echo ">>> ${JAR_NAME} is not running <<<"
  fi
}

#重启
restart(){
  stop
  start
}

export JAVA_HOME=/data/java/jdk1.8.0_301
echo "use java at $JAVA_HOME"
source /etc/profile

chmod 777 *
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
  "start")
    start
    ;;
  "stop")
    stop
    ;;
  "status")
    status
    ;;
  "restart")
    restart
    ;;
  *)
    usage
    ;;
esac
exit 0

业务前处理脚本(run.sh)

#!/bin/sh

# 去除旧的jar
rm -f paas-runtime.jar
# 获取新打包好的服务jar,注意路径是否一直
cp ***/paas-runtime/paas-runtime-app/target/paas-runtime-app.jar **/pass-runtime/pass-runtime.jar
# 切换路径,执行启动脚本
cd ****/pass-runtime
sh pass-runtime.sh restart

exit 0

注意:window下编辑需要转格式

sed -i 's/\r//' run.sh pass-runtime.sh

3.服务脚本集成到ci-gitlab.yml上

架构篇 -- 搭建gitlab ci远程自动化部署_第3张图片

注意:变更自己要执行的文件路径。

stages:
  - package
  - deploy

mvn-package:
  image: docker:latest
  stage: package
  script:
    - ./mvnw clean package -s ci-settings.xml -DskipTests
  except:
    - master

mvn-deploy:
  stage: deploy
  script:
    - ./mvnw clean deploy -s ci-settings.xml
    - sh /opt/corilead/pass-runtime/run.sh  #集成服务脚本
  only:
    - master

各位道友上面就是gitlab自动部署的全过程了,其实并不复杂,我当时处理的时候走了一些弯路,开始思路是想使用ssh去处理,后来有验证了这条新思路,这个更方便一点。

使用ssh也是可行,我也尝试了,这里就不详细描述,主要就是需要生成公钥秘钥,然后免密ssh处理,思路都差不多。打包后将jar放到指定目录下,执行业务和 启动脚本。

本文就到这了,如有问题我们随时沟通,祝好诸君,望各位一切顺路。

诸天炁荡荡,我道日兴隆~

你可能感兴趣的:(架构之路,架构,gitlab,ci/cd)