From f9fede3ea79b6823316e3e03a1b7c510fb951298 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Wed, 6 Dec 2023 22:11:12 +0800 Subject: [PATCH] 🚚 将运维相关的统一到 script 目录下,简化根目录 --- script/docker/Docker-HOWTO.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ script/docker/docker-compose.yml | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ script/docker/docker.env | 25 +++++++++++++++++++++++++ script/idea/http-client.env.json | 20 ++++++++++++++++++++ script/jenkins/Jenkinsfile | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ script/shell/deploy.sh | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Docker-HOWTO.md | 49 ------------------------------------------------- Jenkinsfile | 60 ------------------------------------------------------------ bin/deploy.sh | 160 ---------------------------------------------------------------------------------------------------------------------------------------------------------------- docker-compose.yml | 84 ------------------------------------------------------------------------------------ docker.env | 25 ------------------------- http-client.env.json | 20 -------------------- 12 files changed, 398 insertions(+), 398 deletions(-) create mode 100644 script/docker/Docker-HOWTO.md create mode 100644 script/docker/docker-compose.yml create mode 100644 script/docker/docker.env create mode 100644 script/idea/http-client.env.json create mode 100644 script/jenkins/Jenkinsfile create mode 100644 script/shell/deploy.sh delete mode 100644 Docker-HOWTO.md delete mode 100644 Jenkinsfile delete mode 100644 bin/deploy.sh delete mode 100644 docker-compose.yml delete mode 100644 docker.env delete mode 100644 http-client.env.json diff --git a/ script/docker/Docker-HOWTO.md b/ script/docker/Docker-HOWTO.md new file mode 100644 index 0000000..7a62a68 --- /dev/null +++ b/ script/docker/Docker-HOWTO.md @@ -0,0 +1,49 @@ +# Docker Build & Up + +目标: 快速部署体验系统,帮助了解系统之间的依赖关系。 +依赖:docker compose v2,删除`name: yudao-system`,降低`version`版本为`3.3`以下,支持`docker-compose`。 + +## 功能文件列表 + +```text +. +├── Docker-HOWTO.md +├── docker-compose.yml +├── docker.env <-- 提供docker-compose环境变量配置 +├── yudao-server +│ └── Dockerfile +└── yudao-ui-admin + ├── .dockerignore + ├── Dockerfile + └── nginx.conf <-- 提供基础配置,gzip压缩、api转发 +``` + +## 构建 jar 包 + +```shell +# 创建maven缓存volume +docker volume create --name yudao-maven-repo + +docker run -it --rm --name yudao-maven \ + -v yudao-maven-repo:/root/.m2 \ + -v $PWD:/usr/src/mymaven \ + -w /usr/src/mymaven \ + maven mvn clean install package '-Dmaven.test.skip=true' +``` + +## 构建启动服务 + +```shell +docker compose --env-file docker.env up -d +``` + +首次运行会自动构建容器。可以通过`docker compose build [service]`来手动构建所有或某个docker镜像 + +`--env-file docker.env`为可选参数,只是展示了通过`.env`文件配置容器启动的环境变量,`docker-compose.yml`本身已经提供足够的默认参数来正常运行系统。 + +## 服务器的宿主机端口映射 + +- admin ui: http://localhost:8080 +- api server: http://localhost:48080 +- mysql: root/123456, port: 3306 +- redis: port: 6379 diff --git a/ script/docker/docker-compose.yml b/ script/docker/docker-compose.yml new file mode 100644 index 0000000..e440d96 --- /dev/null +++ b/ script/docker/docker-compose.yml @@ -0,0 +1,84 @@ +version: "3.4" + +name: yudao-system + +services: + mysql: + container_name: yudao-mysql + image: mysql:8 + restart: unless-stopped + tty: true + ports: + - "3306:3306" + environment: + MYSQL_DATABASE: ${MYSQL_DATABASE:-ruoyi-vue-pro} + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-123456} + volumes: + - mysql:/var/lib/mysql/ + - ./sql/mysql/ruoyi-vue-pro.sql:/docker-entrypoint-initdb.d/ruoyi-vue-pro.sql:ro + + redis: + container_name: yudao-redis + image: redis:6-alpine + restart: unless-stopped + ports: + - "6379:6379" + volumes: + - redis:/data + + server: + container_name: yudao-server + build: + context: ./yudao-server/ + image: yudao-server + restart: unless-stopped + ports: + - "48080:48080" + environment: + # https://github.com/polovyivan/docker-pass-configs-to-container + SPRING_PROFILES_ACTIVE: local + JAVA_OPTS: + ${JAVA_OPTS:- + -Xms512m + -Xmx512m + -Djava.security.egd=file:/dev/./urandom + } + ARGS: + --spring.datasource.dynamic.datasource.master.url=${MASTER_DATASOURCE_URL:-jdbc:mysql://yudao-mysql:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true} + --spring.datasource.dynamic.datasource.master.username=${MASTER_DATASOURCE_USERNAME:-root} + --spring.datasource.dynamic.datasource.master.password=${MASTER_DATASOURCE_PASSWORD:-123456} + --spring.datasource.dynamic.datasource.slave.url=${SLAVE_DATASOURCE_URL:-jdbc:mysql://yudao-mysql:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true} + --spring.datasource.dynamic.datasource.slave.username=${SLAVE_DATASOURCE_USERNAME:-root} + --spring.datasource.dynamic.datasource.slave.password=${SLAVE_DATASOURCE_PASSWORD:-123456} + --spring.redis.host=${REDIS_HOST:-yudao-redis} + depends_on: + - mysql + - redis + + admin: + container_name: yudao-admin + build: + context: ./yudao-ui-admin + args: + NODE_ENV: + ENV=${NODE_ENV:-production} + PUBLIC_PATH=${PUBLIC_PATH:-/} + VUE_APP_TITLE=${VUE_APP_TITLE:-芋道管理系统} + VUE_APP_BASE_API=${VUE_APP_BASE_API:-/prod-api} + VUE_APP_APP_NAME=${VUE_APP_APP_NAME:-/} + VUE_APP_TENANT_ENABLE=${VUE_APP_TENANT_ENABLE:-true} + VUE_APP_CAPTCHA_ENABLE=${VUE_APP_CAPTCHA_ENABLE:-true} + VUE_APP_DOC_ENABLE=${VUE_APP_DOC_ENABLE:-true} + VUE_APP_BAIDU_CODE=${VUE_APP_BAIDU_CODE:-fadc1bd5db1a1d6f581df60a1807f8ab} + image: yudao-admin + restart: unless-stopped + ports: + - "8080:80" + depends_on: + - server + +volumes: + mysql: + driver: local + redis: + driver: local diff --git a/ script/docker/docker.env b/ script/docker/docker.env new file mode 100644 index 0000000..0bf6e99 --- /dev/null +++ b/ script/docker/docker.env @@ -0,0 +1,25 @@ +## mysql +MYSQL_DATABASE=ruoyi-vue-pro +MYSQL_ROOT_PASSWORD=123456 + +## server +JAVA_OPTS=-Xms512m -Xmx512m -Djava.security.egd=file:/dev/./urandom + +MASTER_DATASOURCE_URL=jdbc:mysql://yudao-mysql:3306/${MYSQL_DATABASE}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true +MASTER_DATASOURCE_USERNAME=root +MASTER_DATASOURCE_PASSWORD=${MYSQL_ROOT_PASSWORD} +SLAVE_DATASOURCE_URL=${MASTER_DATASOURCE_URL} +SLAVE_DATASOURCE_USERNAME=${MASTER_DATASOURCE_USERNAME} +SLAVE_DATASOURCE_PASSWORD=${MASTER_DATASOURCE_PASSWORD} +REDIS_HOST=yudao-redis + +## admin +NODE_ENV=production +PUBLIC_PATH=/ +VUE_APP_TITLE=芋道管理系统 +VUE_APP_BASE_API=/prod-api +VUE_APP_APP_NAME=/ +VUE_APP_TENANT_ENABLE=true +VUE_APP_CAPTCHA_ENABLE=true +VUE_APP_DOC_ENABLE=true +VUE_APP_BAIDU_CODE=fadc1bd5db1a1d6f581df60a1807f8ab diff --git a/ script/idea/http-client.env.json b/ script/idea/http-client.env.json new file mode 100644 index 0000000..4a4cb52 --- /dev/null +++ b/ script/idea/http-client.env.json @@ -0,0 +1,20 @@ +{ + "local": { + "baseUrl": "http://127.0.0.1:48080/admin-api", + "token": "test1", + "adminTenentId": "1", + + "appApi": "http://127.0.0.1:48080/app-api", + "appToken": "test247", + "appTenentId": "1" + }, + "gateway": { + "baseUrl": "http://127.0.0.1:8888/admin-api", + "token": "test1", + "adminTenentId": "1", + + "appApi": "http://127.0.0.1:8888/app-api", + "appToken": "test1", + "appTenantId": "1" + } +} diff --git a/ script/jenkins/Jenkinsfile b/ script/jenkins/Jenkinsfile new file mode 100644 index 0000000..91842b3 --- /dev/null +++ b/ script/jenkins/Jenkinsfile @@ -0,0 +1,60 @@ +#!groovy +pipeline { + + agent any + + parameters { + string(name: 'TAG_NAME', defaultValue: '', description: '') + } + + environment { + // DockerHub 凭证 ID(登录您的 DockerHub) + DOCKER_CREDENTIAL_ID = 'dockerhub-id' + // GitHub 凭证 ID (推送 tag 到 GitHub 仓库) + GITHUB_CREDENTIAL_ID = 'github-id' + // kubeconfig 凭证 ID (访问接入正在运行的 Kubernetes 集群) + KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig' + // 镜像的推送 + REGISTRY = 'docker.io' + // DockerHub 账号名 + DOCKERHUB_NAMESPACE = 'docker_username' + // GitHub 账号名 + GITHUB_ACCOUNT = 'https://gitee.com/zhijiantianya/ruoyi-vue-pro' + // 应用名称 + APP_NAME = 'yudao-server' + // 应用部署路径 + APP_DEPLOY_BASE_DIR = '/media/pi/KINGTON/data/work/projects/' + } + + stages { + stage('检出') { + steps { + git url: "https://gitee.com/will-we/ruoyi-vue-pro.git", + branch: "devops" + } + } + + stage('构建') { + steps { + // TODO 解决多环境链接、密码不同配置临时方案 + sh 'if [ ! -d "' + "${env.HOME}" + '/resources" ];then\n' + + ' echo "配置文件不存在无需修改"\n' + + 'else\n' + + ' cp -rf ' + "${env.HOME}" + '/resources/*.yaml ' + "${env.APP_NAME}" + '/src/main/resources\n' + + ' echo "配置文件替换"\n' + + 'fi' + sh 'mvn clean package -Dmaven.test.skip=true' + } + } + + stage('部署') { + steps { + sh 'cp -f ' + ' bin/deploy.sh ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" + sh 'cp -f ' + "${env.APP_NAME}" + '/target/*.jar ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" +'/build/' + archiveArtifacts "${env.APP_NAME}" + '/target/*.jar' + sh 'chmod +x ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" + '/deploy.sh' + sh 'bash ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" + '/deploy.sh' + } + } + } +} diff --git a/ script/shell/deploy.sh b/ script/shell/deploy.sh new file mode 100644 index 0000000..f0fdf1f --- /dev/null +++ b/ script/shell/deploy.sh @@ -0,0 +1,160 @@ +#!/bin/bash +set -e + +DATE=$(date +%Y%m%d%H%M) +# 基础路径 +BASE_PATH=/work/projects/yudao-server +# 编译后 jar 的地址。部署时,Jenkins 会上传 jar 包到该目录下 +SOURCE_PATH=$BASE_PATH/build +# 服务名称。同时约定部署服务的 jar 包名字也为它。 +SERVER_NAME=yudao-server +# 环境 +PROFILES_ACTIVE=development +# 健康检查 URL +HEALTH_CHECK_URL=http://127.0.0.1:48080/actuator/health/ + +# heapError 存放路径 +HEAP_ERROR_PATH=$BASE_PATH/heapError +# JVM 参数 +JAVA_OPS="-Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$HEAP_ERROR_PATH" + +# SkyWalking Agent 配置 +#export SW_AGENT_NAME=$SERVER_NAME +#export SW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.0.84:11800 +#export SW_GRPC_LOG_SERVER_HOST=192.168.0.84 +#export SW_AGENT_TRACE_IGNORE_PATH="Redisson/PING,/actuator/**,/admin/**" +#export JAVA_AGENT=-javaagent:/work/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar + +# 备份 +function backup() { + # 如果不存在,则无需备份 + if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then + echo "[backup] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过备份" + # 如果存在,则备份到 backup 目录下,使用时间作为后缀 + else + echo "[backup] 开始备份 $SERVER_NAME ..." + cp $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar + echo "[backup] 备份 $SERVER_NAME 完成" + fi +} + +# 最新构建代码 移动到项目环境 +function transfer() { + echo "[transfer] 开始转移 $SERVER_NAME.jar" + + # 删除原 jar 包 + if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then + echo "[transfer] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过删除" + else + echo "[transfer] 移除 $BASE_PATH/$SERVER_NAME.jar 完成" + rm $BASE_PATH/$SERVER_NAME.jar + fi + + # 复制新 jar 包 + echo "[transfer] 从 $SOURCE_PATH 中获取 $SERVER_NAME.jar 并迁移至 $BASE_PATH ...." + cp $SOURCE_PATH/$SERVER_NAME.jar $BASE_PATH + + echo "[transfer] 转移 $SERVER_NAME.jar 完成" +} + +# 停止:优雅关闭之前已经启动的服务 +function stop() { + echo "[stop] 开始停止 $BASE_PATH/$SERVER_NAME" + PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}') + # 如果 Java 服务启动中,则进行关闭 + if [ -n "$PID" ]; then + # 正常关闭 + echo "[stop] $BASE_PATH/$SERVER_NAME 运行中,开始 kill [$PID]" + kill -15 $PID + # 等待最大 120 秒,直到关闭完成。 + for ((i = 0; i < 120; i++)) + do + sleep 1 + PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}') + if [ -n "$PID" ]; then + echo -e ".\c" + else + echo '[stop] 停止 $BASE_PATH/$SERVER_NAME 成功' + break + fi + done + + # 如果正常关闭失败,那么进行强制 kill -9 进行关闭 + if [ -n "$PID" ]; then + echo "[stop] $BASE_PATH/$SERVER_NAME 失败,强制 kill -9 $PID" + kill -9 $PID + fi + # 如果 Java 服务未启动,则无需关闭 + else + echo "[stop] $BASE_PATH/$SERVER_NAME 未启动,无需停止" + fi +} + +# 启动:启动后端项目 +function start() { + # 开启启动前,打印启动参数 + echo "[start] 开始启动 $BASE_PATH/$SERVER_NAME" + echo "[start] JAVA_OPS: $JAVA_OPS" + echo "[start] JAVA_AGENT: $JAVA_AGENT" + echo "[start] PROFILES: $PROFILES_ACTIVE" + + # 开始启动 + BUILD_ID=dontKillMe nohup java -server $JAVA_OPS $JAVA_AGENT -jar $BASE_PATH/$SERVER_NAME.jar --spring.profiles.active=$PROFILES_ACTIVE & + echo "[start] 启动 $BASE_PATH/$SERVER_NAME 完成" +} + +# 健康检查:自动判断后端项目是否正常启动 +function healthCheck() { + # 如果配置健康检查,则进行健康检查 + if [ -n "$HEALTH_CHECK_URL" ]; then + # 健康检查最大 120 秒,直到健康检查通过 + echo "[healthCheck] 开始通过 $HEALTH_CHECK_URL 地址,进行健康检查"; + for ((i = 0; i < 120; i++)) + do + # 请求健康检查地址,只获取状态码。 + result=`curl -I -m 10 -o /dev/null -s -w %{http_code} $HEALTH_CHECK_URL || echo "000"` + # 如果状态码为 200,则说明健康检查通过 + if [ "$result" == "200" ]; then + echo "[healthCheck] 健康检查通过"; + break + # 如果状态码非 200,则说明未通过。sleep 1 秒后,继续重试 + else + echo -e ".\c" + sleep 1 + fi + done + + # 健康检查未通过,则异常退出 shell 脚本,不继续部署。 + if [ ! "$result" == "200" ]; then + echo "[healthCheck] 健康检查不通过,可能部署失败。查看日志,自行判断是否启动成功"; + tail -n 10 nohup.out + exit 1; + # 健康检查通过,打印最后 10 行日志,可能部署的人想看下日志。 + else + tail -n 10 nohup.out + fi + # 如果未配置健康检查,则 sleep 120 秒,人工看日志是否部署成功。 + else + echo "[healthCheck] HEALTH_CHECK_URL 未配置,开始 sleep 120 秒"; + sleep 120 + echo "[healthCheck] sleep 120 秒完成,查看日志,自行判断是否启动成功"; + tail -n 50 nohup.out + fi +} + +# 部署 +function deploy() { + cd $BASE_PATH + # 备份原 jar + backup + # 停止 Java 服务 + stop + # 部署新 jar + transfer + # 启动 Java 服务 + start + # 健康检查 + healthCheck +} + +deploy diff --git a/Docker-HOWTO.md b/Docker-HOWTO.md deleted file mode 100644 index 7a62a68..0000000 --- a/Docker-HOWTO.md +++ /dev/null @@ -1,49 +0,0 @@ -# Docker Build & Up - -目标: 快速部署体验系统,帮助了解系统之间的依赖关系。 -依赖:docker compose v2,删除`name: yudao-system`,降低`version`版本为`3.3`以下,支持`docker-compose`。 - -## 功能文件列表 - -```text -. -├── Docker-HOWTO.md -├── docker-compose.yml -├── docker.env <-- 提供docker-compose环境变量配置 -├── yudao-server -│ └── Dockerfile -└── yudao-ui-admin - ├── .dockerignore - ├── Dockerfile - └── nginx.conf <-- 提供基础配置,gzip压缩、api转发 -``` - -## 构建 jar 包 - -```shell -# 创建maven缓存volume -docker volume create --name yudao-maven-repo - -docker run -it --rm --name yudao-maven \ - -v yudao-maven-repo:/root/.m2 \ - -v $PWD:/usr/src/mymaven \ - -w /usr/src/mymaven \ - maven mvn clean install package '-Dmaven.test.skip=true' -``` - -## 构建启动服务 - -```shell -docker compose --env-file docker.env up -d -``` - -首次运行会自动构建容器。可以通过`docker compose build [service]`来手动构建所有或某个docker镜像 - -`--env-file docker.env`为可选参数,只是展示了通过`.env`文件配置容器启动的环境变量,`docker-compose.yml`本身已经提供足够的默认参数来正常运行系统。 - -## 服务器的宿主机端口映射 - -- admin ui: http://localhost:8080 -- api server: http://localhost:48080 -- mysql: root/123456, port: 3306 -- redis: port: 6379 diff --git a/Jenkinsfile b/Jenkinsfile deleted file mode 100644 index 91842b3..0000000 --- a/Jenkinsfile +++ /dev/null @@ -1,60 +0,0 @@ -#!groovy -pipeline { - - agent any - - parameters { - string(name: 'TAG_NAME', defaultValue: '', description: '') - } - - environment { - // DockerHub 凭证 ID(登录您的 DockerHub) - DOCKER_CREDENTIAL_ID = 'dockerhub-id' - // GitHub 凭证 ID (推送 tag 到 GitHub 仓库) - GITHUB_CREDENTIAL_ID = 'github-id' - // kubeconfig 凭证 ID (访问接入正在运行的 Kubernetes 集群) - KUBECONFIG_CREDENTIAL_ID = 'demo-kubeconfig' - // 镜像的推送 - REGISTRY = 'docker.io' - // DockerHub 账号名 - DOCKERHUB_NAMESPACE = 'docker_username' - // GitHub 账号名 - GITHUB_ACCOUNT = 'https://gitee.com/zhijiantianya/ruoyi-vue-pro' - // 应用名称 - APP_NAME = 'yudao-server' - // 应用部署路径 - APP_DEPLOY_BASE_DIR = '/media/pi/KINGTON/data/work/projects/' - } - - stages { - stage('检出') { - steps { - git url: "https://gitee.com/will-we/ruoyi-vue-pro.git", - branch: "devops" - } - } - - stage('构建') { - steps { - // TODO 解决多环境链接、密码不同配置临时方案 - sh 'if [ ! -d "' + "${env.HOME}" + '/resources" ];then\n' + - ' echo "配置文件不存在无需修改"\n' + - 'else\n' + - ' cp -rf ' + "${env.HOME}" + '/resources/*.yaml ' + "${env.APP_NAME}" + '/src/main/resources\n' + - ' echo "配置文件替换"\n' + - 'fi' - sh 'mvn clean package -Dmaven.test.skip=true' - } - } - - stage('部署') { - steps { - sh 'cp -f ' + ' bin/deploy.sh ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" - sh 'cp -f ' + "${env.APP_NAME}" + '/target/*.jar ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" +'/build/' - archiveArtifacts "${env.APP_NAME}" + '/target/*.jar' - sh 'chmod +x ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" + '/deploy.sh' - sh 'bash ' + "${env.APP_DEPLOY_BASE_DIR}" + "${env.APP_NAME}" + '/deploy.sh' - } - } - } -} diff --git a/bin/deploy.sh b/bin/deploy.sh deleted file mode 100644 index f0fdf1f..0000000 --- a/bin/deploy.sh +++ /dev/null @@ -1,160 +0,0 @@ -#!/bin/bash -set -e - -DATE=$(date +%Y%m%d%H%M) -# 基础路径 -BASE_PATH=/work/projects/yudao-server -# 编译后 jar 的地址。部署时,Jenkins 会上传 jar 包到该目录下 -SOURCE_PATH=$BASE_PATH/build -# 服务名称。同时约定部署服务的 jar 包名字也为它。 -SERVER_NAME=yudao-server -# 环境 -PROFILES_ACTIVE=development -# 健康检查 URL -HEALTH_CHECK_URL=http://127.0.0.1:48080/actuator/health/ - -# heapError 存放路径 -HEAP_ERROR_PATH=$BASE_PATH/heapError -# JVM 参数 -JAVA_OPS="-Xms512m -Xmx512m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$HEAP_ERROR_PATH" - -# SkyWalking Agent 配置 -#export SW_AGENT_NAME=$SERVER_NAME -#export SW_AGENT_COLLECTOR_BACKEND_SERVICES=192.168.0.84:11800 -#export SW_GRPC_LOG_SERVER_HOST=192.168.0.84 -#export SW_AGENT_TRACE_IGNORE_PATH="Redisson/PING,/actuator/**,/admin/**" -#export JAVA_AGENT=-javaagent:/work/skywalking/apache-skywalking-apm-bin/agent/skywalking-agent.jar - -# 备份 -function backup() { - # 如果不存在,则无需备份 - if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then - echo "[backup] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过备份" - # 如果存在,则备份到 backup 目录下,使用时间作为后缀 - else - echo "[backup] 开始备份 $SERVER_NAME ..." - cp $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar - echo "[backup] 备份 $SERVER_NAME 完成" - fi -} - -# 最新构建代码 移动到项目环境 -function transfer() { - echo "[transfer] 开始转移 $SERVER_NAME.jar" - - # 删除原 jar 包 - if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then - echo "[transfer] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过删除" - else - echo "[transfer] 移除 $BASE_PATH/$SERVER_NAME.jar 完成" - rm $BASE_PATH/$SERVER_NAME.jar - fi - - # 复制新 jar 包 - echo "[transfer] 从 $SOURCE_PATH 中获取 $SERVER_NAME.jar 并迁移至 $BASE_PATH ...." - cp $SOURCE_PATH/$SERVER_NAME.jar $BASE_PATH - - echo "[transfer] 转移 $SERVER_NAME.jar 完成" -} - -# 停止:优雅关闭之前已经启动的服务 -function stop() { - echo "[stop] 开始停止 $BASE_PATH/$SERVER_NAME" - PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}') - # 如果 Java 服务启动中,则进行关闭 - if [ -n "$PID" ]; then - # 正常关闭 - echo "[stop] $BASE_PATH/$SERVER_NAME 运行中,开始 kill [$PID]" - kill -15 $PID - # 等待最大 120 秒,直到关闭完成。 - for ((i = 0; i < 120; i++)) - do - sleep 1 - PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}') - if [ -n "$PID" ]; then - echo -e ".\c" - else - echo '[stop] 停止 $BASE_PATH/$SERVER_NAME 成功' - break - fi - done - - # 如果正常关闭失败,那么进行强制 kill -9 进行关闭 - if [ -n "$PID" ]; then - echo "[stop] $BASE_PATH/$SERVER_NAME 失败,强制 kill -9 $PID" - kill -9 $PID - fi - # 如果 Java 服务未启动,则无需关闭 - else - echo "[stop] $BASE_PATH/$SERVER_NAME 未启动,无需停止" - fi -} - -# 启动:启动后端项目 -function start() { - # 开启启动前,打印启动参数 - echo "[start] 开始启动 $BASE_PATH/$SERVER_NAME" - echo "[start] JAVA_OPS: $JAVA_OPS" - echo "[start] JAVA_AGENT: $JAVA_AGENT" - echo "[start] PROFILES: $PROFILES_ACTIVE" - - # 开始启动 - BUILD_ID=dontKillMe nohup java -server $JAVA_OPS $JAVA_AGENT -jar $BASE_PATH/$SERVER_NAME.jar --spring.profiles.active=$PROFILES_ACTIVE & - echo "[start] 启动 $BASE_PATH/$SERVER_NAME 完成" -} - -# 健康检查:自动判断后端项目是否正常启动 -function healthCheck() { - # 如果配置健康检查,则进行健康检查 - if [ -n "$HEALTH_CHECK_URL" ]; then - # 健康检查最大 120 秒,直到健康检查通过 - echo "[healthCheck] 开始通过 $HEALTH_CHECK_URL 地址,进行健康检查"; - for ((i = 0; i < 120; i++)) - do - # 请求健康检查地址,只获取状态码。 - result=`curl -I -m 10 -o /dev/null -s -w %{http_code} $HEALTH_CHECK_URL || echo "000"` - # 如果状态码为 200,则说明健康检查通过 - if [ "$result" == "200" ]; then - echo "[healthCheck] 健康检查通过"; - break - # 如果状态码非 200,则说明未通过。sleep 1 秒后,继续重试 - else - echo -e ".\c" - sleep 1 - fi - done - - # 健康检查未通过,则异常退出 shell 脚本,不继续部署。 - if [ ! "$result" == "200" ]; then - echo "[healthCheck] 健康检查不通过,可能部署失败。查看日志,自行判断是否启动成功"; - tail -n 10 nohup.out - exit 1; - # 健康检查通过,打印最后 10 行日志,可能部署的人想看下日志。 - else - tail -n 10 nohup.out - fi - # 如果未配置健康检查,则 sleep 120 秒,人工看日志是否部署成功。 - else - echo "[healthCheck] HEALTH_CHECK_URL 未配置,开始 sleep 120 秒"; - sleep 120 - echo "[healthCheck] sleep 120 秒完成,查看日志,自行判断是否启动成功"; - tail -n 50 nohup.out - fi -} - -# 部署 -function deploy() { - cd $BASE_PATH - # 备份原 jar - backup - # 停止 Java 服务 - stop - # 部署新 jar - transfer - # 启动 Java 服务 - start - # 健康检查 - healthCheck -} - -deploy diff --git a/docker-compose.yml b/docker-compose.yml deleted file mode 100644 index e440d96..0000000 --- a/docker-compose.yml +++ /dev/null @@ -1,84 +0,0 @@ -version: "3.4" - -name: yudao-system - -services: - mysql: - container_name: yudao-mysql - image: mysql:8 - restart: unless-stopped - tty: true - ports: - - "3306:3306" - environment: - MYSQL_DATABASE: ${MYSQL_DATABASE:-ruoyi-vue-pro} - MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-123456} - volumes: - - mysql:/var/lib/mysql/ - - ./sql/mysql/ruoyi-vue-pro.sql:/docker-entrypoint-initdb.d/ruoyi-vue-pro.sql:ro - - redis: - container_name: yudao-redis - image: redis:6-alpine - restart: unless-stopped - ports: - - "6379:6379" - volumes: - - redis:/data - - server: - container_name: yudao-server - build: - context: ./yudao-server/ - image: yudao-server - restart: unless-stopped - ports: - - "48080:48080" - environment: - # https://github.com/polovyivan/docker-pass-configs-to-container - SPRING_PROFILES_ACTIVE: local - JAVA_OPTS: - ${JAVA_OPTS:- - -Xms512m - -Xmx512m - -Djava.security.egd=file:/dev/./urandom - } - ARGS: - --spring.datasource.dynamic.datasource.master.url=${MASTER_DATASOURCE_URL:-jdbc:mysql://yudao-mysql:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true} - --spring.datasource.dynamic.datasource.master.username=${MASTER_DATASOURCE_USERNAME:-root} - --spring.datasource.dynamic.datasource.master.password=${MASTER_DATASOURCE_PASSWORD:-123456} - --spring.datasource.dynamic.datasource.slave.url=${SLAVE_DATASOURCE_URL:-jdbc:mysql://yudao-mysql:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true} - --spring.datasource.dynamic.datasource.slave.username=${SLAVE_DATASOURCE_USERNAME:-root} - --spring.datasource.dynamic.datasource.slave.password=${SLAVE_DATASOURCE_PASSWORD:-123456} - --spring.redis.host=${REDIS_HOST:-yudao-redis} - depends_on: - - mysql - - redis - - admin: - container_name: yudao-admin - build: - context: ./yudao-ui-admin - args: - NODE_ENV: - ENV=${NODE_ENV:-production} - PUBLIC_PATH=${PUBLIC_PATH:-/} - VUE_APP_TITLE=${VUE_APP_TITLE:-芋道管理系统} - VUE_APP_BASE_API=${VUE_APP_BASE_API:-/prod-api} - VUE_APP_APP_NAME=${VUE_APP_APP_NAME:-/} - VUE_APP_TENANT_ENABLE=${VUE_APP_TENANT_ENABLE:-true} - VUE_APP_CAPTCHA_ENABLE=${VUE_APP_CAPTCHA_ENABLE:-true} - VUE_APP_DOC_ENABLE=${VUE_APP_DOC_ENABLE:-true} - VUE_APP_BAIDU_CODE=${VUE_APP_BAIDU_CODE:-fadc1bd5db1a1d6f581df60a1807f8ab} - image: yudao-admin - restart: unless-stopped - ports: - - "8080:80" - depends_on: - - server - -volumes: - mysql: - driver: local - redis: - driver: local diff --git a/docker.env b/docker.env deleted file mode 100644 index 0bf6e99..0000000 --- a/docker.env +++ /dev/null @@ -1,25 +0,0 @@ -## mysql -MYSQL_DATABASE=ruoyi-vue-pro -MYSQL_ROOT_PASSWORD=123456 - -## server -JAVA_OPTS=-Xms512m -Xmx512m -Djava.security.egd=file:/dev/./urandom - -MASTER_DATASOURCE_URL=jdbc:mysql://yudao-mysql:3306/${MYSQL_DATABASE}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true -MASTER_DATASOURCE_USERNAME=root -MASTER_DATASOURCE_PASSWORD=${MYSQL_ROOT_PASSWORD} -SLAVE_DATASOURCE_URL=${MASTER_DATASOURCE_URL} -SLAVE_DATASOURCE_USERNAME=${MASTER_DATASOURCE_USERNAME} -SLAVE_DATASOURCE_PASSWORD=${MASTER_DATASOURCE_PASSWORD} -REDIS_HOST=yudao-redis - -## admin -NODE_ENV=production -PUBLIC_PATH=/ -VUE_APP_TITLE=芋道管理系统 -VUE_APP_BASE_API=/prod-api -VUE_APP_APP_NAME=/ -VUE_APP_TENANT_ENABLE=true -VUE_APP_CAPTCHA_ENABLE=true -VUE_APP_DOC_ENABLE=true -VUE_APP_BAIDU_CODE=fadc1bd5db1a1d6f581df60a1807f8ab diff --git a/http-client.env.json b/http-client.env.json deleted file mode 100644 index 4a4cb52..0000000 --- a/http-client.env.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "local": { - "baseUrl": "http://127.0.0.1:48080/admin-api", - "token": "test1", - "adminTenentId": "1", - - "appApi": "http://127.0.0.1:48080/app-api", - "appToken": "test247", - "appTenentId": "1" - }, - "gateway": { - "baseUrl": "http://127.0.0.1:8888/admin-api", - "token": "test1", - "adminTenentId": "1", - - "appApi": "http://127.0.0.1:8888/app-api", - "appToken": "test1", - "appTenantId": "1" - } -} -- libgit2 0.21.4