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 run: | set -e # pnpm真实路径 PNPM_PATH="/root/.nvm/versions/node/v20.20.2/bin/pnpm" # 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 }} 环境部署成功!"