存儲、容器與 CI
獨立 Evolver 的節點身份、資產、事件、mailbox、記憶和日誌有不同的保存責任。先確定持久化佈局,再將同一運行契約部署到服務、容器或 CI;Desktop 的內部目錄由應用管理。
為數據選擇保存方式
| 數據 | 長期實例 | 臨時 CI |
|---|---|---|
| 身份與憑證 | 受保護存儲,重啓後保持歸屬 | 按任務需要從 secret manager 注入 |
| 資產與事件 | 持久卷並有一致性備份 | 按 job 隔離,按交付需要導出 |
| mailbox 與隊列 | 保留在途狀態,單實例協調寫入 | 不復用其他 job 的可寫運行狀態 |
| 項目工作區 | 明確倉庫、權限與恢復點 | 每個 job 獨立 checkout |
| 日誌 | 輪轉並保留必要審計 | 導出脱敏結果,不緩存憑證 |
路徑的具體優先級與目錄參考見資產路徑。多個實例不能僅憑節點 ID 相同就共享可寫數據庫或資產目錄。
配置實例的啓動環境
支持環境文件的入口使用 EVOLVER_ENV_FILE 或對應 --env-file 選擇文件;該加載器用文件同名值覆蓋傳入環境。核對服務管理器、啓動參數與文件,避免維護多套衝突配置。修改後重啓對應進程。
用 evolver doctor 核對配置來源與連接,不輸出完整進程環境。鏡像只包含程序和非秘密依賴,憑證通過運行環境注入;身份與資產不能被打進公開鏡像層。
示例:CI 中運行有限診斷
下面是 POSIX runner 的執行片段。由 CI 平台預先提供獨立的 RUNNER_TEMP,安裝所需 Node.js、Git 和 Evolver,並將需要的憑證注入受保護環境:
export EVOLVER_HOME="$RUNNER_TEMP/evolver-home"
export EVOLVER_TASK_RECEIVER=0
export EVOLVER_ATP_AUTOBUY=off
export EVOLVER_ATP_AUTODELIVER=off
evolver doctor
evolver cycle capabilities --json
這是環境與能力診斷,不執行進化任務或發佈。需要執行的 job 另行聲明倉庫、材料、執行器、驗證與超時;普通 CI 不啓動無限循環。原始診斷報告含本地路徑,上傳前檢查敏感信息。
示例:容器診斷與 GitHub Actions
在單獨的示例目錄保存下面的 Dockerfile。鏡像安裝 Node.js、Git 和 Evolver,以非 root 賬號運行;默認命令只做診斷,不啓動 Proxy、任務接收器或循環。
FROM node:22-bookworm-slim
RUN apt-get update && apt-get install -y --no-install-recommends git ca-certificates \
&& rm -rf /var/lib/apt/lists/*
RUN npm install --global @evomap/evolver \
&& mkdir -p /workspace /home/node/.evomap \
&& chown -R node:node /workspace /home/node/.evomap
ENV EVOLVER_HOME=/home/node/.evomap \
EVOMAP_HOME=/home/node/.evomap \
EVOLVER_TASK_RECEIVER=0 \
EVOLVER_ATP_AUTOBUY=off \
EVOLVER_ATP_AUTODELIVER=off
USER node
WORKDIR /workspace
VOLUME ["/home/node/.evomap"]
CMD ["evolver", "doctor"]
將示例目錄作為構建上下文,只掛載允許檢查的非敏感示例項目。以下命令適用於 POSIX shell;PowerShell 使用實際絕對路徑替換 source=$PWD 部分。
docker build -t evolver-tools .
docker volume create evolver-example-home
docker run --rm \
--mount type=volume,source=evolver-example-home,target=/home/node/.evomap \
--mount "type=bind,source=$PWD,target=/workspace,readonly" \
evolver-tools
docker run --rm \
--mount type=volume,source=evolver-example-home,target=/home/node/.evomap \
--mount "type=bind,source=$PWD,target=/workspace,readonly" \
evolver-tools evolver cycle capabilities --json
兩個容器順序使用同一卷,分別核對 doctor 與 capabilities 的輸出。獨立實例使用不同卷;不要讓兩個常駐寫入者共享這個卷。源碼只讀掛載適用於本例診斷;執行修復需要單獨授權的可寫工作區,不能簡單移除只讀限制後運行任意任務。
鏡像內不配置節點 secret。需要聯網的實例通過運行平台的 secret store 或只讀環境文件掛載取得憑證,不把憑證 COPY 進鏡像。已有卷權限錯誤時核對鏡像賬號 UID、目錄所有者和掛載點,不使用全局可寫權限解決。
下面保存為 .github/workflows/evolver-diagnostics.yml,通過 workflow_dispatch 手動運行:
name: Evolver diagnostics
on:
workflow_dispatch:
permissions:
contents: read
jobs:
diagnose:
runs-on: ubuntu-latest
timeout-minutes: 5
env:
EVOLVER_HOME: ${{ runner.temp }}/evolver-${{ github.run_id }}-${{ github.run_attempt }}
EVOMAP_HOME: ${{ runner.temp }}/evolver-${{ github.run_id }}-${{ github.run_attempt }}
EVOLVER_TASK_RECEIVER: "0"
EVOLVER_ATP_AUTOBUY: "off"
EVOLVER_ATP_AUTODELIVER: "off"
steps:
- uses: actions/checkout@v4
with:
persist-credentials: false
- uses: actions/setup-node@v4
with:
node-version: "22"
- name: Install Evolver
run: npm install --global @evomap/evolver
- name: Inspect the isolated runtime
shell: bash
run: |
set -euo pipefail
mkdir -p "$EVOLVER_HOME"
git status --short --branch
evolver doctor
evolver cycle capabilities --json
這份工作流每次使用獨立運行目錄,只做本地診斷與能力檢查,不執行進化、領取任務或發佈。npm 安裝會訪問包倉庫;診斷通過不代表業務任務已經執行。doctor 失敗時保留失敗結果,修復對應配置後重新運行,不設置 continue-on-error 來掩蓋失敗。
用於可復現交付時,將全局安裝改為倉庫管理的本地依賴,使用審核通過的精確版本,提交 package.json 與依賴鎖文件,通過 npm ci 安裝,並調用已安裝的 node_modules/.bin/evolver。npm 全局安裝不讀取項目鎖文件。容器中把這兩份依賴清單複製到獨立工具目錄,在該目錄執行 npm ci 並使用本地可執行文件。基礎鏡像與 Actions 固定到已審核的不可變摘要或提交 SHA。運行前完成這些輸入的解析與審核;上面的診斷示例使用包倉庫與標籤解析,不提供可復現的依賴圖。
接入業務 CI 時,單獨增加項目材料、執行器、驗證命令與產物檢查,並按倉庫交付標準運行。複用依賴緩存不包括整個 Evolver home;需要保留資產時先按同步與導出流程生成無憑證歸檔。容器的持久化與重啓檢查步驟見下節。
容器與重啓驗收
- 使用非特權運行用户,掛載獨立的可寫運行目錄,源碼與秘密按實際需要提供最小訪問範圍。
- 在實例中創建或導入一組允許保存的資產,記錄 ID 與數量。
- 停止寫入後重啓容器,核對節點、資產、引用和未完成隊列。
- 啓動第二個實例時提供獨立目錄,確認不會重複消費同一隊列。
- 恢復演練核對實際內容,不只檢查卷已掛載。
運行賬號必須能讀寫自己的持久化目錄,不能為解決權限錯誤而讓所有實例共享無限制目錄。部署細節見容器與 CI,持續進程的接入與停止見任務隊列。