本卡屬 FR-114(母卡 CM-2019)。188 全量 build 連四次失敗後,首腦派唯讀 agent 對 v1.20.0 與 fix/security-b1 整批盤點打包差異,本卡收掉盤點出的所有 build 腳本問題。只改 BE
scripts/build/,不動產品程式、不發套件。
① smoke 探針⑥用外部 python 在產物目錄跑,但 CM-2053 把 cryptography 編進主程式後,產物目錄裡沒有 cryptography 的 .py,外部 python 找不到 → pdfminer、googleapiclient 兩項報 FAIL,擋住 build。產品本身沒壞:產品開機時 DI 就走過 pdfplumber→pdfminer→cryptography 與 googleapiclient→google.auth→cryptography 兩條 import,開機探針全 PASS。探針自己判斷「是不是在產品內」的方式(cwd 有 guidant-ai 就算)在 smoke 裡永遠成立,邏輯是反的。② 真壞:run5 產物頂層與 guidant-ai 是 700、manifest 600、另 900 個檔缺其他人可讀(首腦 09-24 實查);v1.19 同批檔是 775/664。image 用 COPY 保留權限、擁有者變 root,程式用 setpriv 降到 uid 1000 執行 → 讀不到也執行不了,而且會一路過 image、封包,裝機才炸。推測是跑 build 的 shell umask 077。③ 真壞:188 /opt/guidant-ai-fe 停在 origin/main 的 9708a065,連 fix/security-b1 都沒 fetch 過;build_fe_image.sh 只找目錄不查 commit,會默默用舊前端出 image,前端資安修正全部沒進去。
scripts/build/excluded_pkgs_probe.py:61-89 IN_PRODUCT=cwd 有 guidant-ai;check(binary_only) 在 IN_PRODUCT 時實跑
:190 pdfminer(binary_only)、:200 googleapiclient(非 binary_only)
scripts/build/smoke_release.sh:280-306 探針⑥ 以外部 venv python -S、cwd=dist 目錄執行
scripts/build/build_all.sh 開頭無 umask 設定
scripts/build/build_release.sh 產物組裝完無權限正規化/斷言
scripts/build/build_image.sh:126 rsync -a 原樣保留權限
scripts/build/build_fe_image.sh:32-38 只找 FE 目錄、不檢查 commit
docker/production/Dockerfile:159 COPY dist/ /app/;entrypoint.sh:121,127 setpriv 降 uid 1000
IN_PRODUCT 改成 "__compiled__" in globals()(只有在 Nuitka 編譯產物內執行才為真)。外部 python(含 smoke 的跑法)一律視為非產物。build("drive","v3") 項改 binary_only;兩者 SKIP 訊息寫明「相依 cryptography 已編入 core,外部 python 看不到」,並把 BINARY_ONLY_DEPS 說明補上 cryptography。googleapiclient/discovery_cache/documents/drive.v3.json 存在且非空。build_all.sh 開頭 umask 022。build_release.sh 產物組好後 chmod -R u+rwX,go+rX <dist>,接著斷言 find <dist> ! -perm -o=r 為 0 筆,否則 fail(訊息寫清楚「產物有檔案其他人不可讀,image 內 uid 1000 會讀不到」)。build_image.sh rsync 之後對 staging 目錄再斷言一次。build_fe_image.sh 印出 FE repo 的 git rev-parse HEAD 與目前 branch;新增選項 --expect-ref <ref>(或環境變數),給了就斷言 FE HEAD 等於該 ref 解析出的 commit,不符 fail。build_all.sh 若有 BE 的 ref 概念就把 --expect-ref fix/security-b1 這類參數串過去;沒有就只印出、由操作者看。python scripts/build/excluded_pkgs_probe.py 跑一次,binary_only 項全 SKIP、非 binary_only 照舊(原始碼樹 cwd 沒套件,預期 FAIL,屬探針設計),drive JSON 檢查在原始碼樹報 FAIL(找不到)——證明不會假陽性。