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