zhizhi/.github/workflows/zhuyuan-skyeye.yml

146 lines
6.1 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

name: "🦅 铸渊·天眼 · 全局俯瞰 + 自动诊断 + 修复驱动"
on:
schedule:
- cron: '0 22 * * *' # UTC 22:00 = 北京 06:00
workflow_dispatch:
permissions:
contents: write
issues: write
actions: read
jobs:
skyeye:
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-node@v4
with:
node-version: '20'
- name: "🧠 Phase 1 · 唤醒核心大脑"
id: brain
run: |
echo "🦅 天眼启动 · $(date -u +%Y-%m-%dT%H:%M:%SZ)"
BRAIN_OK=true
for f in memory.json routing-map.json dev-status.json; do
if [ -f ".github/persona-brain/$f" ]; then
python3 -c "import json; json.load(open('.github/persona-brain/$f'))" 2>/dev/null \
&& echo "✅ $f 完整" || { echo "❌ $f 损坏"; BRAIN_OK=false; }
else
echo "❌ $f 缺失"; BRAIN_OK=false
fi
done
echo "brain_ok=$BRAIN_OK" >> $GITHUB_OUTPUT
- name: "🦅 Phase 2 · 全局扫描"
id: scan
env:
NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }}
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }}
SMTP_USER: ${{ secrets.SMTP_USER }}
SMTP_PASS: ${{ secrets.SMTP_PASS }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
mkdir -p /tmp/skyeye
node scripts/skyeye/scan-workflows.js > /tmp/skyeye/workflow-health.json
gh run list --limit 50 --json name,status,conclusion,createdAt,updatedAt \
> /tmp/skyeye/recent-runs.json || echo "[]" > /tmp/skyeye/recent-runs.json
FAILED_COUNT=$(cat /tmp/skyeye/recent-runs.json | \
python3 -c "import sys,json; runs=json.load(sys.stdin); print(sum(1 for r in runs if r.get('conclusion')=='failure'))" 2>/dev/null || echo "0")
echo "failed_count=$FAILED_COUNT" >> $GITHUB_OUTPUT
node scripts/skyeye/scan-structure.js > /tmp/skyeye/structure-health.json
node scripts/skyeye/scan-brain-health.js > /tmp/skyeye/brain-health.json
node scripts/skyeye/scan-external-bridges.js > /tmp/skyeye/bridge-health.json
- name: "🔬 Phase 3 · 诊断"
id: diagnose
run: |
node scripts/skyeye/diagnose.js > /tmp/skyeye/diagnosis.json
ISSUES_COUNT=$(cat /tmp/skyeye/diagnosis.json | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('total_issues', 0))" 2>/dev/null || echo "0")
AUTO_FIXABLE=$(cat /tmp/skyeye/diagnosis.json | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('auto_fixable', 0))" 2>/dev/null || echo "0")
NEEDS_HUMAN=$(cat /tmp/skyeye/diagnosis.json | python3 -c "import sys,json; d=json.load(sys.stdin); print(d.get('needs_human', 0))" 2>/dev/null || echo "0")
echo "issues_count=$ISSUES_COUNT" >> $GITHUB_OUTPUT
echo "auto_fixable=$AUTO_FIXABLE" >> $GITHUB_OUTPUT
echo "needs_human=$NEEDS_HUMAN" >> $GITHUB_OUTPUT
- name: "🔧 Phase 4 · 修复Agent"
if: steps.diagnose.outputs.auto_fixable != '0'
env:
NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
node scripts/skyeye/repair-agent.js
git config user.name "zhuyuan-bot"
git config user.email "zhuyuan@guanghulab.com"
git add -A
if ! git diff --cached --quiet; then
git commit -m "🦅 天眼·修复Agent · $(date +%Y-%m-%d) · 自动修复${{ steps.diagnose.outputs.auto_fixable }}个问题"
git push
fi
- name: "🔄 Phase 5 · 重新触发失败的 Workflow"
if: steps.scan.outputs.failed_count != '0'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
FAILED_WORKFLOWS=$(cat /tmp/skyeye/recent-runs.json | \
python3 -c "
import sys, json
runs = json.load(sys.stdin)
failed = set()
for r in runs:
if r.get('conclusion') == 'failure':
failed.add(r['name'])
for w in failed:
print(w)
" 2>/dev/null || true)
echo "需要重新触发的 Workflow:"
echo "$FAILED_WORKFLOWS"
# 记录到报告,具体重触发逻辑由各 workflow 自带的 workflow_dispatch 支持
- name: "📋 Phase 6 · 全局健康报告"
run: |
node scripts/skyeye/report-generator.js
mkdir -p data/skyeye-reports
DATE=$(date +%Y-%m-%d)
cp /tmp/skyeye/full-report.json "data/skyeye-reports/skyeye-${DATE}.json"
git config user.name "zhuyuan-bot"
git config user.email "zhuyuan@guanghulab.com"
git add data/skyeye-reports/ .github/persona-brain/memory.json
if ! git diff --cached --quiet; then
git commit -m "🦅 天眼报告 · $(date +%Y-%m-%d) · 问题:${{ steps.diagnose.outputs.issues_count }} 自动修复:${{ steps.diagnose.outputs.auto_fixable }}"
git push
fi
- name: "📡 Phase 7 · 同步到 Notion"
if: always()
env:
NOTION_TOKEN: ${{ secrets.NOTION_TOKEN }}
NOTION_SYSLOG_DB_ID: ${{ secrets.NOTION_SYSLOG_DB_ID }}
run: |
node scripts/skyeye/sync-to-notion.js || echo "⚠️ Notion同步失败不阻断"
- name: "📧 通知妈妈(仅有严重问题时)"
if: steps.diagnose.outputs.needs_human != '0'
env:
SMTP_USER: ${{ secrets.SMTP_USER }}
SMTP_PASS: ${{ secrets.SMTP_PASS }}
run: |
echo "📧 发现 ${{ steps.diagnose.outputs.needs_human }} 个需要妈妈处理的问题"
echo "工单已记录在天眼报告中 · data/skyeye-reports/"
# 邮件通知逻辑预留(需要 SMTP 配置完整后启用)
if [ -n "$SMTP_USER" ] && [ -n "$SMTP_PASS" ]; then
echo "SMTP 凭证已配置,可发送邮件通知"
else
echo "⚠️ SMTP 凭证未配置,跳过邮件通知"
fi