From e85c9f60861171a842d1a0b3c5723790995b770c Mon Sep 17 00:00:00 2001 From: alboped Date: Mon, 13 Apr 2026 03:44:06 +0800 Subject: [PATCH] =?UTF-8?q?ci:=20=E4=BC=98=E5=8C=96ci=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/web-spa-deploy.yml | 48 +++++++++++++++++++---------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/.gitea/workflows/web-spa-deploy.yml b/.gitea/workflows/web-spa-deploy.yml index 1591bab..0804cbb 100644 --- a/.gitea/workflows/web-spa-deploy.yml +++ b/.gitea/workflows/web-spa-deploy.yml @@ -1,19 +1,25 @@ -# 公共可复用工作流(workflow_call)。调用方传入:node_version、yarn_version、project_dir。 -# 部署主机/用户/父路径、SSH 私钥从「调用方」仓库的 vars / secrets 读取(同仓 uses: ./... 时即本仓库配置)。 +# 公共可复用工作流(workflow_call):Node SPA 构建后通过 SSH + tar 部署到 Nginx。 # -# 调用方 ci.yml 示例: +# 必选 inputs:node_version、yarn_version、project_dir +# 可选 inputs:build_script(默认 yarn build)、build_output_dir(默认 dist;若以 / 开头会去掉首字符,如 /dist → dist) +# +# 部署目标与认证:DEPLOY_PATH、DEPLOY_HOST、DEPLOY_USER(仓库 Variables)、SSH_PRIVATE_KEY(Secrets) +# 由「调用方」仓库提供;同仓库 uses: ./.gitea/workflows/... 时即读取调用方本仓配置。 +# +# 调用方工作流示例: # jobs: -# build: -# uses: ./.gitea/workflows/node-spa-tar-deploy.reusable.yml@main +# deploy: +# uses: ./.gitea/workflows/web-spa-deploy.yml@main # with: # node_version: "22.14.0" # yarn_version: "1.22.22" # project_dir: "chat-one-web" +# build_script: "yarn build" +# build_output_dir: "dist" # secrets: inherit # -# 调用方「工作流 → 变量」:DEPLOY_PATH、DEPLOY_HOST、DEPLOY_USER -# 调用方「工作流 → 密钥」:SSH_PRIVATE_KEY -# 远端发布目录 = ${DEPLOY_PATH}/${project_dir} +# 远端站点根目录:${DEPLOY_PATH}/${project_dir} +# 仅当事件为 push 且分支为 main 或 master 时执行部署步骤(Install OpenSSH client、Deploy to Nginx)。 name: Reusable Node SPA + tar deploy @@ -32,6 +38,16 @@ on: description: "站点子目录(相对 DEPLOY_PATH,如 chat-one-web)" required: true type: string + build_script: + description: "构建命令(单行 shell,如 yarn build)" + required: false + type: string + default: "yarn build" + build_output_dir: + description: "构建产物目录(相对仓库根;若以 / 开头会去掉首字符 /,如 /dist → dist)" + required: false + type: string + default: "dist" jobs: build: @@ -111,14 +127,8 @@ jobs: - name: Install run: yarn install --frozen-lockfile - - name: Prettier check - run: yarn format:check - - - name: ESLint - run: yarn lint - - name: Build - run: yarn build + run: ${{ inputs.build_script }} - name: Install OpenSSH client if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master') @@ -141,12 +151,18 @@ jobs: env: SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} PROJECT_DIR: ${{ inputs.project_dir }} + BUILD_OUT: ${{ inputs.build_output_dir }} run: | set -e : "${DEPLOY_PATH:?DEPLOY_PATH (vars) is not set}" : "${DEPLOY_HOST:?DEPLOY_HOST (vars) is not set}" : "${DEPLOY_USER:?DEPLOY_USER (vars) is not set}" : "${PROJECT_DIR:?project_dir is not set}" + OUT="${BUILD_OUT#/}" + if [ ! -d "$OUT" ]; then + echo "构建产物目录不存在: $OUT(请检查 build_output_dir 与构建脚本)" >&2 + exit 1 + fi REMOTE_ROOT="${DEPLOY_PATH}/${PROJECT_DIR}" mkdir -p ~/.ssh chmod 700 ~/.ssh @@ -155,4 +171,4 @@ jobs: ssh-keyscan -H "$DEPLOY_HOST" >> ~/.ssh/known_hosts SSH=(ssh -i ~/.ssh/id_deploy -o IdentitiesOnly=yes -o StrictHostKeyChecking=yes) "${SSH[@]}" "${DEPLOY_USER}@${DEPLOY_HOST}" "mkdir -p '${REMOTE_ROOT}' && find '${REMOTE_ROOT}' -mindepth 1 -delete" - tar czf - -C dist . | "${SSH[@]}" "${DEPLOY_USER}@${DEPLOY_HOST}" "tar xzf - -C '${REMOTE_ROOT}'" + tar czf - -C "$OUT" . | "${SSH[@]}" "${DEPLOY_USER}@${DEPLOY_HOST}" "tar xzf - -C '${REMOTE_ROOT}'"