diff --git a/.gitea/workflows/preview-cleanup.yml b/.gitea/workflows/preview-cleanup.yml index 2302fa00f..41f1900ef 100644 --- a/.gitea/workflows/preview-cleanup.yml +++ b/.gitea/workflows/preview-cleanup.yml @@ -28,7 +28,14 @@ jobs: shell: sh run: | set -eu - apt-get update -qq && apt-get install -y -qq openssh-client >/dev/null 2>&1 + if command -v apk >/dev/null 2>&1; then + apk add --no-cache openssh-client >/dev/null 2>&1 + elif command -v apt-get >/dev/null 2>&1; then + apt-get update -qq && apt-get install -y -qq openssh-client >/dev/null 2>&1 + else + echo "ERROR: No package manager found" + exit 1 + fi echo "openssh-client installed" - name: Remove preview directory from server @@ -95,18 +102,9 @@ jobs: run: | set -eu PR_NUMBER=$(echo "$GITHUB_REF" | sed 's|refs/pull/||; s|/.*||') + export PR_NUMBER - COMMENT_BODY=$(python3 -c " - import json, os - pr_num = os.environ['PR_NUMBER'] - body = f'''🗑️ **预览环境已清理** - -PR #{pr_num} 已关闭或合并,对应的预览环境已被清理。 - -> 如有需要,可以重新打开 PR 来重新生成预览环境。 -''' - print(json.dumps({'body': body})) - ") + COMMENT_BODY=$(python3 scripts/ci/preview_comment.py cleanup) API_URL="${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/issues/${PR_NUMBER}/comments" curl -s -X POST \ @@ -116,3 +114,4 @@ PR #{pr_num} 已关闭或合并,对应的预览环境已被清理。 "$API_URL" \ > /dev/null echo "Cleanup comment posted" + diff --git a/.gitea/workflows/preview-deploy.yml b/.gitea/workflows/preview-deploy.yml index 819b0301c..28f4f5189 100644 --- a/.gitea/workflows/preview-deploy.yml +++ b/.gitea/workflows/preview-deploy.yml @@ -132,11 +132,20 @@ jobs: ls -la dist/ ' - - name: Install SSH client + - name: Install SSH client and rsync shell: sh run: | set -eu - apt-get update -qq && apt-get install -y -qq openssh-client rsync >/dev/null 2>&1 + if command -v apk >/dev/null 2>&1; then + apk add --no-cache openssh-client rsync >/dev/null 2>&1 + elif command -v apt-get >/dev/null 2>&1; then + apt-get update -qq && apt-get install -y -qq openssh-client rsync >/dev/null 2>&1 + elif command -v yum >/dev/null 2>&1; then + yum install -y openssh-clients rsync >/dev/null 2>&1 + else + echo "ERROR: No package manager found" + exit 1 + fi echo "openssh-client and rsync installed" - name: Deploy preview to server @@ -202,50 +211,24 @@ jobs: set -eu PR_NUMBER=$(echo "$GITHUB_REF" | sed 's|refs/pull/||; s|/.*||') PREVIEW_URL="https://pr-${PR_NUMBER}.preview.xiaoxiajianji.com" + export PR_NUMBER PREVIEW_URL - # 构建评论内容 - COMMENT_BODY=$(python3 -c " - import json, os - pr_num = os.environ['PR_NUMBER'] - url = os.environ['PREVIEW_URL'] - body = f'''🚀 **预览环境已部署** + COMMENT_BODY=$(python3 scripts/ci/preview_comment.py deploy) -| 项目 | 详情 | -|------|------| -| PR号 | #{pr_num} | -| 预览链接 | [${url}](${url}) | -| API环境 | staging | - -> 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 -> -> 🔄 每次提交新代码后预览环境会自动更新。 -> -> 🗑️ PR 关闭或合并后,预览环境会自动清理。 -''' - print(json.dumps({'body': body})) - ") - - # 查找是否已有预览评论 API_URL="${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/issues/${PR_NUMBER}/comments" - EXISTING_COMMENT_ID="" - COMMENTS=$(curl -s -H "Authorization: token ${GITHUB_TOKEN}" "$API_URL") - EXISTING_COMMENT_ID=$(echo "$COMMENTS" | python3 -c " + EXISTING_COMMENT_ID=$(curl -s -H "Authorization: token ${GITHUB_TOKEN}" "$API_URL" | python3 -c " import sys, json try: - comments = json.load(sys.stdin) - for c in comments: - body = c.get('body', '') - if '预览环境已部署' in body and 'Preview URL' not in body: + for c in json.load(sys.stdin): + if '预览环境已部署' in c.get('body', ''): print(c['id']) break - except: - print('') + except Exception: + pass ") if [ -n "$EXISTING_COMMENT_ID" ]; then - # 更新已有评论 - echo "Updating existing comment: $EXISTING_COMMENT_ID" curl -s -X PATCH \ -H "Authorization: token ${GITHUB_TOKEN}" \ -H "Content-Type: application/json" \ @@ -254,8 +237,6 @@ jobs: > /dev/null echo "Comment updated" else - # 发布新评论 - echo "Creating new comment" curl -s -X POST \ -H "Authorization: token ${GITHUB_TOKEN}" \ -H "Content-Type: application/json" \ diff --git a/scripts/ci/preview_comment.py b/scripts/ci/preview_comment.py new file mode 100755 index 000000000..cdf35d07a --- /dev/null +++ b/scripts/ci/preview_comment.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 +"""生成预览环境PR评论内容""" + +import json +import os +import sys + + +def generate_deploy_comment(pr_number, preview_url): + """生成部署成功的评论内容""" + return f"""🚀 **预览环境已部署** + +| 项目 | 详情 | +|------|------| +| PR号 | #{pr_number} | +| 预览链接 | [{preview_url}]({preview_url}) | +| API环境 | staging | + +> 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 +> +> 🔄 每次提交新代码后预览环境会自动更新。 +> +> 🗑️ PR 关闭或合并后,预览环境会自动清理。 +""" + + +def generate_cleanup_comment(pr_number): + """生成清理完成的评论内容""" + return f"""🗑️ **预览环境已清理** + +PR #{pr_number} 已关闭或合并,对应的预览环境已被清理。 + +> 如有需要,可以重新打开 PR 来重新生成预览环境。 +""" + + +def main(): + mode = sys.argv[1] if len(sys.argv) > 1 else "deploy" + pr_number = os.environ.get("PR_NUMBER", "") + preview_url = os.environ.get("PREVIEW_URL", "") + + if mode == "deploy": + body = generate_deploy_comment(pr_number, preview_url) + elif mode == "cleanup": + body = generate_cleanup_comment(pr_number) + else: + print(f"Unknown mode: {mode}", file=sys.stderr) + sys.exit(1) + + print(json.dumps({"body": body})) + + +if __name__ == "__main__": + main()