149 lines
5.3 KiB
YAML
149 lines
5.3 KiB
YAML
name: Uni-app H5 Deploy (Prod + Staging)
|
|
|
|
on:
|
|
release:
|
|
types: [published]
|
|
|
|
jobs:
|
|
deploy:
|
|
runs-on: ubuntu-latest
|
|
|
|
steps:
|
|
###############################################
|
|
# 0. 检查发布类型和分支权限
|
|
###############################################
|
|
- name: Check Release Type and Branch Permission
|
|
id: detect
|
|
run: |
|
|
BRANCH="${{ github.event.release.target_commitish }}"
|
|
IS_PRERELEASE="${{ github.event.release.prerelease }}"
|
|
|
|
echo "当前分支: $BRANCH"
|
|
echo "是否为预发布: $IS_PRERELEASE"
|
|
echo "发布标签: ${{ github.event.release.tag_name }}"
|
|
|
|
# 如果勾选了"标记为预发布"
|
|
if [ "$IS_PRERELEASE" = "true" ]; then
|
|
echo "检测到预发布版本"
|
|
if [ "$BRANCH" != "develop" ]; then
|
|
echo "错误: 预发布只能从 develop 分支发布"
|
|
echo "当前分支: $BRANCH"
|
|
exit 1
|
|
fi
|
|
echo "env=staging" >> "$GITHUB_OUTPUT"
|
|
echo "target=${{ vars.STG_WEB_HOST }}" >> "$GITHUB_OUTPUT"
|
|
echo "部署环境: 预发布环境"
|
|
echo "目标服务器: ${{ vars.STG_WEB_HOST }}"
|
|
else
|
|
# 未勾选"标记为预发布",为正式发布
|
|
echo "检测到正式发布版本"
|
|
if [ "$BRANCH" != "main" ]; then
|
|
echo "错误: 正式发布只能从 main 分支发布"
|
|
echo "当前分支: $BRANCH"
|
|
exit 1
|
|
fi
|
|
echo "env=production" >> "$GITHUB_OUTPUT"
|
|
echo "target=${{ vars.PRD_WEB_HOST }}" >> "$GITHUB_OUTPUT"
|
|
echo "部署环境: 生产环境"
|
|
echo "目标服务器: ${{ vars.PRD_WEB_HOST }}"
|
|
fi
|
|
|
|
###############################################
|
|
# 1. 设置 SSH 密钥 & 主机信任
|
|
###############################################
|
|
- name: Setup SSH Key
|
|
run: |
|
|
# 1. 确保 .ssh 目录存在且权限正确
|
|
mkdir -p ~/.ssh
|
|
chmod 700 ~/.ssh
|
|
|
|
# 2. 将 Gitea 密钥里的私钥写入文件
|
|
echo "${{ secrets.PRD_SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519
|
|
chmod 600 ~/.ssh/id_ed25519
|
|
|
|
# 3. 生成并写入 SSH Config 配置文件
|
|
cat > ~/.ssh/config << EOF
|
|
Host git-host
|
|
HostName 101.200.86.98
|
|
User kk
|
|
StrictHostKeyChecking no
|
|
UserKnownHostsFile /dev/null
|
|
IdentityFile ~/.ssh/id_ed25519
|
|
EOF
|
|
chmod 600 ~/.ssh/config
|
|
|
|
echo "SSH 配置完成"
|
|
|
|
###############################################
|
|
# 2. Checkout 代码
|
|
###############################################
|
|
- name: Checkout Code via SSH
|
|
env:
|
|
CLONE_SSH: ${{ vars.CLONE_SSH }}
|
|
TAG_NAME: ${{ github.event.release.tag_name }}
|
|
# 直接使用服务器上的 Gitea 仓库物理路径
|
|
LOCAL_REPO_PATH: /usr/local/bin/data/gitea-repositories/kellan/consumer-front.git
|
|
run: |
|
|
set -e
|
|
# 使用 --no-hardlinks 在本机通过本地路径克隆,完全避开 SSH 和所有权检查
|
|
git clone --depth=1 --branch "$TAG_NAME" --no-hardlinks "$LOCAL_REPO_PATH" .
|
|
|
|
###############################################
|
|
# 3. 安装依赖 & 构建 Uni-app (H5)
|
|
###############################################
|
|
- name: Install dependencies and Build H5
|
|
env:
|
|
DEPLOY_ENV: ${{ steps.detect.outputs.env }}
|
|
run: |
|
|
set -e
|
|
# pnpm真实路径
|
|
PNPM_PATH="/root/.nvm/versions/node/v20.20.2/bin/pnpm"
|
|
|
|
echo "构建环境: DEPLOY_ENV=$DEPLOY_ENV"
|
|
|
|
# 1. 配置镜像并安装依赖
|
|
$PNPM_PATH config set registry https://registry.npmmirror.com
|
|
$PNPM_PATH install --frozen-lockfile
|
|
|
|
# 2. 执行构建
|
|
$PNPM_PATH run build:h5
|
|
|
|
###############################################
|
|
# 4. 上传 dist 到目标服务器
|
|
###############################################
|
|
- name: Upload dist to server
|
|
run: |
|
|
TARGET="${{ steps.detect.outputs.target }}"
|
|
ENV_NAME="${{ steps.detect.outputs.env }}"
|
|
# 请根据你的实际构建输出路径调整
|
|
H5_SOURCE_DIR="dist/build/h5"
|
|
|
|
# 根据发布类型选择项目路径
|
|
if [ "$ENV_NAME" = "staging" ]; then
|
|
WEB_ROOT="${{ vars.STG_PROJECT_DIR }}"
|
|
else
|
|
WEB_ROOT="${{ vars.PROJECT_DIR }}"
|
|
fi
|
|
|
|
echo "部署到: $TARGET"
|
|
echo "源目录: $H5_SOURCE_DIR"
|
|
echo "目标目录: $WEB_ROOT"
|
|
|
|
# 检查构建目录是否存在
|
|
if [ ! -d "$H5_SOURCE_DIR" ]; then
|
|
echo "错误: 构建目录 $H5_SOURCE_DIR 不存在,请检查构建命令是否正确"
|
|
exit 1
|
|
fi
|
|
|
|
# 确保构建产物可读
|
|
chmod -R a+r "$H5_SOURCE_DIR"
|
|
|
|
# 使用 rsync 同步文件
|
|
rsync -rltvz --delete \
|
|
--no-perms --no-times --no-owner --no-group \
|
|
-e "ssh -i ~/.ssh/id_ed25519 -o StrictHostKeyChecking=no" \
|
|
"$H5_SOURCE_DIR/" \
|
|
"root@${TARGET}:${WEB_ROOT}/"
|
|
|
|
echo "H5 部署完成"
|
|
echo "${{ steps.detect.outputs.env }} 环境部署成功!" |