處理 AI review findings 並改寫 Node.js entrypoint #1

Merged
jiantw83 merged 58 commits from ai-review-resolve/20260624102518 into develop 2026-06-24 14:09:27 +00:00
Showing only changes of commit c77a928bb2 - Show all commits
+110 -3
View File
@@ -4,7 +4,8 @@
"role": "Assassin",
"location": "Dockerfile:13",
"problem": "直接將網際網路的腳本經由 pipe 傳送給 shell 執行 (curl | sh) 極度危險,且缺乏驗證,極易導致容器建置階段遭劫持或執行惡意代碼。",
"suggestion": "應先將腳本下載至本地,透過 sha256sum 或 gpg 驗證其完整性與來源可靠性後,再執行安裝。"
"suggestion": "應先將腳本下載至本地,透過 sha256sum 或 gpg 驗證其完整性與來源可靠性後,再執行安裝。",
"is_new": false
},
{
"level": "critical",
@@ -30,18 +31,124 @@
"suggestion": "應為 `entrypoint.sh` 補上單元測試,模擬各種環境變數設定及 `codex exec` 的成功與失敗路徑,並驗證對應的退出碼。",
"is_new": false
},
{
"level": "critical",
"role": "Leo",
"location": "entrypoint.sh:31",
"problem": "在腳本中使用了 `mv` 指令將臨時產生的 `auth.json` 移至 `$CODEX_HOME/auth.json`。若在此之前 `$CODEX_HOME/auth.json` 已經存在,`mv` 會強制覆蓋,這可能會導致隱蔽的配置遺失,且這種副作用在腳本執行中非常危險,不利於除錯。",
"suggestion": "在寫入設定檔前,應先檢查目標檔案是否存在,並根據業務需求決定是要備份、合併或拋出錯誤,避免無意間覆蓋掉重要的設定。",
"is_new": true
},
{
"level": "critical",
"role": "Mage",
"location": "entrypoint.sh:38",
"problem": "在執行 `codex exec` 前便呼叫 `trap - EXIT` 移除了清理機制。若 `codex exec` 執行失敗或中斷,包含敏感憑證的 `auth.json` 將殘留在容器中,未能被安全刪除。",
"suggestion": "應在 `codex exec` 完成後,或確保程式結束時(包含失敗的情況)都能正確執行刪除 `auth.json` 的邏輯。",
"is_new": true
},
{
"level": "warning",
"role": "Leo",
"location": "Dockerfile:20",
"problem": "在建置期透過網路安裝插件,增加建置複雜度、時間,且對外部網路依賴過高,不可重現。",
"suggestion": "建議將插件預先打包在映像檔中,或使用特定版本的 manifest 檔案管理相依性。"
"suggestion": "建議將插件預先打包在映像檔中,或使用特定版本的 manifest 檔案管理相依性。",
"is_new": false
},
{
"level": "warning",
"role": "Maya",
"location": "entrypoint.sh:22",
"problem": "對於 `GITHUB_OUTPUT` 的處理與 `codex exec` 的執行結果缺乏測試驗證,導致失敗無法即時報告。",
"suggestion": "應補測試案例驗證各變數設定情況下的執行行為,並將 `codex exec` 的結果納入錯誤報告機制。"
"suggestion": "應補測試案例驗證各變數設定情況下的執行行為,並將 `codex exec` 的結果納入錯誤報告機制。",
"is_new": false
},
{
"level": "warning",
"role": "Bard",
"problem": "輸入參數 `oauth` 實質為 base64 編碼的 json,命名易生誤解。",
"suggestion": "建議更名為 `auth_config` 或 `encoded_auth_json`。",
"location": "action.yaml:4",
"is_new": false
},
{
"level": "warning",
"role": "Rogue",
"problem": "在 Dockerfile 中安裝了 git 且未清理,導致映像檔過大。",
"suggestion": "建議在同一層 RUN 指令中以 --virtual 安裝 git,完成後立即刪除。",
"location": "Dockerfile:4",
"is_new": false
},
{
"level": "warning",
"role": "Bard",
"location": "entrypoint.sh:5",
"problem": "腳本中多次重複使用相同的錯誤訊息輸出模式 (`echo ... >&2; exit 1`),缺乏統一的風格與節奏。",
"suggestion": "建議定義一個輕量的錯誤處理函數(例如 `die()`),將錯誤訊息處理統一化,讓腳本主體的旋律更為整齊。",
"is_new": true
},
{
"level": "warning",
"role": "Leo",
"location": "Dockerfile:17",
"problem": "在 Dockerfile 中直接使用 `curl` 下載並執行安裝腳本 (`sh \"$install_script\"`) 存在潛在的安全風險與不確定性,且沒有檢查腳本的完整性或簽章。若腳本內容在未來變更,可能導致映像檔建置失敗或植入非預期的內容,增加維護與安全風險。",
"suggestion": "建議將安裝腳本改為明確的版本化下載,或者如果可能,將安裝邏輯整合進 Dockerfile 自身,以確保建置過程的冪等性與安全性。",
"is_new": true
},
{
"level": "warning",
"role": "Leo",
"location": "Dockerfile:22",
"problem": "將插件安裝邏輯分散在多個 `RUN` 指令中,若其中一個插件安裝失敗,後續的建置流程仍會嘗試執行,且可能會留下殘留狀態,導致建置結果不可預測。",
"suggestion": "建議將相關插件安裝指令整合到單一的 `RUN` 指令中,並加入錯誤處理與清理機制,確保安裝過程的原子性。",
"is_new": true
},
{
"level": "warning",
"role": "Leo",
"location": "entrypoint.sh:36",
"problem": "直接執行 `codex exec` 而未對其可能的執行失敗進行顯式的錯誤捕捉。若該指令失敗,腳本仍會繼續執行後續步驟(例如設定 GitHub Output),這會導致對外回報錯誤的狀態碼不一致。",
"suggestion": "應對 `codex exec` 進行錯誤檢查(使用 `if ! codex exec ...; then ... fi`),確保在失敗時能正確終止腳本並輸出相關錯誤訊息。",
"is_new": true
},
{
"level": "warning",
"role": "Mage",
"location": "entrypoint.sh:27",
"problem": "若 `$OAUTH` 的值開頭為 `-``printf '%s' \"$OAUTH\"` 會被 `printf` 解析為參數選項,導致無法正確輸出內容。",
"suggestion": "改用 `printf '%s\n' \"$OAUTH\"` 或其他不會將變數內容解析為選項的方式。",
"is_new": true
},
{
"level": "warning",
"role": "Mage",
"location": "entrypoint.sh:36",
"problem": "`mv` 指令未檢查目標檔案是否已存在,無條件覆蓋會導致舊有的有效設定直接遺失。",
"suggestion": "在 `mv` 前加入檢查,若 `auth.json` 已存在,應決定是否備份、報錯,或確認無須保留舊檔。",
"is_new": true
},
{
"level": "warning",
"role": "Rogue",
"location": "Dockerfile:25",
"problem": "插件安裝指令採取連續序列執行,導致多次獨立的網路 I/O 等待,嚴重浪費建置時間(估計浪費數秒)。",
"suggestion": "檢查 codex CLI 是否支援批次安裝,若不支援,考慮將指令改為並行處理(例如:command1 & command2 & wait)以同時發送網路請求。",
"is_new": true
},
{
"level": "info",
"role": "Bard",
"location": "Dockerfile:20",
"problem": "插件安裝指令全部擠在同一個 `RUN` 指令中,缺乏視覺上的區隔,讓整個安裝流程顯得雜亂無章。",
"suggestion": "建議使用反斜線將指令換行,並在市場加入與插件安裝之間加入空行或註解,以增強指令的可讀性。",
"is_new": true
},
{
"level": "info",
"role": "Leo",
"location": "entrypoint.sh:16",
"problem": "硬編碼了預設路徑 `/root/.codex`,這使得映像檔的可移植性受限,且如果在非 root 使用者環境下執行此容器,可能會因為權限問題而失敗。",
"suggestion": "建議將 `CODEX_HOME` 的預設值改為環境變數設定,並在 Dockerfile 中將該目錄的擁有權設定給執行應用程式的使用者,提升環境適應力。",
"is_new": true
}
]