1 Commits
0.1 ... 1.0

Author SHA1 Message Date
e85c9f6086 ci: 优化ci脚本 2026-04-13 03:44:06 +08:00

View File

@@ -1,19 +1,25 @@
# 公共可复用工作流workflow_call。调用方传入node_version、yarn_version、project_dir # 公共可复用工作流workflow_callNode SPA 构建后通过 SSH + tar 部署到 Nginx
# 部署主机/用户/父路径、SSH 私钥从「调用方」仓库的 vars / secrets 读取(同仓 uses: ./... 时即本仓库配置)。
# #
# 调用方 ci.yml 示例: # 必选 inputsnode_version、yarn_version、project_dir
# 可选 inputsbuild_script默认 yarn build、build_output_dir默认 dist若以 / 开头会去掉首字符,如 /dist → dist
#
# 部署目标与认证DEPLOY_PATH、DEPLOY_HOST、DEPLOY_USER仓库 Variables、SSH_PRIVATE_KEYSecrets
# 由「调用方」仓库提供;同仓库 uses: ./.gitea/workflows/... 时即读取调用方本仓配置。
#
# 调用方工作流示例:
# jobs: # jobs:
# build: # deploy:
# uses: ./.gitea/workflows/node-spa-tar-deploy.reusable.yml@main # uses: ./.gitea/workflows/web-spa-deploy.yml@main
# with: # with:
# node_version: "22.14.0" # node_version: "22.14.0"
# yarn_version: "1.22.22" # yarn_version: "1.22.22"
# project_dir: "chat-one-web" # project_dir: "chat-one-web"
# build_script: "yarn build"
# build_output_dir: "dist"
# secrets: inherit # secrets: inherit
# #
# 调用方「工作流 → 变量」DEPLOY_PATH、DEPLOY_HOST、DEPLOY_USER # 远端站点根目录:${DEPLOY_PATH}/${project_dir}
# 调用方「工作流 → 密钥」SSH_PRIVATE_KEY # 仅当事件为 push 且分支为 main 或 master 时执行部署步骤Install OpenSSH client、Deploy to Nginx
# 远端发布目录 = ${DEPLOY_PATH}/${project_dir}
name: Reusable Node SPA + tar deploy name: Reusable Node SPA + tar deploy
@@ -32,6 +38,16 @@ on:
description: "站点子目录(相对 DEPLOY_PATH如 chat-one-web" description: "站点子目录(相对 DEPLOY_PATH如 chat-one-web"
required: true required: true
type: string 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: jobs:
build: build:
@@ -111,14 +127,8 @@ jobs:
- name: Install - name: Install
run: yarn install --frozen-lockfile run: yarn install --frozen-lockfile
- name: Prettier check
run: yarn format:check
- name: ESLint
run: yarn lint
- name: Build - name: Build
run: yarn build run: ${{ inputs.build_script }}
- name: Install OpenSSH client - name: Install OpenSSH client
if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master') if: github.event_name == 'push' && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master')
@@ -141,12 +151,18 @@ jobs:
env: env:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
PROJECT_DIR: ${{ inputs.project_dir }} PROJECT_DIR: ${{ inputs.project_dir }}
BUILD_OUT: ${{ inputs.build_output_dir }}
run: | run: |
set -e set -e
: "${DEPLOY_PATH:?DEPLOY_PATH (vars) is not set}" : "${DEPLOY_PATH:?DEPLOY_PATH (vars) is not set}"
: "${DEPLOY_HOST:?DEPLOY_HOST (vars) is not set}" : "${DEPLOY_HOST:?DEPLOY_HOST (vars) is not set}"
: "${DEPLOY_USER:?DEPLOY_USER (vars) is not set}" : "${DEPLOY_USER:?DEPLOY_USER (vars) is not set}"
: "${PROJECT_DIR:?project_dir 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}" REMOTE_ROOT="${DEPLOY_PATH}/${PROJECT_DIR}"
mkdir -p ~/.ssh mkdir -p ~/.ssh
chmod 700 ~/.ssh chmod 700 ~/.ssh
@@ -155,4 +171,4 @@ jobs:
ssh-keyscan -H "$DEPLOY_HOST" >> ~/.ssh/known_hosts ssh-keyscan -H "$DEPLOY_HOST" >> ~/.ssh/known_hosts
SSH=(ssh -i ~/.ssh/id_deploy -o IdentitiesOnly=yes -o StrictHostKeyChecking=yes) 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" "${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}'"