Files
UserclassFront/.gitea/workflows/deploy.yml
T

93 lines
4.7 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: deploy-bschclass-front
# 前端部署(方案 B:不打包镜像,直接部署静态文件 + 软链接版本控制)
# 触发:push 到 main(已启用仓库 Actions,push 自动部署)/ 手动 Run workflow
# 核心:vue-cli-service build -> dist
# -> 拷贝到 /data/www/bschclass/releases/<version>/
# -> 原子切换 /data/www/bschclass/front 软链接指向新版本
# -> 保留最近 5 个版本,更早自动清理(秒级回滚)
# 不再构建/推送 nginx 镜像;Caddy 已改为 file_server(root=/srv/bschclass,由 /data/www/bschclass 挂载)。
# 依赖:160 宿主的 docker daemon(runner 已挂 docker.sock),且 runner valid_volumes 已放行 /data/www/**。无需 NEXUS secret。
# ⚠️ 前端用 node-sass(^6),必须用 node:16 构建;node:20 会因 node-sass 原生模块不兼容而构建失败。
on:
push:
branches: [main]
workflow_dispatch:
jobs:
build-and-deploy:
runs-on: ubuntu-latest
# docker:24 自带 docker CLI,复用宿主 docker daemon(act_runner 已挂载 docker.sock)。
# 切勿再声明 volumes: docker.sock(会报 Duplicate mount point)。
container:
image: docker:24
steps:
- name: Install git (alpine)
run: apk add --no-cache git
# 内网 Gitea 无法访问 github.com 拉取 actions/checkout,改为直接 clone 本仓库(main 分支)
- name: Checkout (manual, internal Gitea)
run: |
git clone --depth 1 --branch main http://192.168.10.160:3000/${GITHUB_REPOSITORY}.git /tmp/src
cp -a /tmp/src/. .
rm -rf /tmp/src
# 构建 + 部署:在 node:16 容器里完成(源码经 docker cp 传入,并挂载宿主 /data/www/bschclass)
- name: Build & Deploy (symlink versioning)
run: |
set -e
# 版本号:short sha + 时间戳
VERSION="$(echo ${GITHUB_SHA} | cut -c1-7)-$(date +%Y%m%d-%H%M)"
echo "Deploying version: $VERSION"
docker rm -f frontbuild 2>/dev/null || true
docker run -d --name frontbuild \
-e VERSION="$VERSION" \
-v /data/www/bschclass:/data/www/bschclass \
-w /build node:16 sleep 3600
# 源码拷入构建容器(绕过 act 工作区非宿主路径的坑,与 service 的 mavenbuild 一致)
docker cp "${PWD}/." frontbuild:/build/
docker exec frontbuild sh -c '
set -e
cd /build
# 去掉 Windows 专用 sass 二进制路径(Linux 容器内该路径无效,否则 build 报错)
# .npmrc 被 gitignore、CI 克隆下来没有它,故仅在存在时才删(缺失不报错)
if [ -f .npmrc ]; then sed -i "/SASS_BINARY_PATH/d" .npmrc; fi
# 用 npm install 而非 npm ci:仓库 package-lock.json 与 package.json 不同步
#(sortablejs 锁 1.10.2 但 package.json 要求 1.15.7),npm ci 会强校验同步而失败;
# npm install 会按 package.json 重新对齐 lock 并安装,避免阻塞部署。
npm install
npm run build
'
# 部署:首次把真实目录 front 迁入 releases/initial 并建软链;之后均为软链替换
docker exec frontbuild sh -c '
set -e
cd /build
# ---- 首次初始化:front 当前是真实目录,无法直接 ln -sfn 覆盖 ----
if [ ! -L /data/www/bschclass/front ]; then
mkdir -p /data/www/bschclass/releases
mv /data/www/bschclass/front /data/www/bschclass/releases/initial
# 相对软链:Caddy 容器内 /data/www/bschclass 挂在 /srv/bschclass,
# 绝对路径在容器内解析不到,必须用相对路径(相对 front 所在目录)
ln -sfn releases/initial /data/www/bschclass/front
echo "INIT: front -> releases/initial (保留上线前状态用于回滚)"
fi
mkdir -p /data/www/bschclass/releases/$VERSION
cp -r /build/dist/. /data/www/bschclass/releases/$VERSION/
# 原子切换:front 此时已是软链接,ln -sfn 直接替换指向(必须用相对路径)
ln -sfn releases/$VERSION /data/www/bschclass/front
echo "current symlink ->"; ls -la /data/www/bschclass/front
# 清理旧版本,保留最近 5 个(initial 也会被计入,最多保留 5 个含 initial)
cd /data/www/bschclass/releases
ls -1t | tail -n +6 | while read d; do echo "rm old: $d"; rm -rf "$d"; done
echo "remaining versions:"; ls -1t
'
docker rm -f frontbuild
echo "DEPLOY OK: $VERSION"