# 1. 准备工作:配置 GitHub Secrets # 在你的 GitHub 仓库中,进入 Settings -> Secrets and variables -> Actions,添加以下 Repository secrets: # SERVER_HOST: 你的服务器 IP。 # SERVER_USER: 服务器用户名(如 root)。 # SERVER_SSH_KEY: 你的 SSH 私钥(id_rsa 的内容)。 # GLITCHTIP_URL: 你的 GlitchTip 域名(如 https://glitchtip.example.com/)。 # GLITCHTIP_ORG: GlitchTip 里的组织 Slug。 # GLITCHTIP_PROJECT: GlitchTip 里的项目 Slug。 # GLITCHTIP_TOKEN: GlitchTip 的 API Auth Token。 # REMOTE_PATH: 服务器部署根路径(如 /www/wwwroot/alert)。 # 2. 配置 GitHub Actions # 在你的 GitHub 仓库中,进入 Actions -> Workflows,创建一个新的 Workflow 文件,例如 deploy.yml。 name: Pro-CI-CD-Pipeline on: push: tags: - "v*" # 仅当推送 v 开头的 tag 时触发 (例如 v1.1.0) jobs: build-and-deploy: runs-on: ubuntu-latest steps: # 1. 检出代码 - name: Checkout Code uses: actions/checkout@v4 # 2. 安装 pnpm (Node >= 20) - name: Install pnpm uses: pnpm/action-setup@v2 with: version: 8 # 或者使用 latest - name: Set Up Node.js uses: actions/setup-node@v4 with: node-version: 20 cache: "pnpm" # 3. 安装依赖并执行打包 - name: Install Dependencies and Build run: | pnpm install pnpm run build env: # 注入版本号给 UmiJS (Ant Design Pro) UMI_APP_SENTRY_RELEASE: ${{ github.ref_name }} # 4. 上传 SourceMap 到 GlitchTip - name: Upload SourceMaps to GlitchTip uses: getsentry/action-release@v1 env: SENTRY_AUTH_TOKEN: ${{ secrets.GLITCHTIP_TOKEN }} SENTRY_URL: ${{ secrets.GLITCHTIP_URL }} SENTRY_ORG: ${{ secrets.GLITCHTIP_ORG }} SENTRY_PROJECT: ${{ secrets.GLITCHTIP_PROJECT }} with: version: ${{ github.ref_name }} sourcemaps: "./dist" url_prefix: "~/" # 匹配线上 JS 路径 # 5. 安全清理:删除本地打包后的 .map 文件 - name: Clean SourceMaps run: find dist -name "*.map" -type f -delete # 6. 配置 SSH 密钥 - name: Install SSH Key uses: shimataro/ssh-key-action@v2 with: key: ${{ secrets.SERVER_SSH_KEY }} known_hosts: unnecessary # 第一次连接自动确认 if_key_exists: replace # 7. 远程原子化部署 (Atomic Deployment) - name: Deploy to Server run: | VERSION=${{ github.ref_name }} REMOTE_BASE=${{ secrets.REMOTE_PATH }} RELEASES_PATH="$REMOTE_BASE/releases/$VERSION" CURRENT_PATH="$REMOTE_BASE/current" echo ">>> 正在创建远程目录: $RELEASES_PATH" ssh -o StrictHostKeyChecking=no ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} "mkdir -p $RELEASES_PATH" echo ">>> 正在上传打包产物 (rsync)..." # 使用 rsync 同传 dist 目录内容到 releases 下的版本目录 rsync -avz --delete ./dist/ ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:$RELEASES_PATH echo ">>> 正在更新服务器软链接 (ln -snf)..." # 原子化切换软链接 ssh ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} "ln -snf $RELEASES_PATH $CURRENT_PATH" - name: Success Notification run: echo "🎉 Version ${{ github.ref_name }} successfully deployed to ${{ secrets.SERVER_HOST }}"