GitLab CI automatic deployment

GitLab Runner installation

version requirements

GitLab:社区版本gitlab-ce-14
ContOS:CentOS Linux release 7.9
JDK:1.8
maven:Apache Maven 3.8.1
Git:2.31.1

Use GitLab CI to realize automatic deployment of java projects.
Update git to 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

Install Runner

Gitlab address: http://gitlab.xxx.com:9999/
On gitlab, create an account for pulling code

账号:gitlab-runner
邮箱:[email protected]

Install 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

register 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

Uninstall the 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

automatic deployment

ssh configuration

Configure ssh pull code on the server

#生成秘钥
cd ~/.ssh
ssh-keygen
#提示输入一直按回车默认就可以了
cat id_rsa.pub
#复制公钥到gitlab,添加ssh key
#测试ssh登录
ssh -T [email protected]

Write .gitlab-ci.yml

Create the file .gitlab-ci.yml in the project root directory

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

insert image description here

deploy script

su gitlab-runner
mkdir -p ~/.local/bin
cd ~/.local/bin
touch deploy
vim deploy

Deploy script content:

#!/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 script

su gitlab-runner
mkdir -p ~/.local/bin
cd ~/.local/bin
touch startup
vim startup

Startup script content:

#!/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 script

su gitlab-runner
mkdir -p ~/.local/bin
cd ~/.local/bin
touch rollback
vim rollback

Rollback script content:

#!/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

plus execute permission

chmod +x ~/.local/bin/deploy
chmod +x ~/.local/bin/startup
chmod +x ~/.local/bin/rollback

start.shScript

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 &

set environment variables

Modify the environment variable Path

su gitlab-runner
vim ~/.bashrc
PATH="$HOME/.local/bin:$PATH"
source ~/.bashrc

Reference:
https://www.jianshu.com/p/df433633816b
https://www.jianshu.com/p/1014b0ec876d

Guess you like

Origin blog.csdn.net/lihuayong/article/details/118643063