GitLab Runner 安装
版本要求
GitLab:社区版本gitlab-ce-14
ContOS:CentOS Linux release 7.9
JDK:1.8
maven:Apache Maven 3.8.1
Git:2.31.1
使用GitLab CI实现java项目的自动部署。
更新git 到2.x
yum install http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm
yum install git
git version
安装Runner
gitlab地址:http://gitlab.xxx.com:9999/
在gitlab上,创建一个用于拉取代码的账号
账号:gitlab-runner
邮箱:[email protected]
安装gitlab-runner
# 下载gitlab-runner,在服务器上执行下面命令
# 服务器上curl下载太慢,可以直接从本机浏览器下载,再上传到服务器上
curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
# 如果是手动,将文件名字gitlab-runner-linux-amd64修改文件名字为gitlab-runner
mv gitlab-runner-linux-amd64 gitlab-runner
# 设置可执行权限
chmod +x /usr/local/bin/gitlab-runner
# Create a GitLab CI user
useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
#添加path
#vim /etc/profile
#export PATH=/usr/local/bin:$PATH
#source /etc/profile
# 安装
gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
# 启动
gitlab-runner start
注册runner
gitlab-runner register
设置gitlab的url:http://gitlab.xxx.com:9999/
设置token:从gitlab上项目-settings-CI/CD-Runners-Set up a specific runner manually-And this registration token 复制过来
设置Description:关于集成服务中对于这个runner的描述
输入tag:给这个gitlab-runner输入一个标记,这个tag非常重要,在后续的使用过程中需要使用这个tag来指定gitlab-runner
设置是否运行非tag:是否运行在没有tag的build上面。在配置gitlab-ci的时候,会有很多job,每个job可以通过tags属性来选择runner。这里为true表示如果job没有配置tags,也执行
设置是否锁定runner到当前项目:false
输入executor:shell
卸载runner
# 停止服务
gitlab-runner stop
# 取消随机启动
chkconfig gitlab-runner off
# 卸载服务
gitlab-runner uninstall
# 清理文件
rm -rf /etc/gitlab-runner
rm -rf /usr/local/bin/gitlab-runner
rm -rf /usr/bin/gitlab-runner
rm -rf /etc/sudoers.d/gitlab-runner
# 删除用户
userdel -r gitlab-runner
自动部署
ssh配置
服务器上配置ssh拉取代码
#生成秘钥
cd ~/.ssh
ssh-keygen
#提示输入一直按回车默认就可以了
cat id_rsa.pub
#复制公钥到gitlab,添加ssh key
#测试ssh登录
ssh -T [email protected]
编写.gitlab-ci.yml
项目根目录创建文件.gitlab-ci.yml
variables:
#项目启动端口
projectPort: 60001
#项目名称即git名称
projectName: $CI_PROJECT_NAME
#git idea 拉代码的git地址
gitUrl: $CI_REPOSITORY_URL
projectDir: $CI_PROJECT_DIR
stages:
- package and deploy
- startup
#cache:
# key: "$CI_JOB_STAGE-$CI_COMMIT_REF_NAME"
# paths:
# - target
deploy:
stage: package and deploy
only:
- master
script:
- echo "参数:"$projectDir $gitUrl $projectName $projectPort
- sh deploy $projectDir $gitUrl $projectName $projectPort $CI_COMMIT_REF_NAME
tags:
- deploy
startup:
stage: startup
only:
- master
script:
- sh startup $projectName
tags:
- deploy
deploy脚本
su gitlab-runner
mkdir -p ~/.local/bin
cd ~/.local/bin
touch deploy
vim deploy
deploy脚本内容:
#!/bin/bash
if [ $# -ne 5 ]; then
echo "参数错误!"
exit 1
fi
ciProjectDir=$1;
gitUrl=$2;
projectName=$3;
projectPort=$4;
commitRefName=$5;
if [ ! -d $ciProjectDir ] ; then
echo 克隆项目:"git clone" $gitUrl;
git clone $gitUrl;
else
cd $ciProjectDir;
echo 更新项目代码$ciProjectDir;
git pull origin $commitRefName:$commitRefName;
git checkout $commitRefName;
fi
cd $ciProjectDir
ls
mvn clean package -Dmaven.test.skip=true
if [ ! -d /mnt/disk/app/$projectName ] ;then
echo "发布目录不存在:/mnt/disk/app/"$projectName;
exit 1;
fi
if [ -d /mnt/disk/app/$projectName/$projectName.jar ] ;then
echo "备份jar文件:"$projectName.jar;
cp /mnt/disk/app/$projectName/$projectName.jar /mnt/disk/app/$projectName/$projectName.backup.jar
fi
cd $ciProjectDir/target
cp *.jar /mnt/disk/app/$projectName/$projectName.jar
cd /mnt/disk/app/$projectName
sed -i 's/\$port\$/'$projectPort'/g' start.sh
sed -i 's/\$projectName\$/'$projectName'/g' start.sh
startup脚本
su gitlab-runner
mkdir -p ~/.local/bin
cd ~/.local/bin
touch startup
vim startup
startup脚本内容:
#!/bin/bash
if [ $# -ne 1 ]; then
echo "参数错误!"
exit 1
fi
projectName=$1;
jarPackageName=$projectName'.jar';
PIDS=$(ps -ef |grep $jarPackageName |grep -v grep | awk '{print $2}');
echo "进程pid:"$PIDS
if [ ! -n "$PIDS" ] || [ "$PIDS" = "" ]; then
echo "当前进程"$projectName"不存在,启动进程";
else
echo "当前进程"$projectName"存在,执行kill -15";
i=0;
times=30;
while [ $i -le $times ];
do
let i+=1;
echo '第'$i'次尝试 kill -15' $PIDS;
#2>标准错误输出,将标准错误输出重定向到标准输出
kill -15 $PIDS 2>&1 >/dev/null
echo 'kill -15' $PIDS '执行完成';
sleep 1;
PIDS=`ps -ef |grep $jarPackageName |grep -v grep | awk '{print $2}'`;
if [ ! -n "$PIDS" ] || [ "$PIDS" = "" ]; then
echo '进程已经结束';
break;
fi
done
PIDS=`ps -ef |grep $jarPackageName |grep -v grep | awk '{print $2}'`;
if [ -n "$PIDS" ]; then
echo '强制 kill -s 9' $PIDS
kill -s 9 $PIDS 2>&1 >/dev/null
sleep 1
fi
PIDS=`ps -ef |grep $jarPackageName |grep -v grep | awk '{print $2}'`;
if [ -n "$PIDS" ] ; then
echo '强制 kill -s 9失败,中止程序发布' $PIDS
exit 1
else
echo '进程已经结束,重新启动程序'
fi
fi
cd /mnt/disk/app/$projectName
sh start.sh
PIDS=`ps -ef |grep $jarPackageName |grep -v grep | awk '{print $2}'`;
echo "进程pid:"$PIDS
Roll-back脚本
su gitlab-runner
mkdir -p ~/.local/bin
cd ~/.local/bin
touch rollback
vim rollback
rollback脚本内容:
#!/bin/bash
projectName=$1;
if [ "$projectName" = "" ]; then
echo "参数项目名为空" $projectName;
exit 1
fi
cp /mnt/disk/app/$projectName/$projectName.backup.jar /mnt/disk/app/$projectName/$projectName.jar
sh ~/.local/bin/startup $projectName
加上执行权限
chmod +x ~/.local/bin/deploy
chmod +x ~/.local/bin/startup
chmod +x ~/.local/bin/rollback
start.sh脚本
JVM_OPTS="-showversion"
JVM_OPTS="$JVM_OPTS -Dserver.port=$port$"
JVM_OPTS="$JVM_OPTS -Xmx256m -Xms256m"
JVM_OPTS="$JVM_OPTS -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m"
JVM_OPTS="$JVM_OPTS -XX:+UseG1GC"
JVM_OPTS="$JVM_OPTS -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+PrintHeapAtGC"
JVM_OPTS="$JVM_OPTS -XX:+PrintGCApplicationStoppedTime -XX:+PrintTenuringDistribution -XX:+PrintPromotionFailure -XX:PrintFLSStatistics=1"
JVM_OPTS="$JVM_OPTS -Xloggc:./logs/gc_%t.log"
JVM_OPTS="$JVM_OPTS -XX:+HeapDumpOnOutOfMemoryError"
JVM_OPTS="$JVM_OPTS -XX:HeapDumpPath=./logs"
nohup java $JVM_OPTS -jar $projectName$.jar --spring.profiles.active=prod 1>>logs/proxy.log 2>>logs/proxy.log &
设置环境变量
修改环境变量Path
su gitlab-runner
vim ~/.bashrc
PATH="$HOME/.local/bin:$PATH"
source ~/.bashrc
参考:
https://www.jianshu.com/p/df433633816b
https://www.jianshu.com/p/1014b0ec876d