本文将以pass-runtime服务为例子,进行介绍,有相关自动部署需求,可参考此文档。
最近换了份工作公司要求使用gitlab ci去部署,原来比较习惯使用jenkins,但是还是要适应新挑战,看了网上比较多的文章一般都不是合适,然后自己写一份,希望能帮助到有缘人。各位道友,多多指教!
gitlab 使用ci自动部署需要确认基础环境,是否已经配置好jdk和maven,如果没有环境先,自行安装基础环境。
注意:操作过程需要使用到两台云服务器,需要账号密码账号密码地址
服务器A:部署gitlab进行管理代码
服务器B:部署要运行项目
如果已经存在,则不需要安装
部署服务器安装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信息。如果注册成功会有显示。
注意:如果项目有共享runner请记得关闭。
脚本一共有两个:
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
注意:变更自己要执行的文件路径。
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放到指定目录下,执行业务和 启动脚本。
本文就到这了,如有问题我们随时沟通,祝好诸君,望各位一切顺路。
诸天炁荡荡,我道日兴隆~