Merge pull request 'Enhance Docker Action: Add curl and jq to Dockerfile, update action.yaml inputs, and improve entrypoint.sh with error handling and release management logic.' (#2) from develop into master

Reviewed-on: docker-actions/release-cleanup#2
Reviewed-by: 系統管理員 <1+admin@noreply.localhost>
This commit was merged in pull request #2.
This commit is contained in:
2026-06-25 09:11:54 +00:00
3 changed files with 178 additions and 19 deletions
+1 -2
View File
@@ -1,10 +1,9 @@
FROM alpine:latest FROM alpine:latest
# 安裝必要的工具 # 安裝必要的工具
RUN apk add --no-cache --no-check-certificate bash RUN apk add --no-cache --no-check-certificate bash curl jq
COPY entrypoint.sh /entrypoint.sh COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"] ENTRYPOINT ["/entrypoint.sh"]
+5 -11
View File
@@ -2,21 +2,15 @@ name: 'Docker Action Template'
description: 'Docker Action 範本' description: 'Docker Action 範本'
author: 'Jeffery' author: 'Jeffery'
inputs: inputs:
gitea_token: keep_count:
description: 'Gitea Token' description: ''
required: true
text:
description: '輸入的文字'
required: false required: false
default: 'Hello, World!' default: 2
outputs:
text:
description: '輸出的文字'
runs: runs:
using: 'docker' using: 'docker'
image: 'Dockerfile' image: 'Dockerfile'
env: env:
GITEA_SERVER_URL: ${{ gitea.server_url }} GITEA_SERVER_URL: ${{ gitea.server_url }}
GITEA_REPOSITORY: ${{ gitea.repository }} GITEA_REPOSITORY: ${{ gitea.repository }}
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN || inputs.gitea_token }} GITEA_TOKEN: ${{ secrets.CUSTOM_TOKEN || secrets.GITEA_TOKEN }}
TEXT: ${{ inputs.text }} KEEP_COUNT: ${{ inputs.keep_count }}
+172 -6
View File
@@ -1,11 +1,177 @@
#!/bin/bash #!/usr/bin/env bash
set -Eeuo pipefail
echo "Gitea Server Url: $GITEA_SERVER_URL" separator() {
printf '\n%s\n' '=================================================='
}
echo "Gitea Repository: $GITEA_REPOSITORY" section() {
separator
printf '%s\n' "$1"
printf '%s\n' '--------------------------------------------------'
}
echo "Gitea Token: $GITEA_TOKEN" info() {
printf '[INFO] %s\n' "$1"
}
echo "Text: $TEXT" success() {
printf '[OK] %s\n' "$1"
}
echo "text=$TEXT" >> "$GITHUB_OUTPUT" warn() {
printf '[WARN] %s\n' "$1"
}
fail() {
printf '[ERR] %s\n' "$1" >&2
}
is_empty_or_null() {
[ -z "${1:-}" ] || [ "${1:-}" = "null" ]
}
require_value() {
local name="$1"
local value="$2"
info "$name=$value"
if is_empty_or_null "$value"; then
fail "$name is required"
exit 1
fi
}
require_integer() {
local name="$1"
local value="$2"
if ! [[ "$value" =~ ^[0-9]+$ ]]; then
fail "$name must be a non-negative integer"
exit 1
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"
require_value "KEEP_COUNT" "$KEEP_COUNT"
require_integer "KEEP_COUNT" "$KEEP_COUNT"
if is_empty_or_null "${RUNNER_TOKEN:-}"; then
warn "RUNNER_TOKEN is empty; release API calls will be anonymous"
else
info "RUNNER_TOKEN=[redacted]"
fi
release_api_url="$GITEA_SERVER_URL/api/v1/repos/$GITEA_REPOSITORY/releases"
auth_header=()
if ! is_empty_or_null "${RUNNER_TOKEN:-}"; then
auth_header=(-H "Authorization: token $RUNNER_TOKEN")
fi
section "取得成品資訊"
info "GET $release_api_url"
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")"
info "RELEASE_COUNT=$release_count"
info "KEEP_COUNT=$KEEP_COUNT"
if [ "$release_count" -le "$KEEP_COUNT" ]; then
success "沒有需要清理的舊版本成品"
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 "刪除未指定 release 的 tag"
# 重新取得 release 清單,得到刪除舊版本後仍指定 tag 的成品
current_release_json="$(fetch_all_pages "$release_api_url")"
release_tags_json="$(jq -c '[.[].tag_name]' <<<"$current_release_json")"
tag_api_url="$GITEA_SERVER_URL/api/v1/repos/$GITEA_REPOSITORY/tags"
info "GET $tag_api_url"
tag_json="$(fetch_all_pages "$tag_api_url")"
tag_count="$(jq 'length' <<<"$tag_json")"
info "TAG_COUNT=$tag_count"
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
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: $tag_name"
else
fail "刪除 tag 失敗: $tag_name, HTTP $delete_code"
fi
done < <(jq -c '.[]' <<<"$tag_json")
separator