冰朔要求: 工作流名称和输出全部用中文,报错能看懂 修改: - ci-and-deploy.yaml — 增加部署验证步骤(唤醒门/同步服务), 依赖安装覆盖更多目录 - patrol.yaml — 修复旧路径 /opt/zhuyuan-cn → /data/guanghulab/repo - cvm-power-on/off.yaml — 修复旧路径 - selfcheck.yaml — 步骤名已中文(之前就是) 删除(冰朔看不懂的调试工作流): - debug-secrets.yaml, test-secrets.yaml, verify-secrets.yaml - final-secrets-test.yaml, deploy-infra.yaml, deploy-preview.yaml 保留6个工作流: 1. CI检查+自动部署 — 合并到main时自动部署 2. 铸渊自检 — 每天08:00健康检查 3. 铸渊巡逻 — DeepSeek+千问AI巡检 4. 安全关机检测 — 手动触发 5. CVM开机 — 手动触发 6. CVM关机 — 手动触发
58 lines
2.4 KiB
YAML
58 lines
2.4 KiB
YAML
# ════════════════════════════════════════════════════════════════
|
|
# 光湖 · 铸渊自动巡逻
|
|
# Trigger: 每天08:00/20:00 / 手动触发
|
|
# 需要: DEEPSEEK_API_KEY 和/或 QIANWEN_API_KEY (Forgejo Secrets)
|
|
# ════════════════════════════════════════════════════════════════
|
|
|
|
name: 铸渊巡逻
|
|
|
|
on:
|
|
schedule:
|
|
- cron: '0 0 * * *' # UTC 00:00 = CST 08:00
|
|
- cron: '0 12 * * *' # UTC 12:00 = CST 20:00
|
|
workflow_dispatch:
|
|
|
|
jobs:
|
|
patrol:
|
|
runs-on: ubuntu
|
|
steps:
|
|
- name: 同步最新代码
|
|
run: |
|
|
cd /data/guanghulab/repo
|
|
git fetch origin
|
|
git reset --hard origin/main
|
|
echo "✅ 代码已同步"
|
|
|
|
- name: 执行巡逻检查
|
|
env:
|
|
DEEPSEEK_API_KEY: ${{ secrets.DEEPSEEK_API_KEY }}
|
|
QIANWEN_API_KEY: ${{ secrets.QIANWEN_API_KEY }}
|
|
ZY_REPO_TOKEN: ${{ secrets.ZY_REPO_TOKEN }}
|
|
run: |
|
|
cd /data/guanghulab/repo/scripts/patrol-agent
|
|
node patrol-agent.js --once
|
|
|
|
- name: 巡逻结果
|
|
run: |
|
|
REPORT_DIR="/data/guanghulab/.runtime/patrol-reports"
|
|
LATEST=$(ls -t "$REPORT_DIR"/patrol-*.json 2>/dev/null | head -1)
|
|
if [[ -n "$LATEST" ]]; then
|
|
echo "═══════════════════════════════════════"
|
|
cat "$LATEST" | python3 -c "
|
|
import json,sys
|
|
r = json.load(sys.stdin)
|
|
print(f'状态: {r.get(\"status\",\"?\")}')
|
|
print(f'总结: {r.get(\"summary\",\"?\")}')
|
|
for i in r.get('issues',[]):
|
|
icon = '🔴' if i.get('severity')=='high' else '🟡' if i.get('severity')=='medium' else '🟢'
|
|
auto = ' [可自动修复]' if i.get('auto_fix') else ''
|
|
print(f' {icon} {i.get(\"component\")}: {i.get(\"description\")}{auto}')
|
|
for f in r.get('fix_results',[]):
|
|
print(f' 🔧 修复 {f[\"component\"]}: {f[\"result\"]}')
|
|
print(f'分析器: {r.get(\"analyzer\",\"未知\")}')
|
|
"
|
|
echo "═══════════════════════════════════════"
|
|
else
|
|
echo "⚠️ 未生成巡检报告"
|
|
fi
|