阿里云云效流水线自动化部署 ruoyi-cloud 微服务架构

Posted Vampire-Knight

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阿里云云效流水线自动化部署 ruoyi-cloud 微服务架构相关的知识,希望对你有一定的参考价值。

前言

本文章基于 ruoyi-cloud 项目改编。
阿里云云效工作台点击进入,主要使用到代码管理及流水线模块。
主机配置:CentOS 7.9.2009 x86_64
环境配置:安装 docker、docker-compose

# 安装 docker 使用 daocloud 的一键安装脚本
curl -sSL https://get.daocloud.io/docker | sh
# 安装 daocloud 加速器,避免 dockerhub 网络问题
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
# 启动 docker 服务
systemctl start docker
# 安装 docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

一、上传项目并进入流水线

二、新建流水线 - 启动 mysql/redis/nacos

1.新建流水线

2.流水线源配置

3.构建配置

4.部署配置

# 项目文件夹
BASE_DIR="/home/witbee-cloud"
# 项目包名
PACKAGE_NAME="witbee-cloud.tgz"
echo "创建项目文件夹"
mkdir -p $BASE_DIR
echo "开始解压文件"
tar -zxvf $BASE_DIR/$PACKAGE_NAME -C $BASE_DIR
echo "授权项目文件夹"
chmod -R 777 $BASE_DIR
echo "执行构建脚本"
cd $BASE_DIR/docker
sh deploy.sh base

5.保存并运行

三、新建流水线 - 启动 gateway/auth/system

1.新建流水线(同上)

2.流水线源配置(同上)

3.构建配置


4.部署配置(修改部署脚本,其它同上)

# 项目文件夹
BASE_DIR="/home/witbee-cloud"
# 项目包名
PACKAGE_NAME="witbee-cloud.tgz"
echo "开始解压文件"
tar -zxvf $BASE_DIR/$PACKAGE_NAME -C $BASE_DIR
echo "授权项目文件夹"
chmod -R 777 $BASE_DIR
echo "执行构建脚本"
cd $BASE_DIR/docker
sh deploy.sh modules

5.保存并运行

三、新建流水线 - 启动 file/gen/job

1.新建流水线(同上)

2.流水线源配置(同上)

3.构建配置

4.部署配置(修改部署脚本,其它同上)

# 项目文件夹
BASE_DIR="/home/witbee-cloud"
# 项目包名
PACKAGE_NAME="witbee-cloud.tgz"
echo "开始解压文件"
tar -zxvf $BASE_DIR/$PACKAGE_NAME -C $BASE_DIR
echo "授权项目文件夹"
chmod -R 777 $BASE_DIR
echo "执行构建脚本"
cd $BASE_DIR/docker
sh deploy.sh modulesPlus

5.保存并运行

四、新建流水线 - 启动 nginx

1.新建流水线

2.流水线源配置(同上)

3.构建配置


4.部署配置

# 项目文件夹
BASE_DIR="/home/witbee-cloud"
# 项目包名
PACKAGE_NAME="witbee-ui.tgz"
echo "开始解压文件"
tar -zxvf $BASE_DIR/$PACKAGE_NAME -C $BASE_DIR/docker/nginx/html/dist
echo "授权项目文件夹"
chmod -R 777 $BASE_DIR
echo "执行构建脚本"
cd $BASE_DIR/docker
docker-compose up -d witbee-nginx

5.保存并运行

总结(附上 docker-compose.yml、deploy.sh 脚本)

docker-compose.yml

version : '3.8'
services:
  witbee-nacos:
    restart: always
    container_name: witbee-nacos
    build:
      context: ./nacos
    environment:
      - MODE=standalone
    volumes:
      - ./nacos/logs/:/home/nacos/logs
      - ./nacos/conf/application.properties:/home/nacos/conf/application.properties
    ports:
      - "8848:8848"
      - "9848:9848"
      - "9849:9849"
    depends_on:
      witbee-mysql:
        condition: service_healthy
  witbee-mysql:
    restart: always
    container_name: witbee-mysql
    build:
      context: ./mysql
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/conf:/etc/mysql/conf.d
      - ./mysql/logs:/logs
      - ./mysql/data:/var/lib/mysql
    command:
      # 将mysql8.0默认密码策略 修改为 原先 策略 (mysql8.0对其默认策略做了更改 会导致密码无法匹配)
      --default-authentication-plugin=mysql_native_password
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
    environment:
      TZ: Asia/Shanghai
      MYSQL_DATABASE: 'ry-cloud'
      MYSQL_ROOT_PASSWORD: password
    healthcheck:
      test: [ "CMD", "mysqladmin" ,"ping", "-h", "localhost" ]
      timeout: 45s
      interval: 10s
      retries: 10
  witbee-redis:
    restart: always
    container_name: witbee-redis
    image: redis:7.0.6
    build:
      context: ./redis
    ports:
      - "6379:6379"
    volumes:
      - ./redis/conf/redis.conf:/home/witbee/redis/redis.conf
      - ./redis/data:/data
    command: redis-server /home/witbee/redis/redis.conf
  witbee-nginx:
    container_name: witbee-nginx
    image: nginx
    build:
      context: ./nginx
    ports:
      - "8000:80"
    volumes:
      - ./nginx/html/dist:/home/witbee/projects/witbee-ui
      - ./nginx/conf/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/logs:/var/log/nginx
      - ./nginx/conf.d:/etc/nginx/conf.d
    depends_on:
      - witbee-gateway
  witbee-gateway:
    restart: always
    container_name: witbee-gateway
    build:
      context: ./witbee/gateway
      dockerfile: dockerfile
    ports:
      - "9000:9000"
    depends_on:
      - witbee-redis
  witbee-auth:
    restart: always
    container_name: witbee-auth
    build:
      context: ./witbee/auth
      dockerfile: dockerfile
    ports:
      - "9200:9200"
    depends_on:
      - witbee-redis
  witbee-modules-system:
    restart: always
    container_name: witbee-modules-system
    build:
      context: ./witbee/modules/system
      dockerfile: dockerfile
    ports:
      - "9201:9201"
    depends_on:
      - witbee-redis
      - witbee-mysql
  witbee-modules-gen:
    restart: always
    container_name: witbee-modules-gen
    build:
      context: ./witbee/modules/gen
      dockerfile: dockerfile
    ports:
      - "9202:9202"
    depends_on:
      - witbee-redis
      - witbee-mysql
  witbee-modules-job:
    restart: always
    container_name: witbee-modules-job
    build:
      context: ./witbee/modules/job
      dockerfile: dockerfile
    ports:
      - "9203:9203"
    depends_on:
      - witbee-redis
      - witbee-mysql
  witbee-modules-file:
    restart: always
    container_name: witbee-modules-file
    build:
      context: ./witbee/modules/file
      dockerfile: dockerfile
    ports:
      - "9300:9300"
    volumes:
    - ./witbee/uploadPath:/home/witbee/uploadPath
  witbee-visual-monitor:
    restart: always
    container_name: witbee-visual-monitor
    build:
      context: ./witbee/visual/monitor
      dockerfile: dockerfile
    ports:
      - "9100:9100"

deploy.sh

#!/bin/sh

# 使用说明,用来提示输入参数
usage() 
	echo "Usage: sh 执行脚本.sh [port|base|modules|modulesPlus|stop|rm]"
	exit 1


# 开启所需端口
port()
	firewall-cmd --add-port=8000/tcp --permanent
	firewall-cmd --add-port=9000/tcp --permanent
	firewall-cmd --add-port=8848/tcp --permanent
	firewall-cmd --add-port=9848/tcp --permanent
	firewall-cmd --add-port=9849/tcp --permanent
	firewall-cmd --add-port=6379/tcp --permanent
	firewall-cmd --add-port=3306/tcp --permanent
	firewall-cmd --add-port=9100/tcp --permanent
	firewall-cmd --add-port=9200/tcp --permanent
	firewall-cmd --add-port=9201/tcp --permanent
	firewall-cmd --add-port=9202/tcp --permanent
	firewall-cmd --add-port=9203/tcp --permanent
	firewall-cmd --add-port=9300/tcp --permanent
	service firewalld restart


# 项目文件夹
BASE_DIR="/home/witbee-cloud"
# 项目包名
PACKAGE_NAME="witbee-cloud.tgz"

# 启动基础环境(必须)
base()
  docker-compose up -d witbee-mysql witbee-redis witbee-nacos


# 启动程序模块(必须)
modules()
  echo "删除原始文件"
  cd $BASE_DIR/docker
  rm -f ./witbee/gateway/jar/** ./witbee/auth/jar/** ./witbee/modules/system/jar/**
  echo "复制 gateway 模块"
  cp ../witbee-gateway/target/witbee-gateway.jar ./witbee/gateway/jar
  echo "复制 auth 模块"
  cp ../witbee-auth/target/witbee-auth.jar ./witbee/auth/jar
  echo "复制 system 模块"
  cp ../witbee-modules/witbee-system/target/witbee-modules-system.jar ./witbee/modules/system/jar
  echo "删除原始镜像"
  docker-compose stop witbee-gateway witbee-auth witbee-modules-system && docker-compose rm -f witbee-gateway witbee-auth witbee-modules-system
  echo "构建启动镜像"
  docker-compose up -d --build witbee-gateway witbee-auth witbee-modules-system


# 启动程序模块(非必须)
modulesPlus()
  echo "删除原始文件"
  cd $BASE_DIR/docker
  rm -f ./witbee/modules/file/jar/** ./witbee/modules/gen/jar/** ./witbee/modules/job/jar/**
  echo "复制 file 模块"
  cp ../witbee-modules/witbee-file/target/witbee-modules-file.jar ./witbee/modules/file/jar
  echo "复制 gen 模块"
  cp ../witbee-modules/witbee-gen/target/witbee-modules-gen.jar ./witbee/modules/gen/jar
  echo "复制 job 模块"
  cp ../witbee-modules/witbee-job/target/witbee-modules-job.jar ./witbee/modules/job/jar
  echo "删除原始镜像"
  docker-compose stop witbee-modules-file witbee-modules-gen witbee-modules-job && docker-compose rm -f witbee-modules-file witbee-modules-gen witbee-modules-job
  echo "构建启动镜像"
  docker-compose up -d --build witbee-modules-file witbee-modules-gen witbee-modules-job


# 关闭所有环境/模块
stop()
  docker-compose stop


# 删除所有环境/模块
rm()
  docker-compose rm


# 根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"port")
	port
;;
"base")
	base
;;
"modules")
	modules
;;
"modulesPlus")
	modulesPlus
;;
"stop")
	stop
;;
"rm")
	rm
;;
*)
	usage
;;
esac

由于使用 docker-compose 部署可能会产生多余的镜像,可以使用 docker image prune 命令清理。也可能产生许多没用的储存卷,使用 docker volume rm $(docker volume ls -qf dangling=true) 命令清理。以上就是阿里云云效流水线自动化部署 ruoyi-cloud 微服务架构全部内容了,欢迎讨论!

CI/CD系列之阿里云云效2020应用篇

前言

前不久登录阿里云后台,看到云效的介绍,出于好奇便点进去看了看,刚开始以为云效是类似Jenkins的一套自动化部署方案,了解之后发现云效的野心很大哦,从需求管理、业务开发、代码管理、缺陷测试、部署上线全方位掌控,试图提供一站式DevOps平台,将原先零散的管理平台整合成一个掌管项目全生命周期的综合性管理平台,想法倒是蛮好的,目前东一个平台,西一个平台切换来切换去也颇有点麻烦,能整合起来还是要点赞的,另外目前也是免费使用,那就尝试下吧。

实战

在阿里云后台点击云效后会有二个云效,一个叫“云效”,一个叫“云效2020”,本文主要介绍云效2020,以下简称云效。云效涉及功能较多,本章节以自动化部署展开说明。
技术图片
涉及云效中制品仓库,代码管理,流水线三大功能,示例已原有项目接入展开说明。

制品仓库

制品仓库其实就是Maven仓库,云效已为每个企业提供一个maven私库,省去自己搭建maven私库。

maven配置

点击进入云效中的制品仓库后,会看到如下图界面
技术图片
点击任意仓库地址后,会跳转至maven配置指南,详细说明该如何配置,这点做得蛮友好的
技术图片
如果原先本地对maven配置项没有调整过的话,直接按照制品仓库说明文档中的方式一直接下载覆盖本地文件即可。相信大多数应该都不是默认配置,那就按照方式二说明进行调整即可。
首先将仓库凭证信息复制至本地maven配置项中servers节点,如下图,可以发现凭证信息都是成对出现的,我这边添加了3组凭证配置项
技术图片
其次将仓库地址信息复制至本地maven配置项中profiles节点下的repositories节点,如下图
技术图片

项目pom配置

本地maven配置项调整好后,我们需在项目中根目录下的pom.xml增加相应配置,找到根节点pom.xml文件后,将云效中制品上传配置复制过来即可,如下图
技术图片
另外也需将制品仓库中的settings.xml,复制项目根目录下,该文件在后续构建过程中需使用,如下图
技术图片
到这里涉及maven的调整已经完成,有个注意点这边配置项中的id属性值需上下一一对应,且不可重复

代码管理

云效中目前支持的代码源如下图
技术图片
如果原先项目已采用上述代码源中的一种并且支持公网访问的话,那恭喜你可直接跳过该步骤,直接进入流水线配置。如果项目未采用上述代码源管理的话,那就赶紧选择一项,这边推荐使用云效Codeup,毕竟是已整合在云效中。关于Git的配置及使用本文不做介绍,可自行百度即可。

流水线

点击云效中的流水线模块,进入流水线管理页面,如下图
技术图片
点击新建流水线后,选择Java最基础的构建模板
技术图片
之后进入流程配置页,如下图
技术图片
第一步:选择项目源,在项目源选择好上一步配置好的代码源即可。
第二步:配置构建参数,在这步需进行二项操作,Java构建参数配置及构建物上传配置,如下图
技术图片
在Java构建中选择项目运行的Java版本,我这边项目是基于jdk1.8开发,所以也选择jdk1.8。
在构建命令中可根据自己项目实际情况,更改构建命令,我这边使用如下命令

mvn -B clean package -Dmaven.test.skip=true -Dautoconfig.skip -s settings.xml -P pro
命令参数 说明
-s 用户maven配置文件的路径
-P maven会激活项目中pom.xml配置的profiles标签,如项目中有用到环境配置则需添加该配置

技术图片
构建物上传这边需在打包路径进行设置,根据项目情况进行调整,我这边项目最终输出为一个war包,则配置好构建后的路径。这边打包路径为当前构建产生的构建产物在当前工作区下的相对路径。如"target/"
第三步:主机部署配置,如下图
技术图片
在制品选项栏中点击下拉选择会自动选中选项,目前该选项不可自行配置,选择默认的即可。
在主机组选项中对于首次使用流水线的,需新建主机组,目前支持阿里云ECS及自有主机(只要能通过外网访问都支持),如下图
技术图片
我这边已经配置过阿里云ECS,这边就不重复操作了,选择相应的主机组即可,大家可根据自身实际情况添加主机。
在下载路径配置中选择存放上一步构建物构建后上传至该服务器的文件路径,我这边选择默认配置。
在执行用户中选择部署脚本执行用户,我这边是root用户。
在部署脚本中主要做的任务就是将上传至该服务器的构建物进行解压,然后根据项目部署方式进行部署。我这边主要做了如下操作:
1.将构建物进行解压,解压出的war包保存至指定目录

tar zxvf /home/admin/app/package.tgz -C /home/admin/fms/

2.执行部署脚本

sh /home/admin/deploy.sh restart

3.在命令中先执行tomcat停止命令

stop_application() {
  echo "stoping java process"
  service tomcat stop
  echo "stoped java process"
}

4.将原先项目老版本进行备份,备份后删除老版本,将新版本解压至tomcat运行目录

start_init() {
	# 创建项目备份路径
	mkdir -p ${TOMCAT_HOME}/bf/${SERVICE_DAY_STR2}/
	cp -r ${TOMCAT_APP_HOME} ${TOMCAT_HOME}/bf/${SERVICE_DAY_STR2}/
	rm -rf ${TOMCAT_APP_HOME}*
	#cp -r ${APP_HOME} /opt/tomcat8/webapps/
 	unzip ${WAR_NAME} -d ${TOMCAT_APP_HOME}
}

5.执行tomcat启动命令

start_application() {
    echo "starting java process"
    #nohup java -jar ${JAR_NAME} > ${JAVA_OUT} 2>&1 &
    service tomcat start
    echo "started java process"
}

根据云效给的部署脚本示例,结合自身项目实际部署情况进行调整,完整部署脚本如下
官方部署实例脚本
https://thoughts.aliyun.com/sharespace/5e86a419546fd9001aee81f2/docs/5e86a416546fd9001aee81b9

#APP_NAME为云效上的应用名
APP_NAME=fms


PROG_NAME=$0
ACTION=$1
APP_START_TIMEOUT=20    # 等待应用启动的时间
APP_PORT=8080          # 应用端口
HEALTH_CHECK_URL=http://127.0.0.1:${APP_PORT}  # 应用健康检查URL
APP_HOME=/home/admin/${APP_NAME} # 从package.tgz中解压出来的jar包放到这个目录下
WAR_NAME=${APP_HOME}/${APP_NAME}.war # jar包的名字
JAVA_OUT=${APP_HOME}/logs/start.log  #应用的启动日志
TOMCAT_HOME=/opt/tomcat8
TOMCAT_APP_HOME=${TOMCAT_HOME}/webapps/fms/
SERVICE_DAY_STR=`date --date=‘0 days ago‘ +%Y-%m-%d`
SERVICE_DAY_STR2=`date --date=‘0 days ago‘ +%Y%m%d%H%M%S`
# 创建出相关目录
mkdir -p ${APP_HOME}
mkdir -p ${APP_HOME}/logs
usage() {
    echo "Usage: $PROG_NAME {start|stop|restart}"
    exit 2
}

health_check() {
    exptime=0
    echo "checking ${HEALTH_CHECK_URL}"
    while true
        do
            status_code=`/usr/bin/curl -L -o /dev/null --connect-timeout 5 -s -w %{http_code}  ${HEALTH_CHECK_URL}`
            if [ "$?" != "0" ]; then
               echo -n -e "
application not started"
            else
                echo "code is $status_code"
                if [ "$status_code" == "200" ];then
                    break
                fi
            fi
            sleep 1
            ((exptime++))

            echo -e "
Wait app to pass health check: $exptime..."

            if [ $exptime -gt ${APP_START_TIMEOUT} ]; then
                echo ‘app start failed‘
               exit 1
            fi
        done
    echo "check ${HEALTH_CHECK_URL} success"
}
start_application() {
    echo "starting java process"
    #nohup java -jar ${JAR_NAME} > ${JAVA_OUT} 2>&1 &
    service tomcat start
    echo "started java process"
}

stop_application() {
  echo "stoping java process"
  service tomcat stop
  echo "stoped java process"
}
start_init() {
	# 创建项目备份路径
	mkdir -p ${TOMCAT_HOME}/bf/${SERVICE_DAY_STR2}/
	cp -r ${TOMCAT_APP_HOME} ${TOMCAT_HOME}/bf/${SERVICE_DAY_STR2}/
	rm -rf ${TOMCAT_APP_HOME}*
	#cp -r ${APP_HOME} /opt/tomcat8/webapps/
 	unzip ${WAR_NAME} -d ${TOMCAT_APP_HOME}
}
start() {
    start_init
    start_application
    health_check
}
stop() {
    stop_application
}
case "$ACTION" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    restart)
        stop
        start
    ;;
    *)
        usage
    ;;
esac

流程配置完后还有二项配置,触发设置和变量和缓存配置,这二项配置是最近出来的,原先是没有的(阿里的迭代还是蛮快的)我这边主要说明部署过程,如有需要可自行体验,点击保存即可完成流水线的配置工作。
配置完后点击配置的流水线,点击运行即可体验自动化部署下带来的便捷了,部署过程中可时刻关注日志输出,便于刚开始部署调试,后续就一劳永逸了。

参考资料

https://thoughts.aliyun.com/sharespace/5e86a419546fd9001aee81f2/docs/5e86a414546fd9001aee8195

技术图片










































以上是关于阿里云云效流水线自动化部署 ruoyi-cloud 微服务架构的主要内容,如果未能解决你的问题,请参考以下文章

阿里云 云效Devops流水线Flow自动化部署前端项目

阿里云 云效Devops流水线Flow自动化部署Docker项目

新鲜出炉的阿里云云效平台初步测评

新鲜出炉的阿里云云效平台初步测评

Eova 怎么放在 Docker中,使用阿里云流水线构建Eova!!

项目版本管理的最佳实践:云效飞流Flow篇