gitlab-cicd(runner)

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值