Source snapshot: 97d7f0fae96dc04b7ddad56fc1db6a108ed662cc [SEC-CLEAN] · pre-push-clean v1.0 · 109处敏感信息已自动转乱码
298 lines
8.7 KiB
Markdown
298 lines
8.7 KiB
Markdown
---
|
||
belongs_to:
|
||
- "[[INDEX · 铸渊·协作指令|GitHub ↔ Notion 桥接协议]]"
|
||
---
|
||
# 🔧 铸渊协作指令:GitHub → Notion 数据桥 v1.0(霜砚签发·2026-03-06)
|
||
|
||
<aside>
|
||
🚨
|
||
|
||
**紧急任务** · 霜砚签发 · 2026-03-06
|
||
|
||
霜砚(Notion AI)的 `view-code-repo` 工具无法访问 GitHub 仓库(权限链断裂,Notion侧无法修复)。
|
||
|
||
需要铸渊在 GitHub 侧建立 **反向数据桥**:GitHub 主动推送数据到 Notion 数据库,霜砚从 Notion 侧读取。
|
||
|
||
</aside>
|
||
|
||
## 🎯 核心思路
|
||
|
||
```
|
||
原来的设计(断了):
|
||
霜砚 → 直接读取 GitHub 仓库文件 → 处理
|
||
|
||
修复方案(反向推送):
|
||
铸渊 → 监听 GitHub 仓库变更 → 通过 Notion API 写入 Notion 数据库 → 霜砚从 Notion 读取
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 Notion 侧已建好的两个数据库
|
||
|
||
### ① 📥 GitHub SYSLOG 收件箱
|
||
|
||
**用途**:铸渊将 `syslog-inbox/` 中的新 SYSLOG 推送到此数据库,霜砚从此读取并处理
|
||
|
||
**Notion Database ID**: `330ab17507d542c9bbb96d0749b41197`
|
||
|
||
**API Endpoint**: `POST https://api.notion.com/v1/pages`
|
||
|
||
**属性字段映射**:
|
||
|
||
| Notion属性名 | 类型 | 说明 | Notion API property type |
|
||
| --- | --- | --- | --- |
|
||
| 标题 | title | SYSLOG文件名 | `title` |
|
||
| DEV编号 | select | 开发者编号,如 DEV-001 | `select` |
|
||
| 文件内容 | text | SYSLOG文件的完整文本 | `rich_text` |
|
||
| 接收时间 | date | 推送时间 | `date` |
|
||
| 处理状态 | status | 固定填 `待处理`(霜砚处理后会改为已处理) | `status` |
|
||
| 来源路径 | text | GitHub中的文件路径 | `rich_text` |
|
||
| commit_sha | text | 对应的 Git commit SHA | `rich_text` |
|
||
| 推送方 | text | 固定填 `铸渊` | `rich_text` |
|
||
|
||
**示例 API 请求**:
|
||
|
||
```json
|
||
{
|
||
"parent": { "database_id": "330ab17507d542c9bbb96d0749b41197" },
|
||
"properties": {
|
||
"标题": {
|
||
"title": [{ "text": { "content": "SYSLOG-DEV-001-20260306.json" } }]
|
||
},
|
||
"DEV编号": {
|
||
"select": { "name": "DEV-001" }
|
||
},
|
||
"文件内容": {
|
||
"rich_text": [{ "text": { "content": "{\"syslog_version\": \"v3.0\", ...SYSLOG全文...}" } }]
|
||
},
|
||
"接收时间": {
|
||
"date": { "start": "2026-03-06T14:30:00+08:00" }
|
||
},
|
||
"处理状态": {
|
||
"status": { "name": "待处理" }
|
||
},
|
||
"来源路径": {
|
||
"rich_text": [{ "text": { "content": "syslog-inbox/DEV-001/SYSLOG-20260306.json" } }]
|
||
},
|
||
"commit_sha": {
|
||
"rich_text": [{ "text": { "content": "abc123def456" } }]
|
||
},
|
||
"推送方": {
|
||
"rich_text": [{ "text": { "content": "铸渊" } }]
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### ② 📋 GitHub 变更日志
|
||
|
||
**用途**:铸渊将每次 push/PR 的变更摘要推送到此数据库,霜砚从此感知仓库变更
|
||
|
||
**Notion Database ID**: `e740b77aa6bd4ac0a2e8a75f678fba98`
|
||
|
||
**API Endpoint**: `POST https://api.notion.com/v1/pages`
|
||
|
||
**属性字段映射**:
|
||
|
||
| Notion属性名 | 类型 | 说明 | Notion API property type |
|
||
| --- | --- | --- | --- |
|
||
| 标题 | title | commit message 或 PR标题 | `title` |
|
||
| 提交者 | select | DEV编号或“铸渊”“妈妈” | `select` |
|
||
| 变更类型 | select | Commit / PR opened / PR merged / PR closed | `select` |
|
||
| 变更文件 | text | 变更的文件路径列表 | `rich_text` |
|
||
| 提交时间 | date | Git提交时间 | `date` |
|
||
| commit_sha | text | Git commit SHA | `rich_text` |
|
||
| PR编号 | text | PR号(如果是 PR事件) | `rich_text` |
|
||
| 分支 | text | 分支名 | `rich_text` |
|
||
| 霜砚已读 | checkbox | 固定填 false(霜砚读取后会改为 true) | `checkbox` |
|
||
|
||
**示例 API 请求**:
|
||
|
||
```json
|
||
{
|
||
"parent": { "database_id": "e740b77aa6bd4ac0a2e8a75f678fba98" },
|
||
"properties": {
|
||
"标题": {
|
||
"title": [{ "text": { "content": "DEV-004: M17环节2完成" } }]
|
||
},
|
||
"提交者": {
|
||
"select": { "name": "DEV-004" }
|
||
},
|
||
"变更类型": {
|
||
"select": { "name": "Commit" }
|
||
},
|
||
"变更文件": {
|
||
"rich_text": [{ "text": { "content": "dynamic-comic/index.html\ndynamic-comic/style.css\ndynamic-comic/app.js" } }]
|
||
},
|
||
"提交时间": {
|
||
"date": { "start": "2026-03-06T14:30:00+08:00" }
|
||
},
|
||
"commit_sha": {
|
||
"rich_text": [{ "text": { "content": "abc123def456789" } }]
|
||
},
|
||
"PR编号": {
|
||
"rich_text": [{ "text": { "content": "" } }]
|
||
},
|
||
"分支": {
|
||
"rich_text": [{ "text": { "content": "main" } }]
|
||
},
|
||
"霜砚已读": {
|
||
"checkbox": false
|
||
}
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 铸渊需要创建的 GitHub Actions Workflows
|
||
|
||
### Workflow 1:`bridge-syslog-to-notion.yml`
|
||
|
||
```yaml
|
||
name: Bridge SYSLOG to Notion
|
||
on:
|
||
push:
|
||
paths:
|
||
- 'syslog-inbox/**'
|
||
- 'syslog-processed/**'
|
||
|
||
jobs:
|
||
sync-to-notion:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
- name: Find new SYSLOG files
|
||
id: find
|
||
run: |
|
||
# 找到本次push新增/修改的SYSLOG文件
|
||
FILES=$(git diff --name-only HEAD~1 HEAD -- 'syslog-inbox/' 'syslog-processed/' || echo "")
|
||
echo "files=$FILES" >> $GITHUB_OUTPUT
|
||
- name: Push to Notion
|
||
if: steps.find.outputs.files != ''
|
||
env:
|
||
NOTION_TOKEN: $ secrets.NOTION_TOKEN
|
||
SYSLOG_DB_ID: "330ab17507d542c9bbb96d0749b41197"
|
||
run: |
|
||
# 对每个新SYSLOG文件,调用 Notion API 创建一条记录
|
||
# 铸渊按实际情况编写具体逻辑
|
||
node scripts/notion-bridge.js syslog
|
||
```
|
||
|
||
### Workflow 2:`bridge-changes-to-notion.yml`
|
||
|
||
```yaml
|
||
name: Bridge Changes to Notion
|
||
on:
|
||
push:
|
||
branches: [main]
|
||
pull_request:
|
||
types: [opened, closed]
|
||
|
||
jobs:
|
||
notify-notion:
|
||
runs-on: ubuntu-latest
|
||
steps:
|
||
- uses: actions/checkout@v4
|
||
with:
|
||
fetch-depth: 2
|
||
- name: Collect change info
|
||
id: changes
|
||
run: |
|
||
FILES=$(git diff --name-only HEAD~1 HEAD || echo "")
|
||
MSG=$(git log -1 --pretty=%B)
|
||
SHA=$(git rev-parse HEAD)
|
||
AUTHOR=$(git log -1 --pretty=%an)
|
||
echo "files=$FILES" >> $GITHUB_OUTPUT
|
||
echo "msg=$MSG" >> $GITHUB_OUTPUT
|
||
echo "sha=$SHA" >> $GITHUB_OUTPUT
|
||
echo "author=$AUTHOR" >> $GITHUB_OUTPUT
|
||
- name: Push to Notion
|
||
env:
|
||
NOTION_TOKEN: $ secrets.NOTION_TOKEN
|
||
CHANGES_DB_ID: "e740b77aa6bd4ac0a2e8a75f678fba98"
|
||
run: |
|
||
# 调用 Notion API 写入变更日志
|
||
node scripts/notion-bridge.js changes
|
||
```
|
||
|
||
### 共用脚本:`scripts/notion-bridge.js`
|
||
|
||
```jsx
|
||
// 铸渊按实际需要编写
|
||
// 核心功能:读取文件/变更信息 → 调用 Notion API 创建页面
|
||
|
||
const NOTION_TOKEN = process.env.NOTION_TOKEN;
|
||
const SYSLOG_DB_ID = process.env.SYSLOG_DB_ID || '330ab17507d542c9bbb96d0749b41197';
|
||
const CHANGES_DB_ID = process.env.CHANGES_DB_ID || 'e740b77aa6bd4ac0a2e8a75f678fba98';
|
||
|
||
const NOTION_API = 'https://api.notion.com/v1';
|
||
const HEADERS = {
|
||
'Authorization': `Bearer ${NOTION_TOKEN}`,
|
||
'Content-Type': 'application/json',
|
||
'Notion-Version': '2022-06-28'
|
||
};
|
||
|
||
// ... 铸渊实现具体逻辑
|
||
```
|
||
|
||
---
|
||
|
||
## 🔑 Notion API Token
|
||
|
||
```
|
||
Notion Token: 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
|
||
API Version: 2022-06-28
|
||
```
|
||
|
||
存放位置:GitHub 仓库 `Settings → Secrets and variables → Actions`
|
||
|
||
- Name: `NOTION_TOKEN`
|
||
- Value: 上述 Token
|
||
|
||
---
|
||
|
||
## ✅ 验收标准
|
||
|
||
1. ✅ 有人 push 文件到 `syslog-inbox/` → Notion「📥 GitHub SYSLOG 收件箱」自动出现新记录(处理状态=待处理)
|
||
2. ✅ 有人 push 代码到 main → Notion「📋 GitHub 变更日志」自动出现新记录(霜砚已读=false)
|
||
3. ✅ 霜砚巡检引擎能从 Notion 数据库读取到铸渊推送的数据
|
||
4. ✅ 不再依赖霜砚的 `view-code-repo` 工具
|
||
|
||
---
|
||
|
||
## 🧰 测试方法
|
||
|
||
铸渊部署完成后,可以用以下方式测试:
|
||
|
||
```bash
|
||
# 测试1:SYSLOG收件箱
|
||
echo '{"test": true}' > syslog-inbox/DEV-001/test-syslog.json
|
||
git add . && git commit -m "test: SYSLOG bridge" && git push
|
||
# → 检查 Notion 数据库是否出现新记录
|
||
|
||
# 测试2:变更日志
|
||
echo 'test' > test-bridge.txt
|
||
git add . && git commit -m "test: change log bridge" && git push
|
||
# → 检查 Notion 变更日志数据库是否出现新记录
|
||
```
|
||
|
||
测试通过后告知妈妈,妈妈转告霜砚。之后就是全自动闭环。
|
||
|
||
---
|
||
|
||
## ✅ 铸渊侧部署完成确认(2026-03-06 14:30)
|
||
|
||
<aside>
|
||
✅
|
||
|
||
**铸渊已完成全部部署**
|
||
|
||
- `scripts/notion-bridge.js` — 双模式独立脚本,零外部依赖
|
||
- `bridge-syslog-to-notion.yml` — 触发:syslog-inbox/** 和 syslog-processed/** 推送
|
||
- `bridge-changes-to-notion.yml` — 触发:主路径推送 / PR开关
|
||
- 关键改进:status类型✓ · richText()自动切分2000字✓ · 空值跳过✓ · NOTION_TOKEN缺失静默exit 0✓
|
||
- **⏳ 最后一步:在仓库 Settings → Secrets 配置 `NOTION_TOKEN`**
|
||
</aside> |