From bf658e1d3bdfe930f1677cf3f9ca1fc78c03440f Mon Sep 17 00:00:00 2001 From: kk <875203880@qq.com> Date: Mon, 29 Jun 2026 14:18:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E9=83=A8=E7=BD=B2=E8=84=9A?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/deploy.yaml | 135 +++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 .gitea/workflows/deploy.yaml diff --git a/.gitea/workflows/deploy.yaml b/.gitea/workflows/deploy.yaml new file mode 100644 index 0000000..91bc3a4 --- /dev/null +++ b/.gitea/workflows/deploy.yaml @@ -0,0 +1,135 @@ +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: "${CLONE_SSH#*:}" + 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 }}" + # 请根据你的实际构建输出路径调整 + H5_SOURCE_DIR="dist/build/h5" + WEB_ROOT="${{ vars.PROJECT_DIR }}" + + echo "部署到: $TARGET" + echo "源目录: $H5_SOURCE_DIR" + echo "目标目录: $WEB_ROOT" + + # 检查构建目录是否存在 + if [ ! -d "$H5_SOURCE_DIR" ]; then + echo "错误: 构建目录 $H5_SOURCE_DIR 不存在,请检查构建命令是否正确" + exit 1 + fi + + # 使用 rsync 同步文件 + # 修正: 将 -e 参数移到前面 + rsync -rltzv --delete --chmod=Du=rwx,Dgo=rx,Fu=rw,Fgo=r \ + -e "ssh -i ~/.ssh/id_rsa -o StrictHostKeyChecking=no" \ + "$H5_SOURCE_DIR/" \ + "root@${TARGET}:${WEB_ROOT}/" + + echo "H5 部署完成" + echo "${{ steps.detect.outputs.env }} 环境部署成功!" \ No newline at end of file