# 环境准备
服务器环境:
centos7
# GIT版本更新到最新
yum 安装的git版本好像只能是1.8的,再更新还是1.8,然而这个版本太低了,会导致后面自动化部署的时候出现这个问题。通过下面的方法更新到最新版本(Root):
#安装源
yum install http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm
#安装git
yum install git
#更新git
yum update git
确定版本在2.x
[user@-1 ~]$ java -version
java version "1.8.0_202"
Java(TM) SE Runtime Environment (build 1.8.0_202-b08)
Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)
[user@-1 ~]$
# 后端环境准备
# 安装JDK1.8(Root)
https://repo.huaweicloud.com/java/jdk/8u202-b08/jdk-8u202-linux-x64.tar.gz
安装(Root)
#切换到 /usr/local/ 目录
cd /usr/local/
#复制文件到服务上,用下面的语句解压缩
tar -zxvf jdk-8u202-linux-x64.tar.gz
#文件路径是下面路径
/usr/local/java1.8 #后面环境变量会用到此路径
# 安装maven(Root)
复制maven包到服务器/usr/local/ 然后安装:
#用下面的语句解压缩
unzip apache-maven-3.6.3-bin.zip
#文件路径是下面路径
/usr/local/maven-3.6.3 #后面环境变量会用到此路径
# 添加到环境变量(Root)
vi /etc/profile
export JAVA_HOME=/usr/local/java1.8
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export MAVEN_HOME=/usr/local/maven-3.6.3
export PATH=$MAVEN_HOME/bin:$PATH
重载系统配置文件(Root)
source /etc/profile
# 前端环境准备
# 安装nodejs(Root)
Root下运行
#下载安装包,需要哪个版本,在url中修改就可以了
wget https://nodejs.org/dist/v18.17.1/node-v18.17.1-linux-x64.tar.xz
#解压
tar xf node-v18.17.1-linux-x64.tar.xz
#复制
cp -rf /root/node-v18.17.1-linux-x64 /usr/local/node
添加环境变量(Root)
vi /etc/profile
#在文件的最后,加上下面的内容
export PATH=$PATH:/usr/local/node/bin
重载系统配置文件(Root)
source /etc/profile
测试 node 环境变量是否生效 运行下面的代码,看到版本号,就说明环境变量生效了。
node -v
[sy@-1 ~]$ node -v
v18.17.1
[sy@-1 ~]$
# 安装Gitlab-Runner
root下运行
#下载
wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
#分配运行权限
chmod a+x /usr/local/bin/gitlab-runner
#创建用户
useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
#安装
gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
#运行
gitlab-runner start
提升gitlab-runner权限,给gitlab-runner sudo权限,后面会用到一些管理员权限运行的设置,没有权限会报错
>vi /etc/sudoers
#添加
gitlab-runner ALL=(ALL) NOPASSWD:ALL
到root后面:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
gitlab-runner ALL=(ALL) NOPASSWD:ALL
## Allows members of the 'sys' group to run networking, software,
# 新建 runner
从下面的地方拿到需要的注册数据:

把这里的url和token拷贝出来,输入到控制台提示的就可以了,注意注意:tags必须是唯一的,一个项目下的url和token可以公用,但是输入tags的时候一定要注意不要重复。不然之后自动化部署会出现问题。
#注册 runner
gitlab-runner register
#输入 gitlab 的访问地址
http://127.0.0.1:9885/
#输入 runner token,在项目页->配->CI/CD页面->runner标签页查看
DVwcK4bbMESiEC7YJges
#runner 描述,随便填
测试项目部署
#runner tag
dev
#输入(选择) shell
shell
注册好的runner可以用下面命令查看:
gitlab-runner list
[root@CECC-1 ~]# gitlab-runner list
Runtime platform arch=amd64 os=linux pid=47331 revision=c72a09b6 version=16.8.0
Listing configured runners ConfigFile=/etc/gitlab-runner/config.toml
haha Executor=shell Token=9qgTJ5Ez8yBc_oEByxFD URL=http://127.0.0.1:9885/
test deploy Executor=shell Token=L8CYm-3imWyRsV2g8FsX URL=http://127.0.0.1:9885/
[root@CECC-1 ~]#
在gitlab中确认一下runner的连接状态

# 如果gitlab中显示该runner未连接,可用verify命令处理
gitlab-runner verify
检查配置项是否设置运行未标记的作业,未选择的话勾上

# 编写 .gitlab-ci.yml 文件
.gitlab-ci.yml 文件是存放在项目的根目录下的,要提交到gitlab上面,runner 会根据 .gitlab-ci.yml 编写的规则自动部署项目。下面文件看注释,每一步是干嘛, 都写得比较了,基本都能看明白。 下面是针对后端JAR包的.gitlab-ci.yml 文件
# 这是针对后端JAR的.gitlab-ci.yml 文件,需要配合后面的启动脚本使用
# 定义一些变量, 下面各阶段会使用
variables:
jar_name: hrx_sy.jar #指定打包出的文件名
upload_path: /home/gitlab-runner/testenv/sy/cecc #此路径需在服务器上以gitlab-runner用户身份现行创建
java_path: /usr/local/java1.8/bin
mv_path: /usr/local/maven-3.6.3/bin
# test_path: /home/gitlab-runner/apitest #目前东磁和三一可用,其他暂不可用
# testPlan_name: 三一持续集成 #目前东磁和三一可用,其他暂不可用
# 阶段
stages:
- build
- upload
- deploy
# - apitest #目前东磁和三一可用,其他暂不可用
# 拉取项目,打包
build-dev:
stage: build # 阶段名称 对应,stages
tags: # runner 标签(注册runner时设置的,可在 admin->runner中查看)
- test-hrx_sy
script: # 脚本(执行的命令行)
- pwd
- whoami
- echo "===================开始清理=================="
- mvn clean -f pom.xml
- echo "===================开始打包=================="
- mvn package -f pom.xml -B -Dmaven.test.skip=true # 拉取项目的根目录
- echo "===================查看打包目录=================="
- ls -l hzx-admin/target/ # 列出打包文件
only:
- develop #拉取分支
cache:
key: m2-repo
paths:
- .m2/repository
artifacts: # 把 下面 的文件或者目录传递给下一个阶段
paths:
- hzx-admin/target/$jar_name
# 上传生成的 jar 包到你的应用服务器
upload-jar:
stage: upload
tags: # runner 标签(注册runner时设置的,可在 admin->runner中查看)
- test-hrx_sy
script:
- whoami
- echo "===================查看打包目录=================="
- ls -l hzx-admin/target/
- echo "===================可以在这里上传文件=================="
- echo "===================开始复制文件到运行目录=================="
- cp -f hzx-admin/target/$jar_name $upload_path/$jar_name
- echo "===================查看运行状态=================="
- sh $upload_path/hrx.sh status
# 部署
deploy-dev:
stage: deploy # 阶段名称 对应,stages
tags: # runner 标签(注册runner时设置的)
- test-hrx_sy
script: # 脚本(执行的命令行)
- pwd
- echo "===================运行启动脚本=================="
- sh $upload_path/hrx.sh restart
- echo "===================查看运行状态=================="
- sh $upload_path/hrx.sh status
- sleep 20
- echo "===================发送钉钉通知测试=================="
- cd /home/gitlab-runner/apitest
- sh dingPush.sh 三一后端
# 测试
#test-auto:
# stage: apitest # 阶段名称 对应,stages
# tags: # runner 标签(注册runner时设置的)
# - test-hrx_sy
# script: # 脚本(执行的命令行)
# - pwd
# - sleep 20
# - echo "===================运行启动脚本=================="
# - cd /home/gitlab-runner/apitest
# - sh TriggerMS.sh $testPlan_name >sy_apitest.out
# - echo "===================查看运行状态=================="
# - cat sy_apitest.out
JAR包启动脚本
#!/bin/bash
#这里可替换为你自己的执行JAR包名称、路径以及日志名称,其他代码无需更改
APP_NAME=xxx.jar
APP_PATH=/home/gitlab-runner/testenv/xxx/cecc
LOG_NAME=xxx.log
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh xxx.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $APP_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 "${APP_NAME} is already running. pid=${pid} ."
else
cd $APP_PATH
nohup java -jar $APP_NAME >$APP_PATH/$LOG_NAME 2>&1 &
echo "${APP_NAME} start success"
fi
}
#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
echo "${APP_NAME} is stop"
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
#重启
restart(){
stop
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
下面是针对前端的.gitlab-ci.yml 文件
# 定义一些变量, 下面各阶段会使用
variables:
deploy_path: /usr/local/nginx/xxx #指定部署路径
#定义Gitlab里面的流水线,包含每一个阶段的作业
stages:
- build
- deploy
# 缓存 node_modules 减少打包时间,默认会清除 node_modules 和 dist
cache:
paths:
- node_modules/
# 拉取项目,打包
build:
stage: build # 阶段名称 对应,stages
tags: # runner 标签(注册runner时设置的,可在 admin->runner中查看)
- dev
script: # 脚本(执行的命令行)
- cd ${CI_PROJECT_DIR} # 拉取项目的根目录
- echo "===================安装依赖=================="
- yarn install
- echo "===================构建开始 运行构建命令=================="
- yarn build #注意项目的build配置是否正确
- echo "===================构建完成 =================="
only:
- master #指定拉取分支
artifacts: # 把 dist 的内容传递给下一个阶
paths:
- dist/
# 部署
deploy-job:
stage: deploy # 阶段名称 对应,stages
only:
- master #拉取分支
script:
- echo "Deploying application..."
- echo "===================清理文件=================="
- sudo rm -rf $deploy_path/*
- echo "===================部署文件=================="
- sudo cp -rf ${CI_PROJECT_DIR}/dist/* $deploy_path/ # 部署完成,复制 dist 下的文件到对应的项目位置
- echo "Application successfully deployed."
- sleep 20
- echo "===================发送钉钉通知测试=================="
- cd /home/gitlab-runner/apitest
- sh dingPush.sh 三一前端
参考了以下文章 GitLab CI/CD 自动化部署入门... (opens new window) Gitlab-Runner CI/CD实现自动化部署... (opens new window) centos7安装和使用node-v18.16.0... (opens new window) 关于linux安装nodejs出现/lib64/libstdc++.so.6 (opens new window) centos 7 更新gcc (devtoolset-10) (opens new window)