0先获取gitlab中项目的token和url:记在记事本
1.申请一个runner服务器
2.使用ssh让runner服务器和应用服务连接起来
在runner服务器操作
cd /root/.ssh/
ssh-keygen -t rsa
一路回车...
生成副本
cat id_rsa.pub >authorized_keys_id
把密钥传送到应用服务器
scp authorized_keys_id root@B:/root/.ssh/
此时输入应用服务器密码即可(如果不能连接,把应用服务器连接ssh打开)
登陆到B服务器
cd /root/.ssh/
cat authorized_keys_id >>authorized_keys
此时登到runner服务器测试
scp /opt/test.txt root@B:/opt/.
不需要密码则以上步骤成功
3.runner服务需要maven和git
mkdir -p /home/maven/
去maven官网下载zip包
tar -zxvf apache-maven-3.6.3-bin.tar.gz -C /home/maven/
cd /home/maven/apache-maven-3.6.3/conf/
vi settings.xml
不用执行:清空里面的所有(%d)
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
<!-- java版本 -->
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
mkdir -p /m2/repository
vi /etc/profile
在配置文件最底下加入
MAVEN_HOME=/home/maven/apache-maven-3.6.3
PATH=$MAVEN_HOME/bin:$PATH
export MAVEN_HOME PATH
source /etc/profile
mvn -version
如果出现版本信息说明配置正确
4.下载runner
mkdir -p /home/runner
cd /home/runner
curl -LJO "https://gitlab-runner-downloads.s3.amazonaws.com/latest/rpm/gitlab-runner-14.7.0-1.x86_64.rpm"
rpm -i gitlab-runner-14.7.0-1.x86_64.rpm
gitlab-runner register
依次输入token、url、runner名称、描述
设置runner用户为root权限
ps aux|grep gitlab-runner
sudo gitlab-runner uninstall
gitlab-runner install --working-directory /home/gitlab-runner --user root
systemctl restart gitlab-runner.service
ps aux|grep gitlab-runner
查看是否为root权限
如果为root,这时候可以用cicd脚本进行提交上传代码了
5.在根目录创建.gitlab-ci.yml,编写脚本
stages:
- build
variables: #打包环境
ACTIVE_TEST: TEST
ACTIVE_PRO: PRO
build-job:
stage: build
only: #dev提交执行脚本
- dev
when: manual
script:
- echo "=============== 开始执行任务 ==============="
- java -version
- mvn -version
- cd parent #cd 到项目打包目录下
- echo "=============== clear缓存 ==============="
- pwd
- mvn clean
- echo "=============== 编译文件- ==============="
- mvn compile -P $ACTIVE_TEST
- echo "=============== 开始打包- ==============="
- echo $ACTIVE_TEST
- mvn install -P $ACTIVE_TEST
#- mvn install -Dmaven.test.skip=true
- cd ..
- pwd
#把runner服务器打的包上传到应用服务器
#$TEST_IP_SERVER:root@ip $TEST_JAR_PATH:/opt
- scp -r technical_web/target/technical_web.jar $TEST_IP_SERVER:$TEST_JAR_PATH/.
- scp -r technical_task/target/technical_task.jar $TEST_IP_SERVER:$TEST_JAR_PATH/.
- echo "=============== ssh远程连接应用服务器 ==============="
- ssh $TEST_IP_SERVER << remotessh
#更改以前的包名(SH)
- mv $TEST_JAR_PATH/service/technical_web.jar $TEST_JAR_PATH/service/technical_web_`date +%y%m%d-%H:%M:%S`.jar
#移动jar包
- mv $TEST_JAR_PATH/technical_web.jar $TEST_JAR_PATH/service/.
#cd jar包目录下执行提前上传服务器的脚本启动
- cd $TEST_JAR_PATH/service/
- chmod u+x *.sh
- ./iflytek_web.sh stop
- ./iflytek_web.sh start
#cd 重复上面(SH)的操作
- mv $TEST_JAR_PATH/task/technical_task.jar $TEST_JAR_PATH/task/technical_task`date +%y%m%d-%H:%M:%S`.jar
- mv $TEST_JAR_PATH/technical_task.jar $TEST_JAR_PATH/task/.
- cd $TEST_JAR_PATH/task/
- chmod u+x *.sh
- ./iflytek_task.sh restart
- echo "=============== 暂停50s ==============="
- sleep 50s
- echo "=============== 等待项目启动完成查看日志 ==============="
- tail -100 log/tssp-task.log | grep '定时任务项目启动完成'
- tail -100 $TEST_JAR_PATH/service/log/technical_web.log | grep '项目启动完成'
- echo "=============== 启 动 成 功 ==============="
- echo "=============== 关 闭 进 程 ==============="
- exit
tags:
- pro-runner #执行runner名称
#前端脚本
stages:
- build
# 构建 Job
build-job:
stage: build
only:
- dev
when: manual #手动部署
script:
- echo "=============== 开始执行任务 ==============="
- pwd
- npm install --force #强制打包
- npm run build #打包生产环境
#$PRO_IP_SERVER ==root@ip $TEST_JAR_PATH==/opt/
- scp -r dist $PRO_IP_SERVER:$TEST_JAR_PATH/. #root@ip:/opt/
- ssh $PRO_IP_SERVER << remotessh #
#- mv $TEST_JAR_PATH/front/dist $TEST_JAR_PATH/front/dist1
- rm -rf $TEST_JAR_PATH/front/dist #删除原本的文件
- echo "=============== ssh远程连接应用服务器 ==============="
- mv -i $TEST_JAR_PATH/dist $TEST_JAR_PATH/front/. #移动文件
- echo "=============== 启 动 成 功 ==============="
- echo "=============== 关 闭 进 程 ==============="
- exit
tags:
- pro-runner
cache: # 缓存
paths:
- node_modules
- build
5.提交代码
如果报错:
如果报错:Reinitialized existing Git repository in /home/gitlab-runner/builds/Am-PsLTR/0/huihuang10/2.0/.git/ fatal: git fetch-pack: expected shallow list fatal: The remote end hung up unexpectedly
说明git版本过低,需要更新git版本
# 先安装源
yum install http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm
# 更新git版本
yum update git
此时提交应该不会有任何问题了。如果再次报错可以查看runner权限。把上面代码再次执行一遍即可
6.iflytek_web.sh启动脚本
#!/bin/bash
# 定义变量
# 要运行的jar包路径,加不加引号都行。 注意:等号两边 不能 有空格,否则会提示command找不到
#默认sh在Windows上编辑的,因此默认格式是dos。如果在Linux上使用,请使用vi命令编该文件,改为Unix格式。
#./脚本 start启动项目
#./脚本 stop停止项目
#./脚本 restart重启项目
#./脚本 status查看项目启停状态
JAR_NAME_YEAR=technical_web_22*.jar
JAR_NAME=technical_web
JAR_PATH="technical_web.jar"
# 日志路径,加不加引号都行。 注意:等号两边 不能 有空格,否则会提示command找不到
#LOG_PATh=log/technical_web.log
# 如果输入格式不对,给出提示!
tips() {
echo ""
echo "WARNING!!!......Tips, please use command: sh auto_deploy.sh [start|stop|restart|status]. For example: sh auto_deploy.sh start "
echo ""
exit 1
}
# 启动方法
start() {
#jar包数量大于10移除jar包
count=`find . -name "$JAR_NAME_YEAR" | wc -l `
count=${count:=0}
if [ ${count} -gt 10 ]; then
rm -rf $JAR_NAME_YEAR
else
echo "is not rm"
fi
# 重新获取一下pid,因为其它操作如stop会导致pid的状态更新
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
# -z 表示如果$pid为空时执行
if [ -z $pid ]; then
nohup java -jar $JAR_PATH > /dev/null 2>&1 &
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
echo ""
echo "Service ${JAR_NAME} is starting!pid=${pid}"
echo "........................Here is the log.............................."
echo "....................................................................."
fi
}
# 停止方法
stop() {
# 重新获取一下pid,因为其它操作如start会导致pid的状态更新
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
# -z 表示如果$pid为空时执行。 注意:每个命令和变量之间一定要前后加空格,否则会提示command找不到
if [ -z $pid ]; then
echo ""
echo "Service ${JAR_NAME} is not running! It's not necessary to stop it!"
echo ""
else
kill -9 $pid
echo ""
echo "Service stop successfully!pid:${pid} which has been killed forcibly!"
echo ""
fi
}
# 输出运行状态方法
status() {
# 重新获取一下pid,因为其它操作如stop、restart、start等会导致pid的状态更新
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
# -z 表示如果$pid为空时执行。注意:每个命令和变量之间一定要前后加空格,否则会提示command找不到
if [ -z $pid ];then
echo ""
echo "Service ${JAR_NAME} is not running!"
echo ""
else
echo ""
echo "Service ${JAR_NAME} is running. It's pid=${pid}"
echo ""
fi
}
# 重启方法
restart() {
echo ""
echo ".............................Restarting.............................."
echo "....................................................................."
# 重新获取一下pid,因为其它操作如start会导致pid的状态更新
pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
# -z 表示如果$pid为空时执行。 注意:每个命令和变量之间一定要前后加空格,否则会提示command找不到
if [ ! -z $pid ]; then
kill -9 $pid
fi
start
echo "....................Restart successfully!..........................."
}
# 根据输入参数执行对应方法,不输入则执行tips提示方法
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
tips
;;
esac