0
点赞
收藏
分享

微信扫一扫

架构篇 -- 搭建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远程自动化部署_gitlab


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

注意:如果项目有共享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远程自动化部署_ci_03

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

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放到指定目录下,执行业务和 启动脚本。

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

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


举报

相关推荐

0 条评论