chore: triage review findings
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
[
|
||||
{
|
||||
"level": "critical",
|
||||
"role": "Aria",
|
||||
"location": "Dockerfile",
|
||||
"suggestion": "檔案末尾應包含一個空行,以符合 POSIX 規範並避免工具處理問題。"
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Zara",
|
||||
"location": "Dockerfile:10",
|
||||
"suggestion": "在 `apt-get install` 命令中加入 `--no-install-recommends` 參數是一個很好的優化,它能減少安裝不必要的推薦套件,進而縮小 Docker 映像檔的體積。較小的映像檔能加快建置、推送與拉取的速度,並節省儲存空間。"
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Maya",
|
||||
"location": "entrypoint.sh:28-34",
|
||||
"suggestion": "新增了 `require_index` 函數來驗證 `RELEASE_INDEX` 必須是非負整數。這是一個很好的改進,但需要為此新增測試案例,例如傳入非數字字串或負數,確保腳本能正確地捕捉錯誤並退出。"
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Maya",
|
||||
"location": "entrypoint.sh:83-87",
|
||||
"suggestion": "新增了檢查解壓縮後是否找到 `.nupkg` 檔案的邏輯。這是一個重要的邊界條件處理,請為此新增測試案例,確保當成品中不包含 `.nupkg` 檔案時,腳本能正確地報錯並退出。"
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Zara",
|
||||
"location": "entrypoint.sh:3",
|
||||
"suggestion": "使用 `set -Eeuo pipefail` 是一個良好的 Shell 腳本實踐。它能確保腳本在遇到錯誤時立即終止 (`-e`)、未定義變數時報錯 (`-u`),並在管道命令中捕捉錯誤 (`-o pipefail`)。這提升了腳本的健壯性和可靠性,間接避免因錯誤導致的資源浪費。"
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Zara",
|
||||
"location": "entrypoint.sh:40",
|
||||
"suggestion": "在 `curl` 命令中加入 `-f` (fail fast) 參數,可以在 HTTP 錯誤時立即終止腳本,避免處理無效資料,提高腳本的穩定性。同時,`-L` (follow redirects) 參數確保能正確處理重定向,提升可靠性。"
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Zara",
|
||||
"location": "entrypoint.sh:54",
|
||||
"suggestion": "在 `unzip` 命令中使用 `-q` (quiet) 參數可以抑制詳細輸出,減少控制台 I/O,使日誌更簡潔。這是一個輕微的效能優化和日誌清理。"
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Aria",
|
||||
"location": "entrypoint.sh",
|
||||
"suggestion": "腳本內部變數從 `UPPER_SNAKE_CASE` (例如 `RELEASE_HEADER`) 變更為 `snake_case` (例如 `release_header`),這與 shell 腳本的常見慣例更一致,有助於區分環境變數和內部變數。此為風格改善。"
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Maya",
|
||||
"location": "entrypoint.sh",
|
||||
"suggestion": "此腳本經過重構後,錯誤處理和參數驗證變得更加健壯(例如使用 `set -Eeuo pipefail` 和自定義驗證函數)。為了確保這些改進的穩定性,建議導入一個輕量級的 shell 腳本測試框架(如 `bats` 或 `shunit2`),為所有關鍵函數和端到端流程編寫單元測試和整合測試,以覆蓋各種成功和失敗情境。"
|
||||
}
|
||||
]
|
||||
@@ -1,93 +1 @@
|
||||
[
|
||||
{
|
||||
"level": "critical",
|
||||
"role": "Aria",
|
||||
"location": "Dockerfile",
|
||||
"suggestion": "檔案末尾應包含一個空行,以符合 POSIX 規範並避免工具處理問題。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "critical",
|
||||
"role": "Rex",
|
||||
"location": "entrypoint.sh:82",
|
||||
"suggestion": "移除 `dotnet nuget push` 命令中的 `--allow-insecure-connections` 旗標。透過不安全的 HTTP 連線傳輸 `RUNNER_TOKEN` 等敏感資訊會使其容易被竊聽(中間人攻擊)。請確保您的 NuGet 來源 (`NUGET_SOURCE`) 使用 HTTPS。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "critical",
|
||||
"role": "Maya",
|
||||
"location": "entrypoint.sh:88",
|
||||
"suggestion": "目前的邏輯 `nuget_package=\"${nuget_packages[0]}\"` 只會推送找到的第一個 `.nupkg` 檔案。如果發佈成品中包含多個 `.nupkg` 檔案,這將導致其他套件未被推送,與舊版行為(推送所有符合的套件)不符。請明確定義預期行為:如果預期只會有一個,請在找到多個時拋出錯誤;如果預期可能有多個,請修改為迴圈推送所有找到的 `.nupkg` 檔案。務必為此情境新增測試案例。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Zara",
|
||||
"location": "Dockerfile:10",
|
||||
"suggestion": "在 `apt-get install` 命令中加入 `--no-install-recommends` 參數是一個很好的優化,它能減少安裝不必要的推薦套件,進而縮小 Docker 映像檔的體積。較小的映像檔能加快建置、推送與拉取的速度,並節省儲存空間。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Rex",
|
||||
"location": "entrypoint.sh:20",
|
||||
"suggestion": "在 `require_value` 函數中,`printf '%s=%s\\n' \"$name\" \"$value\"` 會將所有傳入的變數名稱及其值印出。這可能導致敏感資訊(例如 `RUNNER_TOKEN`)洩漏到標準輸出或日誌中。建議對敏感變數進行遮蔽處理,或避免將其值印出。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Rex",
|
||||
"location": "entrypoint.sh:65",
|
||||
"suggestion": "使用 `unzip \"$release_name\"` 解壓縮從外部來源下載的檔案時,存在 Zip Slip 漏洞的風險。惡意壓縮檔可能包含路徑遍歷(path traversal)的檔案名稱(例如 `../../etc/passwd`),導致檔案被解壓縮到預期目錄之外。建議在解壓縮前對壓縮檔內容進行更嚴格的驗證,或使用更安全的解壓縮機制來明確防範此類攻擊。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Maya",
|
||||
"location": "entrypoint.sh:28-34",
|
||||
"suggestion": "新增了 `require_index` 函數來驗證 `RELEASE_INDEX` 必須是非負整數。這是一個很好的改進,但需要為此新增測試案例,例如傳入非數字字串或負數,確保腳本能正確地捕捉錯誤並退出。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "warning",
|
||||
"role": "Maya",
|
||||
"location": "entrypoint.sh:83-87",
|
||||
"suggestion": "新增了檢查解壓縮後是否找到 `.nupkg` 檔案的邏輯。這是一個重要的邊界條件處理,請為此新增測試案例,確保當成品中不包含 `.nupkg` 檔案時,腳本能正確地報錯並退出。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Zara",
|
||||
"location": "entrypoint.sh:3",
|
||||
"suggestion": "使用 `set -Eeuo pipefail` 是一個良好的 Shell 腳本實踐。它能確保腳本在遇到錯誤時立即終止 (`-e`)、未定義變數時報錯 (`-u`),並在管道命令中捕捉錯誤 (`-o pipefail`)。這提升了腳本的健壯性和可靠性,間接避免因錯誤導致的資源浪費。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Zara",
|
||||
"location": "entrypoint.sh:40",
|
||||
"suggestion": "在 `curl` 命令中加入 `-f` (fail fast) 參數,可以在 HTTP 錯誤時立即終止腳本,避免處理無效資料,提高腳本的穩定性。同時,`-L` (follow redirects) 參數確保能正確處理重定向,提升可靠性。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Zara",
|
||||
"location": "entrypoint.sh:54",
|
||||
"suggestion": "在 `unzip` 命令中使用 `-q` (quiet) 參數可以抑制詳細輸出,減少控制台 I/O,使日誌更簡潔。這是一個輕微的效能優化和日誌清理。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Aria",
|
||||
"location": "entrypoint.sh",
|
||||
"suggestion": "腳本內部變數從 `UPPER_SNAKE_CASE` (例如 `RELEASE_HEADER`) 變更為 `snake_case` (例如 `release_header`),這與 shell 腳本的常見慣例更一致,有助於區分環境變數和內部變數。此為風格改善。",
|
||||
"is_new": true
|
||||
},
|
||||
{
|
||||
"level": "info",
|
||||
"role": "Maya",
|
||||
"location": "entrypoint.sh",
|
||||
"suggestion": "此腳本經過重構後,錯誤處理和參數驗證變得更加健壯(例如使用 `set -Eeuo pipefail` 和自定義驗證函數)。為了確保這些改進的穩定性,建議導入一個輕量級的 shell 腳本測試框架(如 `bats` 或 `shunit2`),為所有關鍵函數和端到端流程編寫單元測試和整合測試,以覆蓋各種成功和失敗情境。",
|
||||
"is_new": true
|
||||
}
|
||||
]
|
||||
[]
|
||||
|
||||
+43
-9
@@ -11,8 +11,15 @@ section() {
|
||||
require_value() {
|
||||
local name="$1"
|
||||
local value="$2"
|
||||
local display_value="$value"
|
||||
|
||||
printf '%s=%s\n' "$name" "$value"
|
||||
case "$name" in
|
||||
*TOKEN*|*SECRET*|*PASSWORD*|*PASS*|*KEY*)
|
||||
display_value="***"
|
||||
;;
|
||||
esac
|
||||
|
||||
printf '%s=%s\n' "$name" "$display_value"
|
||||
|
||||
if [ -z "$value" ] || [ "$value" = "null" ]; then
|
||||
printf '錯誤:%s 不可為空\n' "$name" >&2
|
||||
@@ -20,6 +27,33 @@ require_value() {
|
||||
fi
|
||||
}
|
||||
|
||||
validate_release_archive() {
|
||||
local archive="$1"
|
||||
local archive_entries
|
||||
local entry
|
||||
local normalized_entry
|
||||
|
||||
if ! archive_entries="$(unzip -Z1 "$archive")"; then
|
||||
printf '錯誤:無法讀取壓縮檔:%s\n' "$archive" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
while IFS= read -r entry; do
|
||||
[ -z "$entry" ] && continue
|
||||
|
||||
normalized_entry="${entry//\\//}"
|
||||
|
||||
case "$normalized_entry" in
|
||||
/*|../*|*/../*|*/..|..)
|
||||
printf '錯誤:壓縮檔包含不安全路徑:%s\n' "$entry" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done <<EOF
|
||||
$archive_entries
|
||||
EOF
|
||||
}
|
||||
|
||||
require_index() {
|
||||
local value="$1"
|
||||
|
||||
@@ -63,6 +97,7 @@ section "解壓縮成品"
|
||||
|
||||
rm -rf output
|
||||
mkdir -p output
|
||||
validate_release_archive "$release_name"
|
||||
unzip -q "$release_name" -d output
|
||||
printf '已解壓縮到:%s\n' "output"
|
||||
|
||||
@@ -78,14 +113,13 @@ if [ "${#nuget_packages[@]}" -eq 0 ]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
nuget_package="${nuget_packages[0]}"
|
||||
for nuget_package in "${nuget_packages[@]}"; do
|
||||
printf 'NUGET_PACKAGE=%s\n' "$nuget_package"
|
||||
|
||||
printf 'NUGET_PACKAGE=%s\n' "$nuget_package"
|
||||
|
||||
dotnet nuget push "$nuget_package" \
|
||||
--source "$nuget_source" \
|
||||
--api-key "$RUNNER_TOKEN" \
|
||||
--skip-duplicate \
|
||||
--allow-insecure-connections
|
||||
dotnet nuget push "$nuget_package" \
|
||||
--source "$nuget_source" \
|
||||
--api-key "$RUNNER_TOKEN" \
|
||||
--skip-duplicate
|
||||
done
|
||||
|
||||
section "完成"
|
||||
|
||||
Reference in New Issue
Block a user