# 环境准备

服务器环境:

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)

下载JDK1.8 (opens new window)

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)