feat(清理成品): 新增刪除未指定 release 的 tag 步驟並抽出分頁共用函式
刪除舊版本成品後,重新取得 release 清單並刪除所有未指定到 release 的 tag。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
c9c92c160c
commit
30f5dce8dc
+76
-30
@@ -52,6 +52,27 @@ require_integer() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fetch_all_pages() {
|
||||||
|
local base_url="$1"
|
||||||
|
local all_json='[]'
|
||||||
|
local page=1
|
||||||
|
local page_url page_json
|
||||||
|
|
||||||
|
while :; do
|
||||||
|
page_url="$base_url?page=$page"
|
||||||
|
page_json="$(curl -fsS "${auth_header[@]}" "$page_url")"
|
||||||
|
|
||||||
|
if [ "$(jq 'length' <<<"$page_json")" -eq 0 ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
all_json="$(jq -s 'add' <<<"$all_json"$'\n'"$page_json")"
|
||||||
|
page=$((page + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
printf '%s' "$all_json"
|
||||||
|
}
|
||||||
|
|
||||||
section "參數檢查"
|
section "參數檢查"
|
||||||
require_value "GITEA_SERVER_URL" "$GITEA_SERVER_URL"
|
require_value "GITEA_SERVER_URL" "$GITEA_SERVER_URL"
|
||||||
require_value "GITEA_REPOSITORY" "$GITEA_REPOSITORY"
|
require_value "GITEA_REPOSITORY" "$GITEA_REPOSITORY"
|
||||||
@@ -74,21 +95,7 @@ fi
|
|||||||
section "取得成品資訊"
|
section "取得成品資訊"
|
||||||
info "GET $release_api_url"
|
info "GET $release_api_url"
|
||||||
|
|
||||||
release_json='[]'
|
release_json="$(fetch_all_pages "$release_api_url")"
|
||||||
page=1
|
|
||||||
|
|
||||||
while :; do
|
|
||||||
page_url="$release_api_url?page=$page"
|
|
||||||
page_json="$(curl -fsS "${auth_header[@]}" "$page_url")"
|
|
||||||
|
|
||||||
if [ "$(jq 'length' <<<"$page_json")" -eq 0 ]; then
|
|
||||||
break
|
|
||||||
fi
|
|
||||||
|
|
||||||
release_json="$(jq -s 'add' <<<"$release_json"$'\n'"$page_json")"
|
|
||||||
page=$((page + 1))
|
|
||||||
done
|
|
||||||
|
|
||||||
release_json="$(jq -e 'sort_by(.created_at) | reverse' <<<"$release_json")"
|
release_json="$(jq -e 'sort_by(.created_at) | reverse' <<<"$release_json")"
|
||||||
release_count="$(jq 'length' <<<"$release_json")"
|
release_count="$(jq 'length' <<<"$release_json")"
|
||||||
|
|
||||||
@@ -97,35 +104,74 @@ info "KEEP_COUNT=$KEEP_COUNT"
|
|||||||
|
|
||||||
if [ "$release_count" -le "$KEEP_COUNT" ]; then
|
if [ "$release_count" -le "$KEEP_COUNT" ]; then
|
||||||
success "沒有需要清理的舊版本成品"
|
success "沒有需要清理的舊版本成品"
|
||||||
exit 0
|
else
|
||||||
|
section "刪除舊版本成品"
|
||||||
|
|
||||||
|
release_to_delete="$(jq -c ".[$KEEP_COUNT:]" <<<"$release_json")"
|
||||||
|
|
||||||
|
while IFS= read -r release_item; do
|
||||||
|
[ -z "$release_item" ] && continue
|
||||||
|
|
||||||
|
release_id="$(jq -r '.id' <<<"$release_item")"
|
||||||
|
release_tag="$(jq -r '.tag_name' <<<"$release_item")"
|
||||||
|
release_name="$(jq -r '.name' <<<"$release_item")"
|
||||||
|
|
||||||
|
if is_empty_or_null "$release_id"; then
|
||||||
|
warn "略過沒有 id 的成品: $release_tag ($release_name)"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
delete_url="$GITEA_SERVER_URL/api/v1/repos/$GITEA_REPOSITORY/releases/$release_id"
|
||||||
|
info "DELETE $release_tag ($release_name)"
|
||||||
|
|
||||||
|
delete_code="$(curl -sS -o /dev/null -w "%{http_code}" -X DELETE "${auth_header[@]}" "$delete_url")"
|
||||||
|
|
||||||
|
if [ "$delete_code" -eq 204 ]; then
|
||||||
|
success "成功刪除: $release_tag ($release_name)"
|
||||||
|
else
|
||||||
|
fail "刪除失敗: $release_tag ($release_name), HTTP $delete_code"
|
||||||
|
fi
|
||||||
|
done < <(jq -c '.[]' <<<"$release_to_delete")
|
||||||
fi
|
fi
|
||||||
|
|
||||||
section "刪除舊版本成品"
|
section "刪除未指定 release 的 tag"
|
||||||
|
|
||||||
release_to_delete="$(jq -c ".[$KEEP_COUNT:]" <<<"$release_json")"
|
# 重新取得 release 清單,得到刪除舊版本後仍指定 tag 的成品
|
||||||
|
current_release_json="$(fetch_all_pages "$release_api_url")"
|
||||||
|
release_tags_json="$(jq -c '[.[].tag_name]' <<<"$current_release_json")"
|
||||||
|
|
||||||
while IFS= read -r release_item; do
|
tag_api_url="$GITEA_SERVER_URL/api/v1/repos/$GITEA_REPOSITORY/tags"
|
||||||
[ -z "$release_item" ] && continue
|
info "GET $tag_api_url"
|
||||||
|
|
||||||
release_id="$(jq -r '.id' <<<"$release_item")"
|
tag_json="$(fetch_all_pages "$tag_api_url")"
|
||||||
release_tag="$(jq -r '.tag_name' <<<"$release_item")"
|
tag_count="$(jq 'length' <<<"$tag_json")"
|
||||||
release_name="$(jq -r '.name' <<<"$release_item")"
|
info "TAG_COUNT=$tag_count"
|
||||||
|
|
||||||
if is_empty_or_null "$release_id"; then
|
while IFS= read -r tag_item; do
|
||||||
warn "略過沒有 id 的成品: $release_tag ($release_name)"
|
[ -z "$tag_item" ] && continue
|
||||||
|
|
||||||
|
tag_name="$(jq -r '.name' <<<"$tag_item")"
|
||||||
|
|
||||||
|
if is_empty_or_null "$tag_name"; then
|
||||||
|
warn "略過沒有名稱的 tag"
|
||||||
continue
|
continue
|
||||||
fi
|
fi
|
||||||
|
|
||||||
delete_url="$GITEA_SERVER_URL/api/v1/repos/$GITEA_REPOSITORY/releases/$release_id"
|
if [ "$(jq --arg name "$tag_name" 'any(.[]; . == $name)' <<<"$release_tags_json")" = "true" ]; then
|
||||||
info "DELETE $release_tag ($release_name)"
|
info "保留指定 release 的 tag: $tag_name"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
delete_url="$tag_api_url/$tag_name"
|
||||||
|
info "DELETE tag $tag_name"
|
||||||
|
|
||||||
delete_code="$(curl -sS -o /dev/null -w "%{http_code}" -X DELETE "${auth_header[@]}" "$delete_url")"
|
delete_code="$(curl -sS -o /dev/null -w "%{http_code}" -X DELETE "${auth_header[@]}" "$delete_url")"
|
||||||
|
|
||||||
if [ "$delete_code" -eq 204 ]; then
|
if [ "$delete_code" -eq 204 ]; then
|
||||||
success "成功刪除: $release_tag ($release_name)"
|
success "成功刪除未指定 release 的 tag: $tag_name"
|
||||||
else
|
else
|
||||||
fail "刪除失敗: $release_tag ($release_name), HTTP $delete_code"
|
fail "刪除 tag 失敗: $tag_name, HTTP $delete_code"
|
||||||
fi
|
fi
|
||||||
done < <(jq -c '.[]' <<<"$release_to_delete")
|
done < <(jq -c '.[]' <<<"$tag_json")
|
||||||
|
|
||||||
separator
|
separator
|
||||||
|
|||||||
Reference in New Issue
Block a user