This commit is contained in:
2026-04-24 20:30:52 +08:00
commit 704bc34625
152 changed files with 45612 additions and 0 deletions

85
.github/workflows/deploy.yml vendored Normal file
View File

@@ -0,0 +1,85 @@
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: actions/checkout@v4
# 2. Install pnpm (Node >= 20)
- name: Install pnpm
uses: pnpm/action-setup@v2
with:
version: 8 # Alternatively use latest
- name: Set Up Node.js
uses: 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
continue-on-error: true
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
if: always()
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 }}"

41
.github/workflows/rollback.yml vendored Normal file
View File

@@ -0,0 +1,41 @@
name: Switch/Rollback Version
on:
workflow_dispatch:
inputs:
version:
description: "enter the version to switch to (example: v1.0.2)"
required: true
default: ""
jobs:
switch-version:
runs-on: ubuntu-latest
steps:
- name: Execute remote SSH commands
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SERVER_SSH_KEY }}
script: |
REMOTE_BASE=${{ secrets.REMOTE_PATH }}
RELEASES_PATH="$REMOTE_BASE/releases"
CURRENT_PATH="$REMOTE_BASE/current"
TARGET_VERSION="${{ github.event.inputs.version }}"
echo ">>> Switching to version: $TARGET_VERSION"
# 1. Check if the target directory exists
if [ -d "$RELEASES_PATH/$TARGET_VERSION" ]; then
# 2. Modify symbolic link (use -n and -f to ensure atomic replacement of directory links)
ln -sfn "$RELEASES_PATH/$TARGET_VERSION" "$CURRENT_PATH"
echo ">>> Switching to version: $TARGET_VERSION successfully"
ls -l "$CURRENT_PATH"
else
echo ">>> Error: Version $TARGET_VERSION does not exist in $RELEASES_PATH"
echo ">>> Existing version list:"
ls -1 "$RELEASES_PATH"
exit 1
fi