From 30f5dce8dc02df67a179c6f8f7f89dd9143fb96c Mon Sep 17 00:00:00 2001 From: Jeffery Date: Tue, 23 Jun 2026 16:14:51 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E6=B8=85=E7=90=86=E6=88=90=E5=93=81):=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=88=AA=E9=99=A4=E6=9C=AA=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=20release=20=E7=9A=84=20tag=20=E6=AD=A5=E9=A9=9F=E4=B8=A6?= =?UTF-8?q?=E6=8A=BD=E5=87=BA=E5=88=86=E9=A0=81=E5=85=B1=E7=94=A8=E5=87=BD?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 刪除舊版本成品後,重新取得 release 清單並刪除所有未指定到 release 的 tag。 Co-Authored-By: Claude Opus 4.8 (1M context) --- entrypoint.sh | 106 ++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 76 insertions(+), 30 deletions(-) diff --git a/entrypoint.sh b/entrypoint.sh index b7599b8..cfa7dc0 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -52,6 +52,27 @@ require_integer() { 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 "參數檢查" require_value "GITEA_SERVER_URL" "$GITEA_SERVER_URL" require_value "GITEA_REPOSITORY" "$GITEA_REPOSITORY" @@ -74,21 +95,7 @@ fi section "取得成品資訊" info "GET $release_api_url" -release_json='[]' -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="$(fetch_all_pages "$release_api_url")" release_json="$(jq -e 'sort_by(.created_at) | reverse' <<<"$release_json")" release_count="$(jq 'length' <<<"$release_json")" @@ -97,35 +104,74 @@ info "KEEP_COUNT=$KEEP_COUNT" if [ "$release_count" -le "$KEEP_COUNT" ]; then 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 -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 - [ -z "$release_item" ] && continue +tag_api_url="$GITEA_SERVER_URL/api/v1/repos/$GITEA_REPOSITORY/tags" +info "GET $tag_api_url" - release_id="$(jq -r '.id' <<<"$release_item")" - release_tag="$(jq -r '.tag_name' <<<"$release_item")" - release_name="$(jq -r '.name' <<<"$release_item")" +tag_json="$(fetch_all_pages "$tag_api_url")" +tag_count="$(jq 'length' <<<"$tag_json")" +info "TAG_COUNT=$tag_count" - if is_empty_or_null "$release_id"; then - warn "略過沒有 id 的成品: $release_tag ($release_name)" +while IFS= read -r tag_item; do + [ -z "$tag_item" ] && continue + + tag_name="$(jq -r '.name' <<<"$tag_item")" + + if is_empty_or_null "$tag_name"; then + warn "略過沒有名稱的 tag" continue fi - delete_url="$GITEA_SERVER_URL/api/v1/repos/$GITEA_REPOSITORY/releases/$release_id" - info "DELETE $release_tag ($release_name)" + if [ "$(jq --arg name "$tag_name" 'any(.[]; . == $name)' <<<"$release_tags_json")" = "true" ]; then + 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")" if [ "$delete_code" -eq 204 ]; then - success "成功刪除: $release_tag ($release_name)" + success "成功刪除未指定 release 的 tag: $tag_name" else - fail "刪除失敗: $release_tag ($release_name), HTTP $delete_code" + fail "刪除 tag 失敗: $tag_name, HTTP $delete_code" fi -done < <(jq -c '.[]' <<<"$release_to_delete") +done < <(jq -c '.[]' <<<"$tag_json") separator