* ci: enforce production release gates * ci: close release gate review blockers * ci: preserve verified digests during promotion * ci: serialize and verify release cleanup * ci: build govulncheck with Shangwutong toolchain --------- Co-authored-by: Rogee <rogee@ipao.vip>
40 lines
1.3 KiB
Bash
Executable File
40 lines
1.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
delete_package_version() {
|
|
local endpoint=$1 tag=$2 digest=$3 attempt versions version_id
|
|
local retries=${RELEASE_RETRY_COUNT:-5} delay=${RELEASE_RETRY_DELAY:-2}
|
|
|
|
for ((attempt = 1; attempt <= retries; attempt++)); do
|
|
if versions=$(gh api --paginate --slurp "$endpoint?per_page=100") &&
|
|
version_id=$(jq -er --arg tag "$tag" --arg digest "$digest" \
|
|
'[.[][] | select(.name == $digest and ((.metadata.container.tags // []) | index($tag)))] | if length == 1 then .[0].id else empty end' \
|
|
<<< "$versions") &&
|
|
[[ $version_id =~ ^[0-9]+$ ]] &&
|
|
gh api --method DELETE "$endpoint/$version_id"; then
|
|
return 0
|
|
fi
|
|
((attempt == retries)) || sleep "$delay"
|
|
done
|
|
|
|
echo "Could not delete package version for $tag at $digest" >&2
|
|
return 1
|
|
}
|
|
|
|
wait_for_tag_absent() {
|
|
local target=$1 attempt output
|
|
local retries=${RELEASE_RETRY_COUNT:-5} delay=${RELEASE_RETRY_DELAY:-2}
|
|
|
|
for ((attempt = 1; attempt <= retries; attempt++)); do
|
|
if output=$(crane digest "$target" 2>&1); then
|
|
:
|
|
elif grep -Eiq 'MANIFEST_UNKNOWN|manifest unknown|not found|404' <<< "$output"; then
|
|
return 0
|
|
fi
|
|
((attempt == retries)) || sleep "$delay"
|
|
done
|
|
|
|
[[ -z $output ]] || printf '%s\n' "$output" >&2
|
|
echo "Tag still resolves after cleanup: $target" >&2
|
|
return 1
|
|
}
|