本卡屬 FR-167(母卡 CM-3241),卡 P1-1,階段 P1 升級變安全、批 1。只改 BE(主 repo,Repo 欄空著)。依賴:無。

這張卡做什麼(白話)

客戶主機上那道 guidantai upgrade 指令現在是一支 3,000 行的腳本一路跑到底。這張卡把它改成「先把自己換成新包裡的新版,再一步一步呼叫 lib/ 底下的小檔」,每一步有時限、有進度檔。後面十張 P1 卡只要各填自己那一支小檔,不用再碰大檔。

為什麼切這一張

整個第一期的骨架與登記檔 owner;時限框架與進度檔格式一次定,後面十張卡照它填

reuse/extend/new

extend:guidantai 派送段加兩個子命令、install.sh 的 run_upgrade 改成逐步呼叫 lib/upgrade_runner.sh,兩支都超標只准一行呼叫。登記型檔集中:這張卡一次開好 scripts/installer/lib/ 下所有步驟檔的空殼(preflight/drain/db_copy/apply_on_copy/health/switch/rollback/boot_check/cleanup/order/release_keys/systemd_units),後面的卡只填自己的檔

在哪裡

repo:~/Projects/Billows/Audit-Manager/compliance-manager-be
改既有:scripts/installer/guidantai 1562(派送兩行、source lib)
改既有:scripts/installer/install.sh 3021(run_upgrade 改呼叫 runner;install_ops_cli 連 lib/ 一起裝)
新開:scripts/installer/lib/upgrade_runner.sh(step/timeout/寫進度)
新開:scripts/installer/lib/progress.sh(upgrade-progress.json 讀寫,只有這裡寫)
新開:scripts/installer/lib/self_replace.sh(D30:從已驗包取 guidantai+lib 換掉 /usr/local/bin 後 exec)
新開:scripts/installer/lib/upgrade_{preflight,drain,db_copy,apply_on_copy,health,switch,rollback,boot_check,cleanup,order}.sh(空殼)
新開:scripts/installer/lib/{release_keys,systemd_units}.sh(空殼)

怎麼做

細節在 design.md §5 對應段(~/Projects/Billows/Audit-Manager/compliance-manager-be/docs/features/FR-167-2610-online-update-channel/design.md,開 design.html 看導覽);本段只列本卡要做到的點:

怎麼驗(開發期:你在本機/DEV 就要能做完)

lib/ 每支 bash -n+shellcheck 綠;bats:self_replace 對一個假包目錄能換掉 --root 指定的暫存 bin 目錄並 exec、簽章驗不過時暫存目錄一個位元組都沒變;runner 對一支 sleep 5 的假步驟給 2 秒時限 → 非零、進度檔 status=timeout;進度檔格式照 design §5.1(jq 驗欄位);install.sh 與 guidantai 行數不增加

測試期(不是你做):這張卡在 190 的真實情境是「190:sudo guidantai upgrade <包> 先把自己換成包內版本(guidantai --version 是新版)再往下跑」,由首腦在測試期操作、決策者看畫面。你只要確保上面的本機驗收全過、程式對這個情境沒有寫死假設。