e39f8bacdd
CI/CD Pipeline / Validate Code Quality And Tests (push) Successful in 1m31s
CI/CD Pipeline / Frontend Lint (push) Successful in 2m33s
CI/CD Pipeline / Build Production Runtime Images (push) Has been skipped
CI/CD Pipeline / Deploy Production (push) Has been skipped
CI/CD Pipeline / Production Browser E2E (push) Has been skipped
CI/CD Pipeline / Integration Tests (push) Successful in 1m36s
CI/CD Pipeline / Build & Push Staging (Watchtower auto-deploy) (push) Successful in 5m19s
CI/CD Pipeline / Staging E2E Tests (push) Successful in 3m49s
CI/CD Pipeline / Staging API Integration Tests (push) Successful in 4m49s
## 变更说明
基于最新 develop 分支重建的干净PR,替换旧的 #228(原分支太老,有4个文件冲突,CI也因为代码版本不一致各种出问题)。
## 改动内容
1. **新增 `scripts/ci_notify_success.py`** — 部署成功通知脚本(飞书卡片,绿色成功样式)
2. **修改 `.gitea/workflows/ci-cd.yml`**:
- 给以下 7 个 job 加上失败通知:
- Frontend Lint
- Build & Push Staging (Watchtower auto-deploy)
- Staging E2E Tests
- Staging API Integration Tests
- Build Production Runtime Images
- Deploy Production
- Production Browser E2E
- 给以下 2 个部署 job 加上成功通知(部署完成后发):
- Build & Push Staging — Staging部署成功
- Deploy Production — 生产部署成功
## 参考
- 失败通知参照已有的 Validate Code Quality And Tests 和 Integration Tests 里的 "Notify CI failure" 步骤写法
- 成功通知基于失败通知改写,调用 `scripts/ci_notify_success.py`
---------
Co-authored-by: xiaoxia <ci@xiaoxiajianji.com>
Reviewed-on: #229
84 lines
2.6 KiB
Python
84 lines
2.6 KiB
Python
#!/usr/bin/env python3
|
|
"""发送 CI 成功通知到飞书/项目群 webhook。"""
|
|
|
|
import json
|
|
import os
|
|
import sys
|
|
import urllib.request
|
|
|
|
|
|
def main() -> int:
|
|
webhook = os.environ.get("CI_NOTIFY_WEBHOOK", "")
|
|
if not webhook:
|
|
print("未配置 CI_NOTIFY_WEBHOOK,跳过成功通知")
|
|
print("如需启用,请在仓库 Settings -> Secrets and variables -> Actions 中添加 CI_NOTIFY_WEBHOOK")
|
|
return 0
|
|
|
|
success_job = os.environ.get("SUCCESS_JOB", "Unknown Job")
|
|
branch = os.environ.get("GITHUB_REF_NAME", "unknown")
|
|
commit = os.environ.get("GITHUB_SHA", "unknown")[:8]
|
|
actor = os.environ.get("GITHUB_ACTOR", "unknown")
|
|
run_id = os.environ.get("GITHUB_RUN_ID", "unknown")
|
|
repo = os.environ.get("GITHUB_REPOSITORY", "unknown")
|
|
run_url = f"https://git.xiaoxiajianji.com/{repo}/actions/runs/{run_id}"
|
|
|
|
payload = {
|
|
"msg_type": "interactive",
|
|
"card": {
|
|
"header": {
|
|
"title": {
|
|
"tag": "plain_text",
|
|
"content": "✅ CI 构建成功",
|
|
},
|
|
"status": "green",
|
|
},
|
|
"elements": [
|
|
{
|
|
"tag": "div",
|
|
"text": {
|
|
"tag": "lark_md",
|
|
"content": (
|
|
f"**任务**: {success_job}\n"
|
|
f"**分支**: {branch}\n"
|
|
f"**提交**: {commit}\n"
|
|
f"**提交者**: {actor}\n"
|
|
f"**Run ID**: {run_id}"
|
|
),
|
|
},
|
|
},
|
|
{
|
|
"tag": "action",
|
|
"actions": [
|
|
{
|
|
"tag": "button",
|
|
"text": {"tag": "plain_text", "content": "查看构建详情"},
|
|
"url": run_url,
|
|
"type": "primary",
|
|
}
|
|
],
|
|
},
|
|
],
|
|
},
|
|
}
|
|
|
|
data = json.dumps(payload).encode("utf-8")
|
|
req = urllib.request.Request(
|
|
webhook,
|
|
data=data,
|
|
headers={"Content-Type": "application/json"},
|
|
method="POST",
|
|
)
|
|
try:
|
|
with urllib.request.urlopen(req, timeout=10) as resp:
|
|
resp.read()
|
|
print("成功通知已发送")
|
|
except Exception as e:
|
|
print(f"成功通知发送失败: {e}", file=sys.stderr)
|
|
return 1
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|