處理 AI review findings 並改寫 Node.js entrypoint #1
@@ -22,5 +22,35 @@
|
|||||||
"role": "Rogue",
|
"role": "Rogue",
|
||||||
"original_finding": "在腳本中頻繁進行 I/O 操作(重複寫入 auth.json),缺乏快取檢查。",
|
"original_finding": "在腳本中頻繁進行 I/O 操作(重複寫入 auth.json),缺乏快取檢查。",
|
||||||
"reason": "每次 Docker Action 執行都是短生命週期容器,auth.json 需要從當次 secret 重建;快取檢查不會降低跨執行 I/O,也可能增加 secret 狀態判斷複雜度。"
|
"reason": "每次 Docker Action 執行都是短生命週期容器,auth.json 需要從當次 secret 重建;快取檢查不會降低跨執行 I/O,也可能增加 secret 狀態判斷複雜度。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "action.yaml:4",
|
||||||
|
"role": "Bard",
|
||||||
|
"original_finding": "輸入參數 `oauth` 實質為 base64 編碼的 json,命名易生誤解。",
|
||||||
|
"reason": "此 action 已對外發布並由既有 workflow 使用 oauth input;直接更名會造成破壞性變更,先保留相容介面與描述文字。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "Dockerfile:4",
|
||||||
|
"role": "Rogue",
|
||||||
|
"original_finding": "在 Dockerfile 中安裝了 git 且未清理,導致映像檔過大。",
|
||||||
|
"reason": "Codex CLI 與 plugin 安裝/執行流程可能需要 git 支援;為避免 runtime 缺少 git 造成 action 失敗,目前保留 git。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "Dockerfile:25",
|
||||||
|
"role": "Rogue",
|
||||||
|
"original_finding": "插件安裝指令採取連續序列執行,導致多次獨立的網路 I/O 等待,嚴重浪費建置時間。",
|
||||||
|
"reason": "codex plugin 指令會修改同一份本機 plugin 狀態,並行安裝可能造成狀態競爭;目前保留循序安裝以確保可預測性。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "entrypoint.sh:22",
|
||||||
|
"role": "Leo",
|
||||||
|
"original_finding": "直接使用 `mktemp` 在 `CODEX_HOME` 目錄下建立臨時檔案,且 `CODEX_HOME` 若未正確隔離,在多個 Action 同時執行時可能會導致檔案名稱衝突。",
|
||||||
|
"reason": "Docker Action 每次執行都有獨立容器與 CODEX_HOME;mktemp 也會建立隨機檔名,實務上不會跨 action 執行衝突。"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"location": "entrypoint.sh:16",
|
||||||
|
"role": "Leo",
|
||||||
|
"original_finding": "硬編碼了預設路徑 `/root/.codex`,這使得映像檔的可移植性受限,且如果在非 root 使用者環境下執行此容器,可能會因為權限問題而失敗。",
|
||||||
|
"reason": "Dockerfile 明確以 root 環境執行並設定 CODEX_HOME=/root/.codex;entrypoint 仍允許呼叫端用 CODEX_HOME 覆寫預設路徑。"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -23,30 +23,6 @@
|
|||||||
"suggestion": "應在測試套件中加入 Docker 映像檔的整合測試,驗證容器啟動後 `codex --version` 及插件列表是否存在。",
|
"suggestion": "應在測試套件中加入 Docker 映像檔的整合測試,驗證容器啟動後 `codex --version` 及插件列表是否存在。",
|
||||||
"is_new": false
|
"is_new": false
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"level": "critical",
|
|
||||||
"role": "Maya",
|
|
||||||
"location": "entrypoint.sh:18",
|
|
||||||
"problem": "修改了 `entrypoint.sh` 的核心邏輯以執行 `codex exec`,但缺乏驗證執行是否成功的測試案例(例如:當 `OAUTH` 錯誤、`MODEL` 無效或 `codex exec` 本身拋出錯誤時的處理)。",
|
|
||||||
"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": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "critical",
|
|
||||||
"role": "Mage",
|
|
||||||
"location": "entrypoint.sh:38",
|
|
||||||
"problem": "在執行 `codex exec` 前便呼叫 `trap - EXIT` 移除了清理機制。若 `codex exec` 執行失敗或中斷,包含敏感憑證的 `auth.json` 將殘留在容器中,未能被安全刪除。",
|
|
||||||
"suggestion": "應在 `codex exec` 完成後,或確保程式結束時(包含失敗的情況)都能正確執行刪除 `auth.json` 的邏輯。",
|
|
||||||
"is_new": false
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"level": "warning",
|
"level": "warning",
|
||||||
"role": "Leo",
|
"role": "Leo",
|
||||||
@@ -55,37 +31,6 @@
|
|||||||
"suggestion": "建議將插件預先打包在映像檔中,或使用特定版本的 manifest 檔案管理相依性。",
|
"suggestion": "建議將插件預先打包在映像檔中,或使用特定版本的 manifest 檔案管理相依性。",
|
||||||
"is_new": false
|
"is_new": false
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Maya",
|
|
||||||
"location": "entrypoint.sh:22",
|
|
||||||
"problem": "對於 `GITHUB_OUTPUT` 的處理與 `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()`),將錯誤訊息處理統一化。"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"level": "warning",
|
"level": "warning",
|
||||||
"role": "Leo",
|
"role": "Leo",
|
||||||
@@ -94,84 +39,6 @@
|
|||||||
"suggestion": "建議將安裝腳本改為明確的版本化下載,或者如果可能,將安裝邏輯整合進 Dockerfile 自身,以確保建置過程的冪等性與安全性。",
|
"suggestion": "建議將安裝腳本改為明確的版本化下載,或者如果可能,將安裝邏輯整合進 Dockerfile 自身,以確保建置過程的冪等性與安全性。",
|
||||||
"is_new": false
|
"is_new": false
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Leo",
|
|
||||||
"location": "Dockerfile:22",
|
|
||||||
"problem": "將插件安裝邏輯分散在多個 `RUN` 指令中,若其中一個插件安裝失敗,後續的建置流程仍會嘗試執行,且可能會留下殘留狀態,導致建置結果不可預測。",
|
|
||||||
"suggestion": "建議將相關插件安裝指令整合到單一的 `RUN` 指令中,並加入錯誤處理與清理機制,確保安裝過程的原子性。",
|
|
||||||
"is_new": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Leo",
|
|
||||||
"location": "entrypoint.sh:36",
|
|
||||||
"problem": "直接執行 `codex exec` 而未對其可能的執行失敗進行顯式的錯誤捕捉。若該指令失敗,腳本仍會繼續執行後續步驟(例如設定 GitHub Output),這會導致對外回報錯誤的狀態碼不一致。",
|
|
||||||
"suggestion": "應對 `codex exec` 進行錯誤檢查(使用 `if ! codex exec ...; then ... fi`),確保在失敗時能正確終止腳本並輸出相關錯誤訊息。",
|
|
||||||
"is_new": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Mage",
|
|
||||||
"location": "entrypoint.sh:27",
|
|
||||||
"problem": "若 `$OAUTH` 的值開頭為 `-`,`printf '%s' \"$OAUTH\"` 會被 `printf` 解析為參數選項,導致無法正確輸出內容。",
|
|
||||||
"suggestion": "改用 `printf '%s\n' \"$OAUTH\"` 或其他不會將變數內容解析為選項的方式。",
|
|
||||||
"is_new": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Rogue",
|
|
||||||
"location": "Dockerfile:25",
|
|
||||||
"problem": "插件安裝指令採取連續序列執行,導致多次獨立的網路 I/O 等待,嚴重浪費建置時間。",
|
|
||||||
"suggestion": "檢查 codex CLI 是否支援批次安裝,若不支援,考慮將指令改為並行處理。"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Leo",
|
|
||||||
"location": "entrypoint.sh:22",
|
|
||||||
"problem": "直接使用 `mktemp` 在 `CODEX_HOME` 目錄下建立臨時檔案,且 `CODEX_HOME` 若未正確隔離,在多個 Action 同時執行時可能會導致檔案名稱衝突。",
|
|
||||||
"suggestion": "確保每個執行個體有隔離的執行環境,或使用更具隨機性的檔名命名機制,並在程式碼中明確處理資源鎖定。",
|
|
||||||
"is_new": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Mage",
|
|
||||||
"location": "entrypoint.sh:26",
|
|
||||||
"problem": "使用了 `mktemp` 建立 `auth_file`,但隨後直接透過 `mv` 將其移動到 `CODEX_HOME/auth.json`。如果目標檔案已存在,此操作會覆寫且若權限設定不當會造成安全隱患;且 `trap` 在 `mv` 後已移除,若處理中斷可能留下暫存檔。",
|
|
||||||
"suggestion": "建議直接將 base64 解碼內容寫入 `$CODEX_HOME/auth.json`,並在寫入前先設定好目錄權限,或使用 `install -m 600` 指令來確保原子性與權限安全。",
|
|
||||||
"is_new": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Mage",
|
|
||||||
"location": "entrypoint.sh:37",
|
|
||||||
"problem": "執行 `codex exec` 的邏輯中使用了 `set +e` 暫時關閉錯誤退出機制,儘管後續透過 `PIPESTATUS` 檢查,但若 `codex exec` 指令本身因為環境錯誤或語法錯誤無法啟動,`codex_status` 可能會取得非預期的狀態碼。",
|
|
||||||
"suggestion": "明確定義各個步驟的錯誤處理,或者將 `codex exec` 包裝在明確的函數中檢查退出碼。"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Maya",
|
|
||||||
"location": "entrypoint.sh:6",
|
|
||||||
"problem": "OAUTH 為必填參數,但缺少針對 OAUTH 為空字串或未定義時的行為測試。",
|
|
||||||
"suggestion": "應在測試案例中模擬空 OAUTH 輸入,並驗證腳本是否正確拋出錯誤並以 exit 1 終止。",
|
|
||||||
"is_new": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Maya",
|
|
||||||
"location": "entrypoint.sh:11",
|
|
||||||
"problem": "MODEL 為必填參數,但缺少針對 MODEL 為空字串或未定義時的行為測試。",
|
|
||||||
"suggestion": "應在測試案例中模擬空 MODEL 輸入,並驗證腳本是否正確拋出錯誤並以 exit 1 終止。",
|
|
||||||
"is_new": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "warning",
|
|
||||||
"role": "Maya",
|
|
||||||
"location": "entrypoint.sh:27",
|
|
||||||
"problem": "解碼後的 auth.json 格式驗證(jq 檢查)未被測試,若輸入無效 JSON 或非 object,目前行為是否如預期未驗證。",
|
|
||||||
"suggestion": "應補上測試案例,傳入無效的 Base64 字串或解碼後非 JSON 的內容,驗證腳本能否正確捕獲錯誤。",
|
|
||||||
"is_new": true
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"level": "info",
|
"level": "info",
|
||||||
"role": "Bard",
|
"role": "Bard",
|
||||||
@@ -179,21 +46,5 @@
|
|||||||
"problem": "插件安裝指令全部擠在同一個 `RUN` 指令中,缺乏視覺上的區隔,讓整個安裝流程顯得雜亂無章。",
|
"problem": "插件安裝指令全部擠在同一個 `RUN` 指令中,缺乏視覺上的區隔,讓整個安裝流程顯得雜亂無章。",
|
||||||
"suggestion": "建議使用反斜線將指令換行,並在市場加入與插件安裝之間加入空行或註解,以增強指令的可讀性。",
|
"suggestion": "建議使用反斜線將指令換行,並在市場加入與插件安裝之間加入空行或註解,以增強指令的可讀性。",
|
||||||
"is_new": false
|
"is_new": false
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "info",
|
|
||||||
"role": "Leo",
|
|
||||||
"location": "entrypoint.sh:16",
|
|
||||||
"problem": "硬編碼了預設路徑 `/root/.codex`,這使得映像檔的可移植性受限,且如果在非 root 使用者環境下執行此容器,可能會因為權限問題而失敗。",
|
|
||||||
"suggestion": "建議將 `CODEX_HOME` 的預設值改為環境變數設定,並在 Dockerfile 中將該目錄的擁有權設定給執行應用程式的使用者,提升環境適應力。",
|
|
||||||
"is_new": false
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"level": "info",
|
|
||||||
"role": "Mage",
|
|
||||||
"location": "entrypoint.sh:45",
|
|
||||||
"problem": "在 GitHub Actions 輸出處理中,使用了 `date +%s` 來產生 output delimiter。雖然發生機率極低,但在極高併發或相同執行時間下可能發生碰撞導致輸出被截斷。",
|
|
||||||
"suggestion": "建議使用更具隨機性的 UUID 或確保 delimiter 包含隨機字串,避免與內容衝突。",
|
|
||||||
"is_new": true
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user