name: Pro-CI-CD-Pipeline on: push: tags: - "v*" # Only triggered when pushing a tag starting with v (for example v1.1.0) jobs: build-and-deploy: runs-on: ubuntu-latest steps: # 1. Checkout code - name: Checkout Code uses: https://gitee.com/mirror-actions/checkout@v4 # 2. Install pnpm (Node >= 20) - name: Install pnpm uses: https://gitee.com/youtellme/pnpm-action-setup@v2 with: version: 8 # Alternatively use latest - name: Set Up Node.js uses: https://gitee.com/mirror-actions/setup-node@v4 with: node-version: 20 cache: "pnpm" # 3. Install dependencies and build the project - name: Install Dependencies and Build run: | pnpm install pnpm run build env: # Inject Sentry init environment variables to UmiJS (Ant Design Pro) UMI_APP_SENTRY_RELEASE: ${{ github.ref_name }} UMI_APP_SENTRY_DSN: ${{ secrets.SENTRY_DSN }} # 4. Upload SourceMaps to 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: "~/" # Match online deployed JS paths # 5. Clean up local source maps after deployment - name: Clean SourceMaps run: find dist -name "*.map" -type f -delete # 6. Install SSH key - name: Install SSH Key uses: shimataro/ssh-key-action@v2 with: key: ${{ secrets.SERVER_SSH_KEY }} known_hosts: unnecessary # Automatically confirm first connection if_key_exists: replace # 7. Deploy to server with atomic switch (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 ">>> Creating remote directory: $RELEASES_PATH" ssh -o StrictHostKeyChecking=no ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} "mkdir -p $RELEASES_PATH" echo ">>> Uploading build artifacts (rsync)..." # Use rsync to sync dist directory to server releases version directory rsync -avz --delete ./dist/ ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:$RELEASES_PATH echo ">>> Updating server soft link (ln -snf)..." # Atomic switch soft link 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 }}"