feat(ci): add preview cleanup workflow for closed PRs
This commit is contained in:
@@ -0,0 +1,118 @@
|
|||||||
|
name: Preview Cleanup
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types:
|
||||||
|
- closed
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- develop
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
|
jobs:
|
||||||
|
cleanup-preview:
|
||||||
|
name: Cleanup Preview Environment
|
||||||
|
runs-on: runtime-builder
|
||||||
|
timeout-minutes: 10
|
||||||
|
steps:
|
||||||
|
- name: Extract PR number
|
||||||
|
shell: sh
|
||||||
|
run: |
|
||||||
|
set -eu
|
||||||
|
PR_NUMBER=$(echo "$GITHUB_REF" | sed 's|refs/pull/||; s|/.*||')
|
||||||
|
echo "PR_NUMBER=$PR_NUMBER" >> $GITHUB_ENV
|
||||||
|
echo "PR number: $PR_NUMBER"
|
||||||
|
echo "Preview dir: /var/www/preview/pr-${PR_NUMBER}"
|
||||||
|
|
||||||
|
- name: Install SSH client
|
||||||
|
shell: sh
|
||||||
|
run: |
|
||||||
|
set -eu
|
||||||
|
apt-get update -qq && apt-get install -y -qq openssh-client >/dev/null 2>&1
|
||||||
|
echo "openssh-client installed"
|
||||||
|
|
||||||
|
- name: Remove preview directory from server
|
||||||
|
shell: sh
|
||||||
|
env:
|
||||||
|
STAGING_SSH_HOST: ${{ secrets.STAGING_SSH_HOST }}
|
||||||
|
STAGING_SSH_USER: ${{ secrets.STAGING_SSH_USER }}
|
||||||
|
STAGING_SSH_PORT: ${{ secrets.STAGING_SSH_PORT }}
|
||||||
|
STAGING_SSH_KEY: ${{ secrets.STAGING_SSH_KEY }}
|
||||||
|
run: |
|
||||||
|
set -eux
|
||||||
|
staging_host="${STAGING_SSH_HOST:-47.98.113.167}"
|
||||||
|
staging_user="${STAGING_SSH_USER:-root}"
|
||||||
|
staging_port="${STAGING_SSH_PORT:-22222}"
|
||||||
|
preview_dir="/var/www/preview/pr-${PR_NUMBER}"
|
||||||
|
|
||||||
|
mkdir -p ~/.ssh
|
||||||
|
|
||||||
|
# 查找可用的SSH密钥
|
||||||
|
key_path=""
|
||||||
|
if [ -f /root/.ssh/xiaoxia_runtime_builder ]; then
|
||||||
|
key_path="/root/.ssh/xiaoxia_runtime_builder"
|
||||||
|
echo "Using key: $key_path (builder key)"
|
||||||
|
elif [ -f "$HOME/.ssh/xiaoxia_runtime_builder" ]; then
|
||||||
|
key_path="$HOME/.ssh/xiaoxia_runtime_builder"
|
||||||
|
echo "Using key: $key_path (home key)"
|
||||||
|
elif [ -n "${STAGING_SSH_KEY:-}" ]; then
|
||||||
|
key_path="$HOME/.ssh/id_ed25519"
|
||||||
|
printf '%s\n' "$STAGING_SSH_KEY" > "$key_path"
|
||||||
|
chmod 600 "$key_path"
|
||||||
|
echo "Using key from STAGING_SSH_KEY secret"
|
||||||
|
else
|
||||||
|
echo "ERROR: No SSH key available"
|
||||||
|
ls -la ~/.ssh/ 2>/dev/null || true
|
||||||
|
ls -la /root/.ssh/ 2>/dev/null || true
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
ssh-keyscan -p "$staging_port" -H "$staging_host" >> ~/.ssh/known_hosts 2>/dev/null
|
||||||
|
echo "SSH keyscan done"
|
||||||
|
|
||||||
|
# 测试SSH连接
|
||||||
|
ssh -p "$staging_port" -i "$key_path" -o StrictHostKeyChecking=no "${staging_user}@${staging_host}" "echo SSH_CONNECTION_OK && hostname"
|
||||||
|
echo "SSH connection verified"
|
||||||
|
|
||||||
|
# 检查目录是否存在
|
||||||
|
DIR_EXISTS=$(ssh -p "$staging_port" -i "$key_path" -o StrictHostKeyChecking=no "${staging_user}@${staging_host}" \
|
||||||
|
"if [ -d '${preview_dir}' ]; then echo 'yes'; else echo 'no'; fi")
|
||||||
|
|
||||||
|
if [ "$DIR_EXISTS" = "yes" ]; then
|
||||||
|
echo "Removing preview directory: ${preview_dir}"
|
||||||
|
ssh -p "$staging_port" -i "$key_path" -o StrictHostKeyChecking=no "${staging_user}@${staging_host}" \
|
||||||
|
"rm -rf ${preview_dir} && echo 'Preview directory removed successfully'"
|
||||||
|
echo "Cleanup completed: ${preview_dir}"
|
||||||
|
else
|
||||||
|
echo "Preview directory does not exist: ${preview_dir}, nothing to clean up"
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: Comment cleanup notice on PR
|
||||||
|
if: success()
|
||||||
|
shell: sh
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ github.token }}
|
||||||
|
run: |
|
||||||
|
set -eu
|
||||||
|
PR_NUMBER=$(echo "$GITHUB_REF" | sed 's|refs/pull/||; s|/.*||')
|
||||||
|
|
||||||
|
COMMENT_BODY=$(python3 -c "
|
||||||
|
import json, os
|
||||||
|
pr_num = os.environ['PR_NUMBER']
|
||||||
|
body = f'''🗑️ **预览环境已清理**
|
||||||
|
|
||||||
|
PR #{pr_num} 已关闭或合并,对应的预览环境已被清理。
|
||||||
|
|
||||||
|
> 如有需要,可以重新打开 PR 来重新生成预览环境。
|
||||||
|
'''
|
||||||
|
print(json.dumps({'body': body}))
|
||||||
|
")
|
||||||
|
|
||||||
|
API_URL="${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/issues/${PR_NUMBER}/comments"
|
||||||
|
curl -s -X POST \
|
||||||
|
-H "Authorization: token ${GITHUB_TOKEN}" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "$COMMENT_BODY" \
|
||||||
|
"$API_URL" \
|
||||||
|
> /dev/null
|
||||||
|
echo "Cleanup comment posted"
|
||||||
Reference in New Issue
Block a user