feat: filter cleanup by package names

This commit is contained in:
2026-05-15 02:33:20 +00:00
parent 5336737073
commit 3305b57ac0
3 changed files with 45 additions and 2 deletions
+4
View File
@@ -7,6 +7,7 @@
- 依序嘗試取得 Gitea API token。 - 依序嘗試取得 Gitea API token。
- 預設每個套件保留最新 `2` 個版本。 - 預設每個套件保留最新 `2` 個版本。
- 直接刪除超出保留數量的舊版本。 - 直接刪除超出保留數量的舊版本。
- 只處理你指定的 NuGet 套件名稱,可一次指定多個。
- 輸出可搜尋的 log,包含 API status、request id 與 summary。 - 輸出可搜尋的 log,包含 API status、request id 與 summary。
## Token 來源順序 ## Token 來源順序
@@ -25,6 +26,7 @@ Action 會依序嘗試以下來源:
| --- | --- | --- | --- | | --- | --- | --- | --- |
| `RUNNER_TOKEN` | string | - | Gitea API token,優先順序最高 | | `RUNNER_TOKEN` | string | - | Gitea API token,優先順序最高 |
| `KEEP_COUNT` | integer string | `2` | 每個套件要保留的最新版本數,必須是整數且 `>= 0` | | `KEEP_COUNT` | integer string | `2` | 每個套件要保留的最新版本數,必須是整數且 `>= 0` |
| `PACKAGE_NAMES` | string | - | 要清理的 NuGet 套件名稱,逗號分隔,可一次指定多個 |
## Log 行為 ## Log 行為
@@ -33,6 +35,7 @@ Action 會依序嘗試以下來源:
- `Trying token from ...` - `Trying token from ...`
- `Using token from ...` - `Using token from ...`
- `keep_count=...` - `keep_count=...`
- `package_names=...`
- `GET /api/v1/... -> 200 OK` - `GET /api/v1/... -> 200 OK`
- `Candidate to delete: ...` - `Candidate to delete: ...`
- `Deleted package ... -> 204 No Content` - `Deleted package ... -> 204 No Content`
@@ -49,6 +52,7 @@ jobs:
with: with:
RUNNER_TOKEN: ${{ secrets.GITEA_TOKEN }} RUNNER_TOKEN: ${{ secrets.GITEA_TOKEN }}
KEEP_COUNT: 2 KEEP_COUNT: 2
PACKAGE_NAMES: package-a,package-b
``` ```
## 相關檔案 ## 相關檔案
+4 -1
View File
@@ -3,12 +3,15 @@ description: '清理 Nuget 沒用到的資源'
author: 'Jeffery' author: 'Jeffery'
inputs: inputs:
RUNNER_TOKEN: RUNNER_TOKEN:
description: 'GitHub Runner Token' description: 'Gitea API token, highest priority source'
required: false required: false
KEEP_COUNT: KEEP_COUNT:
description: '保留的版本數量' description: '保留的版本數量'
required: false required: false
default: '2' default: '2'
PACKAGE_NAMES:
description: '要清理的 NuGet 套件名稱,逗號分隔,可一次指定多個'
required: true
runs: runs:
using: 'docker' using: 'docker'
image: 'Dockerfile' image: 'Dockerfile'
+37 -1
View File
@@ -10,6 +10,8 @@ fail() {
exit 1 exit 1
} }
declare -A TARGET_PACKAGES=()
resolve_token() { resolve_token() {
log "Trying token from RUNNER_TOKEN" log "Trying token from RUNNER_TOKEN"
@@ -36,6 +38,30 @@ resolve_keep_versions() {
printf '%s' "${raw_value}" printf '%s' "${raw_value}"
} }
resolve_package_names() {
local raw_value="${INPUT_PACKAGE_NAMES:-}"
local normalized package_name
local -a package_name_list
if [[ -z "${raw_value}" ]]; then
fail "Missing PACKAGE_NAMES"
fi
normalized="${raw_value//$'\n'/,}"
IFS=',' read -r -a package_name_list <<< "${normalized}"
for package_name in "${package_name_list[@]}"; do
package_name="${package_name#"${package_name%%[![:space:]]*}"}"
package_name="${package_name%"${package_name##*[![:space:]]}"}"
[[ -n "${package_name}" ]] || continue
TARGET_PACKAGES["${package_name}"]=1
done
if (( ${#TARGET_PACKAGES[@]} == 0 )); then
fail "Missing PACKAGE_NAMES"
fi
}
init_repo_context() { init_repo_context() {
local repository="${GITEA_REPOSITORY:-}" local repository="${GITEA_REPOSITORY:-}"
@@ -142,12 +168,17 @@ collect_package_candidates() {
while IFS= read -r group_json; do while IFS= read -r group_json; do
package_name="$(jq -r '.[0].name' <<<"${group_json}")" package_name="$(jq -r '.[0].name' <<<"${group_json}")"
if [[ -z "${TARGET_PACKAGES["$package_name"]+x}" ]]; then
continue
fi
total_versions="$(jq 'length' <<<"${group_json}")" total_versions="$(jq 'length' <<<"${group_json}")"
PACKAGE_COUNT=$((PACKAGE_COUNT + 1)) PACKAGE_COUNT=$((PACKAGE_COUNT + 1))
TOTAL_VERSION_COUNT=$((TOTAL_VERSION_COUNT + total_versions)) TOTAL_VERSION_COUNT=$((TOTAL_VERSION_COUNT + total_versions))
log "Package ${package_name}: total_versions=${total_versions} keep_versions=${keep_versions}" log "Package ${package_name}: total_versions=${total_versions} keep_count=${keep_versions}"
log "Package ${package_name} versions (oldest -> newest):" log "Package ${package_name} versions (oldest -> newest):"
while IFS=$'\t' read -r version created_at; do while IFS=$'\t' read -r version created_at; do
[[ -z "${version}" ]] && continue [[ -z "${version}" ]] && continue
@@ -219,6 +250,8 @@ main() {
init_repo_context init_repo_context
keep_versions="$(resolve_keep_versions)" keep_versions="$(resolve_keep_versions)"
log "keep_count=${keep_versions}" log "keep_count=${keep_versions}"
resolve_package_names
log "package_names=${INPUT_PACKAGE_NAMES}"
log "Token source resolved successfully" log "Token source resolved successfully"
CANDIDATES_FILE="$(mktemp)" CANDIDATES_FILE="$(mktemp)"
@@ -230,6 +263,9 @@ main() {
trap 'rm -f "${CANDIDATES_FILE}"' EXIT trap 'rm -f "${CANDIDATES_FILE}"' EXIT
collect_package_candidates collect_package_candidates
if (( PACKAGE_COUNT == 0 )); then
log "No matching packages found for requested package_names"
fi
process_candidates process_candidates
log "Stage 4 complete" log "Stage 4 complete"
} }