fix(ci): 修复预览环境workflow YAML解析错误 #499
@@ -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"
|
||||
|
||||
|
||||
@@ -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" \
|
||||
|
||||
Executable
+54
@@ -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()
|
||||
Reference in New Issue
Block a user