Files
aca-classroom-front/.gitea/workflows/build.yml
T
wanghu 412c23c498
build / build (push) Successful in 4m4s
node构建
2026-10-20 10:00:50 +08:00

109 lines
5.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: build
# 前端应用 CI:构建 → 打包 zip → 推 Nexus raw → 通知 projman 建档
# 触发:push 到 main / 手动 Run workflow
# 链路:clone 源码 -> node 容器 npm ci + npm run build -> 打包 dist 为 zip -> 推 Nexus raw -> 通知 projman 建档
# 依赖仓库 Secrets:DEPLOY_TOKEN(webhook 鉴权)、NEXUS_USER / NEXUS_PASSWORD(上传 zip 到 Nexus raw)
# 注意:CI 构建后自动建档(status=pending),前端发布仍由用户在「前端发布」Tab 点部署触发
# 内网约束:job 容器(docker:24)无外网,apk add 不可用——git 用镜像自带;zip 用 git archive 生成;
# curl 用一次性 node:20 帮手容器执行(node:20 为构建步骤必需镜像,宿主上必已存在)
on:
push:
branches: [ main ]
workflow_dispatch:
jobs:
build:
runs-on: ubuntu-latest
container:
image: docker:24
options: --network infra-infra-net
steps:
# 内网 Gitea 无法访问 GitHub 拉 actions/checkout,手动 clone 本仓库(git 为 docker:24 镜像自带)
- name: 拉取源码(内网无 GitHub,手动 clone 本仓库)
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
git clone --depth 1 --branch main "http://x-access-token:${GITHUB_TOKEN}@gitea.yunhaixingtong.com/${{ github.repository }}.git" /tmp/src
cp -a /tmp/src/. .
rm -rf /tmp/src
# 取提交备注首行,脱去换行/双引号/反斜杠(避免破坏 webhook JSON),截断到 200 字符
COMMIT_MSG=$(git log -1 --pretty=%s | tr '\n' ' ' | sed 's/["\\]/ /g' | cut -c1-200)
echo "COMMIT_MSG=${COMMIT_MSG}" >> "$GITHUB_ENV"
# 前端构建:起独立 node 容器(通过 docker.sock 调宿主 dockerd)
# node:20 镜像预装 npm,npm ci 按 lockfile 安装依赖
- name: 构建前端(node 容器)
run: |
set -e
docker rm -f frontbuild 2>/dev/null || true
docker run -d --name frontbuild -w /build node:20 sleep 3600
docker cp "${PWD}/." frontbuild:/build/
docker exec frontbuild sh -c '
set -e
cd /build
if [ -f .npmrc ]; then sed -i "/SASS_BINARY_PATH/d" .npmrc; fi
npm ci
npm run build
'
echo "=== dist 产物 ==="
docker exec frontbuild sh -c 'ls -la /build/dist/ | head -20'
# 从容器 cp dist 到宿主工作目录
docker cp frontbuild:/build/dist ./dist
docker rm -f frontbuild
echo "BUILD CHECK OK"
# 打包 dist → zip(job 容器无外网、装不了 zip 命令:把 dist 拷进临时目录做成一次性 git 仓,
# 用 git 自带的 archive zip 后端打包,zip 根目录直接是 html/css/js 文件,与 zip -r 产物结构一致)
- name: 打包产物
run: |
TAG=$(echo "$GITHUB_SHA" | cut -c1-8)
ZIP_FILE="aca-classroom-front-${TAG}.zip"
WORKDIR="$(pwd)"
rm -rf /tmp/zipsrc && mkdir -p /tmp/zipsrc
cp -a dist/. /tmp/zipsrc/
cd /tmp/zipsrc
git init -q -b main .
git add -A -f .
git -c user.email=ci@localhost -c user.name=ci commit -qm pkg
git archive --format=zip -o "${WORKDIR}/${ZIP_FILE}" HEAD
cd "${WORKDIR}"
rm -rf /tmp/zipsrc
echo "ZIP_FILE=${ZIP_FILE}" >> "$GITHUB_ENV"
echo "TAG=${TAG}" >> "$GITHUB_ENV"
ls -la "${ZIP_FILE}"
# 上传到 Nexus raw 仓库(job 容器无 curl:起一次性 node:20 帮手容器执行上传,
# 入 infra-infra-net 与 Nexus 同网;产物经 docker cp 送入,避开宿主/容器路径挂载差异)
- name: 上传产物到 Nexus
env:
NEXUS_USER: ${{ secrets.NEXUS_USER }}
NEXUS_PASSWORD: ${{ secrets.NEXUS_PASSWORD }}
run: |
set -e
NEXUS_URL="http://nexus.yunhaixingtong.com:8081/repository/front-hosted/${ZIP_FILE}"
# -f:HTTP >=400 时 curl 以非零退出,仓库不存在/认证失败必须让 job 变红,否则建档的是不存在的 URL
# NEXUS_URL 是脚本内赋值的 shell 变量(未 export),裸 -e NEXUS_URL 取不到值会传空,必须显式展开传入
docker rm -f frontcurl 2>/dev/null || true
docker run -d --name frontcurl --network infra-infra-net -w /w \
-e NEXUS_USER -e NEXUS_PASSWORD -e ZIP_FILE -e "NEXUS_URL=${NEXUS_URL}" node:20 sleep 300
docker cp "${ZIP_FILE}" frontcurl:/w/
docker exec frontcurl sh -c 'curl -sSf -X PUT -u "${NEXUS_USER}:${NEXUS_PASSWORD}" --upload-file "/w/${ZIP_FILE}" "${NEXUS_URL}"'
docker rm -f frontcurl
echo "NEXUS_URL=${NEXUS_URL}" >> "$GITHUB_ENV"
echo "uploaded to ${NEXUS_URL}"
# 通知 projman:webhook 收到后建档(type=front, status=pending),部署由用户在「前端发布」Tab 手动触发
# (job 容器无 curl,同上用一次性 node:20 帮手容器执行;token 经 env 传入,不出现在命令行参数里)
- name: 通知 projman 建档
env:
DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }}
run: |
set -e
docker rm -f frontcurl 2>/dev/null || true
docker run -d --name frontcurl --network infra-infra-net \
-e DEPLOY_TOKEN -e TAG -e GITHUB_SHA -e COMMIT_MSG -e NEXUS_URL node:20 sleep 300
docker exec frontcurl sh -c 'curl -sSf -X POST "http://192.168.10.160:8090/projman/api/deploy/webhook" -H "Content-Type: application/json" -H "X-Deploy-Token: ${DEPLOY_TOKEN}" -d "{\"app\":\"aca-classroom\",\"front\":\"front\",\"tag\":\"${TAG}\",\"sha\":\"${GITHUB_SHA}\",\"message\":\"${COMMIT_MSG}\",\"nexusUrl\":\"${NEXUS_URL}\"}"'
docker rm -f frontcurl