From c4f2a2f817599ecbefe5c1bca264468876571722 Mon Sep 17 00:00:00 2001 From: CI Bot Date: Sat, 18 Jul 2026 12:01:59 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix(ci):=20=E4=BF=AE=E5=A4=8D=E9=A2=84?= =?UTF-8?q?=E8=A7=88=E7=8E=AF=E5=A2=83workflow=20YAML=E8=A7=A3=E6=9E=90?= =?UTF-8?q?=E9=94=99=E8=AF=AF=EF=BC=8C=E8=AF=84=E8=AE=BA=E9=80=BB=E8=BE=91?= =?UTF-8?q?=E6=8A=BD=E4=B8=BA=E7=8B=AC=E7=AB=8B=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复 preview-deploy.yml 和 preview-cleanup.yml 中Python三重引号 嵌Markdown表格导致YAML解析失败的问题 - 评论生成逻辑抽离为 scripts/ci/preview_comment.py - workflow中直接调用脚本,避免多层嵌套字符串 --- .gitea/workflows/preview-cleanup.yml | 14 ++------ .gitea/workflows/preview-deploy.yml | 42 ++++------------------ scripts/ci/preview_comment.py | 53 ++++++++++++++++++++++++++++ 3 files changed, 63 insertions(+), 46 deletions(-) create mode 100755 scripts/ci/preview_comment.py diff --git a/.gitea/workflows/preview-cleanup.yml b/.gitea/workflows/preview-cleanup.yml index 2302fa00f..20d50781b 100644 --- a/.gitea/workflows/preview-cleanup.yml +++ b/.gitea/workflows/preview-cleanup.yml @@ -95,18 +95,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 +107,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..b70bf45ba 100644 --- a/.gitea/workflows/preview-deploy.yml +++ b/.gitea/workflows/preview-deploy.yml @@ -202,50 +202,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 +228,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..e233ad493 --- /dev/null +++ b/scripts/ci/preview_comment.py @@ -0,0 +1,53 @@ +#!/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() -- 2.54.0 From fadc8db9c7dc4c0b28b3f7dd22d2ebcf954241ac Mon Sep 17 00:00:00 2001 From: CI Bot Date: Sat, 18 Jul 2026 12:05:06 +0800 Subject: [PATCH 2/3] =?UTF-8?q?fix(ci):=20=E9=A2=84=E8=A7=88=E7=8E=AF?= =?UTF-8?q?=E5=A2=83rsync=E5=AE=89=E8=A3=85=E5=85=BC=E5=AE=B9Alpine=20runn?= =?UTF-8?q?er=EF=BC=88apk=E6=9B=BF=E4=BB=A3apt-get=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit runtime-builder标签的runner是Alpine系统,没有apt-get, 导致openssh-client和rsync安装失败。改为自动检测包管理器 (apk/apt-get/yum),兼容多种runner环境。 --- .gitea/workflows/preview-cleanup.yml | 9 ++++++++- .gitea/workflows/preview-deploy.yml | 13 +++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/.gitea/workflows/preview-cleanup.yml b/.gitea/workflows/preview-cleanup.yml index 20d50781b..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 diff --git a/.gitea/workflows/preview-deploy.yml b/.gitea/workflows/preview-deploy.yml index b70bf45ba..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 -- 2.54.0 From 650f5aa4f699faa954c12884f7966a0d2518c159 Mon Sep 17 00:00:00 2001 From: CI Bot Date: Sat, 18 Jul 2026 13:00:23 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix(ci):=20=E6=A0=BC=E5=BC=8F=E5=8C=96previ?= =?UTF-8?q?ew=5Fcomment.py=E4=BB=A5=E9=80=9A=E8=BF=87black=E6=A3=80?= =?UTF-8?q?=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/ci/preview_comment.py | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/ci/preview_comment.py b/scripts/ci/preview_comment.py index e233ad493..cdf35d07a 100755 --- a/scripts/ci/preview_comment.py +++ b/scripts/ci/preview_comment.py @@ -1,5 +1,6 @@ #!/usr/bin/env python3 """生成预览环境PR评论内容""" + import json import os import sys -- 2.54.0