feat: filter cleanup by package names
This commit is contained in:
@@ -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
@@ -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
@@ -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"
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user