fix(ci): 修复预览环境workflow YAML解析错误 #499

Merged
auto-approve-bot merged 3 commits from fix/preview-workflow-yaml into develop 2026-07-18 13:04:47 +08:00
3 changed files with 83 additions and 49 deletions
+11 -12
View File
@@ -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"
+18 -37
View File
@@ -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" \
+54
View File
@@ -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()