ruoyi-vue gitlab-runner ci/cd自动化部署


说明

手动部署大多不太方便,每次都要去重启服务等一系列操作,结合gitlab-runner自动化部署配置完成后,可以说是一劳永逸的,除非服务器迁移(这个没办法),其他从操作层面还是很方便的。本文内容是在原来已部署好的环境上实现自动化部署,没有部署过的请参考网上其他资料进行相应的部署。

一、环境

操作系统:CentOS Linux release 7.9.2009 (Core)
数据库:mysql 5.7.32
缓存数据库:redis 6.0.8
代理服务:nginx 1.22

二、安装Gitlab-Runner

#1、下载文件
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

#2、授权
sudo chmod +x /usr/local/bin/gitlab-runner

#3、创建 GitLab Runner user
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

#4、安装
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner

#5、运行服务
sudo gitlab-runner start

三、注册runner

群组runner
image.png
共享runner
image.png
选择群组还是共享都可以,建议选择共享
这里需要注册三个,shell、后端docker、前端docker,输入过程中如果输入的文字不正确不要忙着去删除,可以在config.toml配置文件中修改或者在gitlab中的runner中修改
shell

[root@localhost app]# gitlab-runner register
Runtime platform                                    arch=amd64 os=linux pid=26285 revision=8ec04662 version=16.3.0
Running in system-mode.                            
                                                   
#输入gitlab地址
Enter the GitLab instance URL (for example, https://gitlab.com/):
http://ip:端口号/
#输入token,token有两种,一种是群组,一种是共享
Enter the registration token:
VsrN69z1meZxmEWvS1hE
#输入runner描述
Enter a description for the runner:
[localhost.localdomain]: cooper
#输入runner标签,对应.gitlab.yml中的tag,在界面中可以修改
Enter tags for the runner (comma-separated):
cooper_shell_dev
#输入用于维护的说明
Enter optional maintenance note for the runner:
cooper
WARNING: Support for registration tokens and runner parameters in the 'register' command has been deprecated in GitLab Runner 15.6 and will be replaced with support for authentication tokens. For more information, see https://gitlab.com/gitlab-org/gitlab/-/issues/380872 
Registering runner... succeeded                     runner=VsrN69z1
#选择executor的类型
Enter an executor: shell, docker+machine, instance, kubernetes, custom, docker, docker-windows, parallels, ssh, virtualbox, docker-autoscaler:
shell
#输入具体的镜像,我的项目中没有用到
Enter the default Docker image (for example, ruby:2.7):
centos7:latest
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
 
Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml" 

后端docker

[root@localhost app]# gitlab-runner register
Runtime platform                                    arch=amd64 os=linux pid=26285 revision=8ec04662 version=16.3.0
Running in system-mode.                            
                                                   
#输入gitlab地址
Enter the GitLab instance URL (for example, https://gitlab.com/):
http://ip:端口号/
#输入token,token有两种,一种是群组,一种是共享
Enter the registration token:
VsrN69z1meZxmEWvS1hE
#输入runner描述
Enter a description for the runner:
[localhost.localdomain]: cooper
#输入runner标签,对应.gitlab.yml中的tag,在界面中可以修改
Enter tags for the runner (comma-separated):
cooper_docker_dev
#输入用于维护的说明
Enter optional maintenance note for the runner:
cooper
WARNING: Support for registration tokens and runner parameters in the 'register' command has been deprecated in GitLab Runner 15.6 and will be replaced with support for authentication tokens. For more information, see https://gitlab.com/gitlab-org/gitlab/-/issues/380872 
Registering runner... succeeded                     runner=VsrN69z1
#选择executor的类型
Enter an executor: shell, docker+machine, instance, kubernetes, custom, docker, docker-windows, parallels, ssh, virtualbox, docker-autoscaler:
docker
#输入具体的镜像,我的项目中没有用到
Enter the default Docker image (for example, ruby:2.7):
centos7:latest
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
 
Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml" 

前端docker

[root@localhost app]# gitlab-runner register
Runtime platform                                    arch=amd64 os=linux pid=26285 revision=8ec04662 version=16.3.0
Running in system-mode.                            
                                                   
#输入gitlab地址
Enter the GitLab instance URL (for example, https://gitlab.com/):
http://ip:端口号/
#输入token,token有两种,一种是群组,一种是共享
Enter the registration token:
VsrN69z1meZxmEWvS1hE
#输入runner描述
Enter a description for the runner:
[localhost.localdomain]: vue-project
#输入runner标签,对应.gitlab.yml中的tag,在界面中可以修改
Enter tags for the runner (comma-separated):
vue_docker_dev
#输入用于维护的说明
Enter optional maintenance note for the runner:
vue_dev
WARNING: Support for registration tokens and runner parameters in the 'register' command has been deprecated in GitLab Runner 15.6 and will be replaced with support for authentication tokens. For more information, see https://gitlab.com/gitlab-org/gitlab/-/issues/380872 
Registering runner... succeeded                     runner=VsrN69z1
#选择executor的类型
Enter an executor: shell, docker+machine, instance, kubernetes, custom, docker, docker-windows, parallels, ssh, virtualbox, docker-autoscaler:
docker
#输入具体的镜像,我的项目中没有用到
Enter the default Docker image (for example, ruby:2.7):
centos7:latest
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
 
Configuration (with the authentication token) was saved in "/etc/gitlab-runner/config.toml" 

注册完成后会生成配置文件,文件地址/etc/gitlab-runner/config.toml,下面是修改后的内容,具体以自己的为准

concurrent = 1
check_interval = 0
shutdown_timeout = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "cooper"
  url = "http://ip:端口/"
  id = 12
  token = "vuVFQ7DPyfGUsmvKrnfk"
  executor = "shell"
  [runners.docker]
    tls_verify = false
    image = "centos7:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    pull_policy = ["if-not-present"]
    shm_size = 0

[[runners]]
  name = "cooper"
  url = "http://ip:端口/"
  id = 13
  token = "9UJ987Me85Tf8cUvwL73"
  executor = "docker"
  [runners.cache]
    MaxUploadedArchiveSize = 0
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "centos7:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache", "/home/gitlab-runner/.m2:/root/.m2"]
    pull_policy = ["if-not-present"]
    shm_size = 0

[[runners]]
  name = "vue-project"
  url = "http://ip:端口/"
  id = 14
  token = "jP7mzAfNhHtJjw8BArTv"
  executor = "docker"
  [runners.cache]
    MaxUploadedArchiveSize = 0
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "centos7:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache"]
    pull_policy = ["if-not-present"]
    shm_size = 0

gitlab同样会生成对应的内容如下图,两个群组和一个共享
image.png
image.png

注意事项

不同服务器的tag设置为不同的,不然会有问题,执行的结果不是你想要的


四、安装docker

# 在安装Docker之前先安装docker的依赖包
sudo yum install -y yum-utils
# 建立Docker仓库 (映射仓库地址)
sudo yum-config-manager  --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装
yum install -y docker-ce
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
 * base: mirrors.163.com
 * centos-sclo-rh: mirrors.163.com
 * centos-sclo-sclo: mirrors.163.com
 * epel: mirror.01link.hk
 * extras: mirrors.163.com
 * updates: mirrors.163.com
正在解决依赖关系
--> 正在检查事务
---> 软件包 docker-ce.x86_64.3.24.0.6-1.el7 将被 安装
--> 正在处理依赖关系 container-selinux >= 2:2.74,它被软件包 3:docker-ce-24.0.6-1.el7.x86_64 需要
--> 正在处理依赖关系 containerd.io >= 1.6.4,它被软件包 3:docker-ce-24.0.6-1.el7.x86_64 需要
--> 正在处理依赖关系 docker-ce-rootless-extras,它被软件包 3:docker-ce-24.0.6-1.el7.x86_64 需要
--> 正在检查事务
---> 软件包 container-selinux.noarch.2.2.119.2-1.911c772.el7_8 将被 安装
---> 软件包 containerd.io.x86_64.0.1.6.22-3.1.el7 将被 安装
---> 软件包 docker-ce-rootless-extras.x86_64.0.24.0.6-1.el7 将被 安装
--> 解决依赖关系完成

依赖关系解决

=================================================================================================================
 Package                          架构          版本                               源                       大小
=================================================================================================================
正在安装:
 docker-ce                        x86_64        3:24.0.6-1.el7                     docker-ce-stable         24 M
为依赖而安装:
 container-selinux                noarch        2:2.119.2-1.911c772.el7_8          extras                   40 k
 containerd.io                    x86_64        1.6.22-3.1.el7                     docker-ce-stable         34 M
 docker-ce-rootless-extras        x86_64        24.0.6-1.el7                       docker-ce-stable        9.1 M

事务概要
=================================================================================================================
安装  1 软件包 (+3 依赖软件包)

总下载量:67 M
安装大小:225 M
Downloading packages:
No Presto metadata available for docker-ce-stable
(1/4): container-selinux-2.119.2-1.911c772.el7_8.noarch.rpm                               |  40 kB  00:00:00     
(2/4): docker-ce-24.0.6-1.el7.x86_64.rpm                                                  |  24 MB  00:00:51     
(3/4): containerd.io-1.6.22-3.1.el7.x86_64.rpm                                            |  34 MB  00:00:51     
(4/4): docker-ce-rootless-extras-24.0.6-1.el7.x86_64.rpm                                  | 9.1 MB  00:00:08     
-----------------------------------------------------------------------------------------------------------------
总计                                                                             1.1 MB/s |  67 MB  00:00:59     
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
  正在安装    : 2:container-selinux-2.119.2-1.911c772.el7_8.noarch                                           1/4 
setsebool:  SELinux is disabled.
  正在安装    : containerd.io-1.6.22-3.1.el7.x86_64                                                          2/4 
  正在安装    : 3:docker-ce-24.0.6-1.el7.x86_64                                                              3/4 
  正在安装    : docker-ce-rootless-extras-24.0.6-1.el7.x86_64                                                4/4 
  验证中      : docker-ce-rootless-extras-24.0.6-1.el7.x86_64                                                1/4 
  验证中      : containerd.io-1.6.22-3.1.el7.x86_64                                                          2/4 
  验证中      : 3:docker-ce-24.0.6-1.el7.x86_64                                                              3/4 
  验证中      : 2:container-selinux-2.119.2-1.911c772.el7_8.noarch                                           4/4 

已安装:
  docker-ce.x86_64 3:24.0.6-1.el7                                                                                

作为依赖被安装:
  container-selinux.noarch 2:2.119.2-1.911c772.el7_8            containerd.io.x86_64 0:1.6.22-3.1.el7           
  docker-ce-rootless-extras.x86_64 0:24.0.6-1.el7              

完毕!

# 启动
systemctl start docker
# 设置开机启动
systemctl enable docker 
# 查看docker版本
docker -v
# 配置镜像加速器
# 没有该文件就创建,默认都是有docker文件的
sudo mkdir -p /etc/docker
# 设置镜像内容进daemon.json文件
tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["http://hub-mirror.c.163.com"]
}
EOF
# 修改完成后,再重加载配置文件
systemctl daemon-reload
# 重启动docker
systemctl restart docker
sudo chown root:docker /var/run/docker.sock # 修改docker.sock权限为root:docker
sudo groupadd docker          # 添加docker用户组 
sudo gpasswd -a $USER docker  # 将当前用户添加至docker用户组
sudo gpasswd -a gitlab-runner docker  # 将gitlab-runner用户添加至docker用户组
newgrp docker                 # 更新docker用户组
# 创建时区文件
echo 'Asia/Shanghai'>/etc/timezone
# 需要拉取的镜像
docker pull openjdk:8
docker pull maven:3.6.3-jdk-8
docker pull node:18
docker pull nginx:1.23

五、错误处理

1、git版本过低
image.png

yum install http://opensource.wandisco.com/centos/7/git/x86_64/wandisco-git-release-7-2.noarch.rpm
yum install git
yum update git

2、用户未添加到docker用户组
image.png

# 将gitlab-runner添加到docker组中
gpasswd -a gitlab-runner docker

3、Docker已经启动的容器怎么修改挂载目录

# 查看容器ID
docker ps
# 停止docker
systemctl stop docker
# 在Binds中修改挂载项
vi /var/lib/docker/containers/容器id/hostconfig.json
# 在MountPoints中修改挂载项
vi /var/lib/docker/containers/容器id/config.v2.json

image.png

# 启动docker: 
systemctl start docker

六、后端.gitlab-ci.yml

#引入不同分支配置文件
include:
  - local: gitlab-ci-dev.yml
    rules:
      - if: $CI_COMMIT_BRANCH == 'dev'
  - local: gitlab-ci-master.yml
    rules:
      - if: $CI_COMMIT_BRANCH == 'master'
# This pipeline is build to clone newest repo to sanic project

default:
  tags:
    - cooper_shell_dev
#判断分支
#workflow:
#  rules:
#    - if: $CI_COMMIT_BRANCH == 'dev' || $CI_COMMIT_BRANCH == 'master'

variables:
  BASIC_DIR: /home/gitlab-runner/repo
  PROJECT_DIR: ${BASIC_DIR}/${CI_PROJECT_NAME}
  CUSTOM_IMAGE: 'hv-cooperation'
  CONTAINER_NAME: 'hvCooperation'
  IMAGE_NAME: 'openjdk:8'
  SERVER: '-p 8080:8080 -v ${PROJECT_DIR}:/app'
  TIMEZONE: '-v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro'
  FILE_DIR: '-v /home/ruoyi/uploadPath:/home/ruoyi/uploadPath'
  AUTO_RESTART: '--restart unless-stopped'
  CREATE_CONTAINER: 'docker run ${TIMEZONE} ${FILE_DIR} ${SERVER} ${AUTO_RESTART} --privileged=true --name $CONTAINER_NAME -d ${CUSTOM_IMAGE}'
  MAVEN_OPTS: "-Djava.awt.headless=true -Dmaven.repo.local=/root/.m2/repository"
  MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version"
  DEV_BUILD: "mvn clean package -B -e -Dmaven.test.skip=true -P test $MAVEN_OPTS  --settings=/root/.m2/settings-docker.xml"
  PROD_BUILD: "mvn clean package -B -e -Dmaven.test.skip=true -P prod $MAVEN_OPTS  --settings=/root/.m2/settings-docker.xml"

stages:
  - build
  - package
  - deploy

image-build:
  stage: build
  rules:
    - if: $CI_COMMIT_TITLE =~ /image/
  tags:
    - cooper_shell_dev
  script:
    - docker build -t ${CUSTOM_IMAGE} .

maven-build:
  stage: package
  tags:
    - cooper_docker_dev
  image: maven:3.6.3-jdk-8
  #  cache:
  #    key: ${CI_COMMIT_REF_NAME}
  #    paths:
  #      - /root/.m2/
  script:
    - echo $DEV_BUILD
    - echo $PROD_BUILD
    - mkdir -p /home/gitlab-runner/.m2
    - $DEV_BUILD
  artifacts:
    paths:
      - ruoyi-admin/target/*.jar
deploy:
  stage: deploy
  #  rules:
  #    - if: $CI_COMMIT_BRANCH == 'main'
  script:
    - echo PROJECT_DIR - $PROJECT_DIR
    - echo CI_PROJECT_DIR - ${CI_PROJECT_DIR}
    - mkdir -p $PROJECT_DIR
    - cp -a ruoyi-admin/target/* $PROJECT_DIR
    - |
      echo 'Auto restart or create container';
      if [ "$(docker container ls --no-trunc -q -f name=^${CONTAINER_NAME}$)" != "" ];
      then (echo Restart: && docker restart $(docker container ls -q -f name=^${CONTAINER_NAME}$));
      else (echo Create: ${CREATE_CONTAINER} && ${CREATE_CONTAINER});
      fi

例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大)

七、前端.gitlab-ci.yml

#引入不同分支配置文件
include:
  - local: gitlab-ci-dev.yml
    rules:
      - if: $CI_COMMIT_BRANCH == 'dev'
  - local: gitlab-ci-main.yml
    rules:
      - if: $CI_COMMIT_BRANCH == 'main'
# This file is written to deploy vue project

default:
  image: node:18

#workflow:
#  rules:
#    - if: $CI_COMMIT_REF_NAME == 'dev' || $CI_COMMIT_REF_NAME == 'main'

stages:
  - build
  - deploy
  - launch

variables:
  BASIC_DIR: /home/gitlab-runner/repo/${CI_PROJECT_PATH}  # 基础部署目录
  NGINX_DIR: ${BASIC_DIR}/nginx #nginx配置文件目录
  MAIN_DIR: ${BASIC_DIR}/main #生产分支目录
  DEV_DIR: ${BASIC_DIR}/dev #测试分支目录

Build Vue Project:
  stage: build
  tags:
    - vue_docker_dev
  cache:
    key: ${CI_COMMIT_REF_NAME}
    paths:
      - node_modules/
  script:
    - echo "前端-管理端开始打包"
    - npm config set registry https://registry.npmmirror.com && npm install
    - npm run build:stage
    - echo "前端-管理端打包结束"
  artifacts:
    name: dist
    paths:
      - dist/

Deploy Vue Project:
  stage: deploy
  tags:
    - cooper_shell_dev
  cache: {}
  variables:
    DEPLOY_DIR: ${BASIC_DIR}/${CI_COMMIT_REF_NAME}  # 实际分支部署目录
  before_script:
    # 创建对应的配置文件和项目目录
    - "echo Create dir: ${DEPLOY_DIR}"
    - mkdir -p ${NGINX_DIR} ${MAIN_DIR} ${DEV_DIR}
  script:
    - echo CI_PROJECT_NAME ${CI_PROJECT_NAME}
    - echo CI_PROJECT_PATH ${CI_PROJECT_PATH}
    - echo CI_PROJECT_DIR ${CI_PROJECT_DIR}
    - echo CI_COMMIT_REF_NAME ${CI_COMMIT_REF_NAME}
    - echo NGINX_DIR ${NGINX_DIR}
    - rm -rf ${DEPLOY_DIR}/*
    - mv -f dist/* ${DEPLOY_DIR}

Launch Nginx:
  stage: launch
  tags:
    - cooper_shell_dev
  rules:
    - if: $CI_COMMIT_TITLE =~ /nginx/
  variables:
    IMAGE_NAME: 'nginx:1.23'
    CONTAINER_NAME: cooper_nginx
    TIMEZONE: '-v /etc/timezone:/etc/timezone:ro -v /etc/localtime:/etc/localtime:ro'
    SERVER: '-p 80:80 -v ${BASIC_DIR}/${CI_COMMIT_REF_NAME}:/app/nginx/html/dist'
    NGINX_CONF: '-v ${NGINX_DIR}/nginx.conf:/etc/nginx/nginx.conf:ro'
    AUTO_RESTART: '--restart unless-stopped'
    CREATE_CONTAINER: docker run ${TIMEZONE} ${SERVER} ${NGINX_CONF} ${AUTO_RESTART} --name ${CONTAINER_NAME} -d $IMAGE_NAME
  before_script:
    - rm -rf ${NGINX_DIR} #删除nginx目录及下面所有文件
    - cp -a nginx ${NGINX_DIR}
  script:
    - |
      if [ "$(docker container ls --no-trunc -q -f name=^${CONTAINER_NAME}$)" != "" ];
      then (echo Restart ${CONTAINER_NAME}: && docker restart $(docker container ls -q -f name=^${CONTAINER_NAME}$));
      else (echo Create ${CONTAINER_NAME}: ${CREATE_CONTAINER} && ${CREATE_CONTAINER});
      fi

八、说明

1、前后端的测试和生产环境部署在不同的服务器,配置上有所区别并且对应不同的分支
2、生产环境配置和测试环境有细微上的差别
3、.gitlab-ci.yml在根目录下
4、前端单独创建测试和生立分支

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值