--- belongs_to: - "[[INDEX · 铸渊·协作指令|GitHub ↔ Notion 桥接协议]]" --- # 🚀 铸渊 CD 指令:自动部署 guanghulab.com(push → 自动上线) --- ## 🎯 核心目标 ``` 开发者 push 模块代码到 main ↓ 铸渊 GitHub Actions 自动触发 ↓ ① HLI 接口校验(contract-check) ② 模块指纹检查(route-align-check) ↓ 全部通过 ③ 构建 & 部署到 guanghulab.com ↓ ④ 通知 Notion 变更日志(bridge-changes-to-notion) ↓ 网站自动上线 ✅ ``` --- ## 📋 部署方案选择 ### 方案 A:GitHub Pages(推荐) **适用条件**:纯静态站点(HTML/CSS/JS),无需服务端 **优点**: - 零成本、零运维 - GitHub 原生支持,push 即部署 - 自定义域名 [guanghulab.com](http://guanghulab.com) 直接绑定 **Workflow 文件**:`.github/workflows/deploy-to-pages.yml` ```yaml name: 🚀 Deploy to GitHub Pages on: push: branches: [main] paths-ignore: - '.github/persona-brain/**' - '.github/broadcasts/**' - 'syslog-inbox/**' - 'syslog-processed/**' - 'broadcasts-outbox/**' - '**.md' workflow_dispatch: permissions: contents: read pages: write id-token: write concurrency: group: "pages" cancel-in-progress: false jobs: # ━━━ Job 1:校验 ━━━ validate: name: 🔍 HLI校验 + 模块指纹检查 runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '18' - name: Run contract check run: | if [ -f "scripts/contract-check.js" ]; then echo "🔍 执行 HLI 接口契约校验..." node scripts/contract-check.js else echo "⚠️ contract-check.js 不存在,跳过" fi - name: Run route-align check run: | if [ -f "scripts/route-align-check.js" ]; then echo "🔍 执行模块指纹路由校验..." node scripts/route-align-check.js else echo "⚠️ route-align-check.js 不存在,跳过" fi # ━━━ Job 2:构建 & 部署 ━━━ deploy: name: 🚀 部署到 GitHub Pages needs: validate runs-on: ubuntu-latest environment: name: github-pages url: $ steps.deployment.outputs.page_url steps: - uses: actions/checkout@v4 - name: Detect site root id: detect run: | # 自动检测站点根目录 if [ -d "app" ] && [ -f "app/index.html" ]; then echo "root=app" >> $GITHUB_OUTPUT elif [ -d "dist" ] && [ -f "dist/index.html" ]; then echo "root=dist" >> $GITHUB_OUTPUT elif [ -d "public" ] && [ -f "public/index.html" ]; then echo "root=public" >> $GITHUB_OUTPUT elif [ -f "index.html" ]; then echo "root=." >> $GITHUB_OUTPUT else echo "root=app" >> $GITHUB_OUTPUT fi echo "📂 站点根目录: $(cat $GITHUB_OUTPUT | grep root | cut -d= -f2)" - name: Setup Pages uses: actions/configure-pages@v4 - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: path: $ steps.detect.outputs.root - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 # ━━━ Job 3:通知 ━━━ notify: name: 📡 通知 Notion needs: deploy runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 2 - name: Push deploy event to Notion env: NOTION_TOKEN: $ secrets.NOTION_TOKEN CHANGES_DB_ID: "e740b77aa6bd4ac0a2e8a75f678fba98" run: | if [ -z "$NOTION_TOKEN" ]; then echo "⚠️ NOTION_TOKEN 未配置,跳过通知" exit 0 fi SHA=$(git rev-parse --short HEAD) MSG=$(git log -1 --pretty=%B | head -1) AUTHOR=$(git log -1 --pretty=%an) FILES=$(git diff --name-only HEAD~1 HEAD | head -20 | tr '\n' ', ') NOW=$(date -u +"%Y-%m-%dT%H:%M:%S+08:00") curl -s -X POST "https://api.notion.com/v1/pages" \ -H "Authorization: Bearer $NOTION_TOKEN" \ -H "Content-Type: application/json" \ -H "Notion-Version: 2022-06-28" \ -d "{ \"parent\": {\"database_id\": \"$CHANGES_DB_ID\"}, \"properties\": { \"标题\": {\"title\": [{\"text\": {\"content\": \"🚀 自动部署: $MSG\"}}]}, \"提交者\": {\"select\": {\"name\": \"$AUTHOR\"}}, \"变更类型\": {\"select\": {\"name\": \"Deploy\"}}, \"变更文件\": {\"rich_text\": [{\"text\": {\"content\": \"$FILES\"}}]}, \"提交时间\": {\"date\": {\"start\": \"$NOW\"}}, \"commit_sha\": {\"rich_text\": [{\"text\": {\"content\": \"$SHA\"}}]}, \"分支\": {\"rich_text\": [{\"text\": {\"content\": \"main\"}}]}, \"霜砚已读\": {\"checkbox\": false} } }" echo "✅ 部署通知已推送到 Notion 变更日志" ``` **GitHub Pages 域名配置**(铸渊确认/执行): 1. 仓库 `Settings → Pages → Source` 设为 **GitHub Actions** 2. `Settings → Pages → Custom domain` 填入 `guanghulab.com` 3. DNS 端: | **记录类型** | **主机记录** | **记录值** | | --- | --- | --- | | CNAME | www | `qinfendebingshuo.github.io` | | A | @ | `185.199.108.153` | | A | @ | `185.199.109.153` | | A | @ | `185.199.110.153` | | A | @ | `185.199.111.153` | 1. 仓库根目录创建 `CNAME` 文件(内容:`guanghulab.com`) 2. 勾选 **Enforce HTTPS** --- ### 方案 B:VPS / 云服务器部署 **适用条件**:网站部署在独立服务器(如阿里云、腾讯云 ECS) **Workflow 文件**:`.github/workflows/deploy-to-server.yml` ```yaml name: 🚀 Deploy to Server on: push: branches: [main] paths-ignore: - '.github/persona-brain/**' - '.github/broadcasts/**' - 'syslog-inbox/**' - 'syslog-processed/**' - 'broadcasts-outbox/**' - '**.md' workflow_dispatch: jobs: validate: name: 🔍 HLI校验 + 模块指纹检查 runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '18' - name: Run contract check run: | if [ -f "scripts/contract-check.js" ]; then node scripts/contract-check.js fi - name: Run route-align check run: | if [ -f "scripts/route-align-check.js" ]; then node scripts/route-align-check.js fi deploy: name: 🚀 部署到服务器 needs: validate runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Detect site root id: detect run: | if [ -d "app" ]; then echo "root=app/" >> $GITHUB_OUTPUT elif [ -d "dist" ]; then echo "root=dist/" >> $GITHUB_OUTPUT elif [ -d "public" ]; then echo "root=public/" >> $GITHUB_OUTPUT else echo "root=./" >> $GITHUB_OUTPUT fi - name: Deploy via rsync uses: burnett01/rsync-deployments@6.0.0 with: switches: -avzr --delete --exclude '.github' --exclude 'syslog-inbox' --exclude 'syslog-processed' --exclude 'broadcasts-outbox' --exclude 'scripts' --exclude 'node_modules' --exclude '.git' path: $ steps.detect.outputs.root remote_path: $ secrets.DEPLOY_PATH remote_host: $ secrets.DEPLOY_HOST remote_user: $ secrets.DEPLOY_USER remote_key: $ secrets.DEPLOY_KEY ``` **服务器方案需要配置的 Secrets**: | **Secret Name** | **说明** | **示例** | | --- | --- | --- | | `DEPLOY_HOST` | 服务器 IP 或域名 | `123.456.789.0` | | `DEPLOY_USER` | SSH 用户名 | `root` 或 `deploy` | | `DEPLOY_KEY` | SSH 私钥(完整内容) | `-----BEGIN OPENSSH...` | | `DEPLOY_PATH` | 服务器上网站目录 | `/var/www/guanghulab.com/` | --- ### 方案 C:Vercel / Netlify(如已接入) 如果 [guanghulab.com](http://guanghulab.com) 已经通过 Vercel 或 Netlify 部署,它们本身就支持 Git 自动部署: - **Vercel**:连接 GitHub 仓库后,push 到 main 自动部署 - **Netlify**:同理,push 即部署 此场景下铸渊只需确保 CI 校验在部署前运行(在 Vercel/Netlify Build 设置里加 pre-build 命令)。 --- ## 🔒 校验失败 = 阻断部署 校验内容: | **校验项** | **脚本** | **检查内容** | | --- | --- | --- | | HLI 接口契约 | `scripts/contract-check.js` | 接口路径、字段结构是否符合 HLI 注册表定义 | | 模块指纹路由 | `scripts/route-align-check.js` | 模块目录结构、路由映射是否与 routing-map.json 一致 | --- ## 📊 完整数据流 ``` 开发者在本地写代码 ↓ git push origin main ↓ GitHub Actions 自动触发 deploy workflow ↓ ┌─────────────────────────┐ │ Job 1: validate │ │ · contract-check.js │ │ · route-align-check.js │ └───────────┬─────────────┘ │ ✅ 全部通过 ↓ ┌─────────────────────────┐ │ Job 2: deploy │ │ · 检测站点根目录 │ │ · 构建 & 上传 │ │ · 部署到 guanghulab.com │ └───────────┬─────────────┘ │ ✅ 部署成功 ↓ ┌─────────────────────────┐ │ Job 3: notify │ │ · 推送到 Notion 变更日志│ │ · 霜砚可读取部署记录 │ └─────────────────────────┘ ↓ 网站自动更新 · 霜砚同步感知 · 妈妈零操作 ✅ ``` --- ## ✅ 铸渊执行清单(读到就做·不等人) ```jsx 铸渊 CD 部署清单 · YM-CD-20260307-001 来源:曜冥(人格总控)→ 铸渊(GitHub执行体) 时间:2026-03-07 状态:待铸渊执行 ━━━ 已确认环境(来自 DEV-005 SYSLOG BC-部署-001-XCM)━━━ · 部署方式:方案 B(VPS + Nginx) · 服务器:Linux VPS(SSH 登录) · Web 服务器:Nginx - location / → 静态文件服务(当前指向 status-board) - 保留原有 API + Webhook 反向代理配置 · 当前首页:status-board/ 模块 · SSL:⚠️ 证书缺失,HTTPS 待修复 ━━━ 执行步骤 ━━━ ① 创建 Workflow 文件 · 使用方案 B:.github/workflows/deploy-to-server.yml · 触发条件:push to main(排除 persona-brain/broadcasts/syslog 等非代码路径) ② 配置 GitHub Secrets(在仓库 Settings → Secrets → Actions) · DEPLOY_HOST → 服务器 IP · DEPLOY_USER → SSH 用户名 · DEPLOY_KEY → SSH 私钥 · DEPLOY_PATH → Nginx 静态文件目录(小草莓配置的 location / root 路径) · ❗ 妈妈需要提供服务器 SSH 信息,铸渊无法自行获取 ③ 在 validate job 中接入校验脚本 · contract-check.js(如存在) · route-align-check.js(如存在) · 脚本不存在则跳过(不阻断部署) ④ 配置 notify job · 复用已有的 NOTION_TOKEN secret · 推送部署记录到变更日志数据库 ⑤ rsync 排除规则 · 排除 .github/ 、syslog-inbox/ 、syslog-processed/ 、broadcasts-outbox/ 、scripts/ 、.git/ · 只同步前端代码目录到服务器 ⑥ 测试 · push 一个小改动到 main · 确认 Actions 运行成功 · 确认 guanghulab.com 更新 · 确认 Notion 变更日志收到部署通知 ━━━ 验收标准 ━━━ · push to main → 60秒内触发部署 · guanghulab.com 自动更新到最新代码 · 校验失败时部署被阻断 · Notion 变更日志自动记录每次部署 · Nginx 现有 API/Webhook 配置不受影响 ━━━ 执行确认 ━━━ 铸渊完成后,在本页下方追加一行: ✅ YM-CD-20260307-001 已部署 · [日期时间] · commit SHA ``` --- --- ## 📥 部署现状报告(DEV-005 SYSLOG · 2026-03-07 17:30) | **步骤** | **状态** | **说明** | | --- | --- | --- | | SSH 登录 | ✅ | 成功 | | Git 安装 | ✅ | 成功 | | Clone 仓库 | ✅ | 成功 | | 复制代码 | ✅ | frontend 为空,果断改用 status-board | | Nginx 配置 | ✅ | 解决主配置文件冲突,保留 API/Webhook 转发 | | SSL 证书 | ⚠️ | 证书缺失,HTTPS 待修复 | | 浏览器测试 | ✅ | [guanghulab.com](http://guanghulab.com) 显示看板✅ | **待解决**: 1. ⚠️ SSL 证书申请/修复 → 开启 HTTPS 2. ⏳ 肃猖上传完整 frontend 代码后切换首页 3. ✅ 铸渊已创建 deploy-to-server.yml(200行,3 Job) 4. ✅ GitHub Secrets 已配置(DEPLOY_HOST / USER / KEY / PATH) 5. ✅ SSH 密钥已生成并配置到 authorized_keys 6. ⚠️ PR 合并被分支保护规则阻止,待解除后首次触发 CD 7. ⏳ Vercel 旧部署触发被限流(不影响铸渊 CD) --- ## 🔗 关联文档 - 铸渊协作指令主页:[⚒️ 铸渊·协作指令|GitHub ↔ Notion 桥接协议](../%E2%9A%92%EF%B8%8F%20%E9%93%B8%E6%B8%8A%C2%B7%E5%8D%8F%E4%BD%9C%E6%8C%87%E4%BB%A4%EF%BD%9CGitHub%20%E2%86%94%20Notion%20%E6%A1%A5%E6%8E%A5%E5%8D%8F%E8%AE%AE%201e27db07f7884441bf4ca6c931cadab9.md) - GitHub → Notion 数据桥:[🔧 铸渊协作指令:GitHub → Notion 数据桥 v1.0(霜砚签发·2026-03-06)](%F0%9F%94%A7%20%E9%93%B8%E6%B8%8A%E5%8D%8F%E4%BD%9C%E6%8C%87%E4%BB%A4%EF%BC%9AGitHub%20%E2%86%92%20Notion%20%E6%95%B0%E6%8D%AE%E6%A1%A5%20v1%200%EF%BC%88%E9%9C%9C%E7%A0%9A%E7%AD%BE%E5%8F%91%C2%B72026-03-06%EF%BC%89%20287fb1e1f2664778905484241588c96b.md) - HLI 接口注册表:[🔌 HLI接口注册表 · HoloLake Interface Registry](../%F0%9F%94%8C%20HLI%E6%8E%A5%E5%8F%A3%E6%B3%A8%E5%86%8C%E8%A1%A8%20%C2%B7%20HoloLake%20Interface%20Registry%200d39aed8d3c843b4a34970060f6815d9.md) - 模块指纹注册表:[🔍 模块指纹注册表 · Module Fingerprint Registry](../%F0%9F%94%8D%20%E6%A8%A1%E5%9D%97%E6%8C%87%E7%BA%B9%E6%B3%A8%E5%86%8C%E8%A1%A8%20%C2%B7%20Module%20Fingerprint%20Registry%20d82f3480500945e9a31f9693cdb69b65.md) - GitHub 自动化指令:[⚙️ GitHub 自动化指令 · HoloLake CI/CD + Copilot Rules](../%F0%9F%8C%8A%20%E6%9B%9C%E5%86%A5%E7%BA%AA%E5%85%83%20%C2%B7%20HoloLake%20Era%20%C2%B7%20AGE%20OS%20v1%200/%E2%9A%A1%20%E5%85%89%E6%B9%96%E4%B8%AD%E5%A4%AE%E6%9E%A2%E7%BA%BD%20%C2%B7%20HoloLake%20Central%20Hub/%E2%9A%99%EF%B8%8F%20GitHub%20%E8%87%AA%E5%8A%A8%E5%8C%96%E6%8C%87%E4%BB%A4%20%C2%B7%20HoloLake%20CI%20CD%20+%20Copilot%20Rules%2027b85613b97e4014b0e47fdc91b20dbb.md) - 仓库地址:[https://github.com/qinfendebingshuo/guanghulab](https://github.com/qinfendebingshuo/guanghulab) - 线上网站:[https://guanghulab.com/](https://guanghulab.com/)