Optimize APK update checks and CI builds
Build Alpine Packages / build-and-publish (v3.24, 3.24) (push) Failing after 2h20m30s
Build Alpine Packages / build-and-publish (v3.24, 3.24) (push) Failing after 2h20m30s
This commit is contained in:
+86
-5
@@ -13,17 +13,59 @@ fi
|
||||
|
||||
github_latest_release() {
|
||||
local repo="$1"
|
||||
local api_url="https://api.github.com/repos/${repo}/releases/latest"
|
||||
local response
|
||||
|
||||
response="$(curl -fsSL \
|
||||
-H 'Accept: application/vnd.github+json' \
|
||||
-H 'X-GitHub-Api-Version: 2022-11-28' \
|
||||
"${api_url}" 2>/dev/null)" || return 1
|
||||
"https://api.github.com/repos/${repo}/releases/latest" 2>/dev/null)" || return 1
|
||||
printf '%s\n' "${response}" | jq -er '.tag_name'
|
||||
}
|
||||
|
||||
printf '%s\n' "${response}" \
|
||||
| sed -n 's/^[[:space:]]*"tag_name":[[:space:]]*"\([^"]*\)".*/\1/p' \
|
||||
| head -n 1
|
||||
github_release_rows() {
|
||||
local repo="$1"
|
||||
local current_tag="$2"
|
||||
local page=1
|
||||
local response
|
||||
local release_count
|
||||
|
||||
while :; do
|
||||
response="$(curl -fsSL \
|
||||
-H 'Accept: application/vnd.github+json' \
|
||||
-H 'X-GitHub-Api-Version: 2022-11-28' \
|
||||
"https://api.github.com/repos/${repo}/releases?per_page=100&page=${page}" 2>/dev/null)" || return 1
|
||||
release_count="$(printf '%s\n' "${response}" | jq -er 'if type == "array" then length else error("expected release array") end')" || return 1
|
||||
[[ "${release_count}" -gt 0 ]] || return 0
|
||||
|
||||
printf '%s\n' "${response}" | jq -r '
|
||||
.[]
|
||||
| select(.draft | not)
|
||||
| select(.prerelease | not)
|
||||
| [
|
||||
.tag_name,
|
||||
(.published_at // "-"),
|
||||
(.name // .tag_name),
|
||||
.html_url,
|
||||
(
|
||||
(.body // "")
|
||||
| gsub("[\\r\\n\\t]+"; " ")
|
||||
| gsub("[`*_>#]"; "")
|
||||
| gsub(" +"; " ")
|
||||
| gsub("^ +"; "")
|
||||
| gsub(" +$"; "")
|
||||
| if length > 240 then .[0:237] + "..." else . end
|
||||
)
|
||||
]
|
||||
| @tsv
|
||||
'
|
||||
|
||||
if printf '%s\n' "${response}" | jq -e --arg tag "${current_tag}" '
|
||||
any(.[]; .tag_name == $tag and (.draft | not) and (.prerelease | not))
|
||||
' >/dev/null; then
|
||||
return 0
|
||||
fi
|
||||
page=$((page + 1))
|
||||
done
|
||||
}
|
||||
|
||||
apkbuild_value() {
|
||||
@@ -104,6 +146,7 @@ printf '%-14s %-14s %-14s %-18s %s\n' "PACKAGE" "CURRENT" "LATEST" "STATUS" "UPS
|
||||
|
||||
has_update=0
|
||||
has_unknown=0
|
||||
release_details=""
|
||||
|
||||
while IFS= read -r package_dir; do
|
||||
apk_validate_package_dir "${package_dir}"
|
||||
@@ -121,6 +164,40 @@ while IFS= read -r package_dir; do
|
||||
if version_is_newer "${latest_version}" "${current_version}"; then
|
||||
status="update-available"
|
||||
has_update=1
|
||||
package_details="${package_name}: ${current_version} -> ${latest_version}"
|
||||
case "${version_prefix}" in
|
||||
none|"") current_tag="${current_version}" ;;
|
||||
*) current_tag="${version_prefix}${current_version}" ;;
|
||||
esac
|
||||
if release_rows="$(github_release_rows "${repo}" "${current_tag}")" && [[ -n "${release_rows}" ]]; then
|
||||
current_tag_found=0
|
||||
while IFS=$'\t' read -r release_tag published_at release_name release_url release_excerpt; do
|
||||
[[ -n "${release_tag}" ]] || continue
|
||||
release_version="$(normalize_version "${release_tag}" "${version_prefix}")"
|
||||
if [[ "${release_tag}" == "${current_tag}" ]]; then
|
||||
current_tag_found=1
|
||||
fi
|
||||
if version_is_newer "${release_version}" "${current_version}"; then
|
||||
package_details+=$'\n'
|
||||
package_details+=" ${release_version} (${published_at}) — ${release_name}"
|
||||
package_details+=$'\n'
|
||||
package_details+=" ${release_url}"
|
||||
if [[ -n "${release_excerpt}" ]]; then
|
||||
package_details+=$'\n'
|
||||
package_details+=" ${release_excerpt}"
|
||||
fi
|
||||
fi
|
||||
done <<< "${release_rows}"
|
||||
if [[ "${current_tag_found}" == 0 ]]; then
|
||||
package_details+=$'\n'
|
||||
package_details+=" Note: current release tag ${current_tag} was not found; listed releases compare newer than ${current_version}."
|
||||
fi
|
||||
else
|
||||
package_details+=$'\n'
|
||||
package_details+=" Note: release details could not be fetched."
|
||||
fi
|
||||
release_details+=$'\n'
|
||||
release_details+="${package_details}"
|
||||
else
|
||||
status="current"
|
||||
fi
|
||||
@@ -139,6 +216,10 @@ while IFS= read -r package_dir; do
|
||||
"${upstream_url}"
|
||||
done < <(apk_package_dirs "${repo_root}")
|
||||
|
||||
if [[ -n "${release_details}" ]]; then
|
||||
printf '\nRelease details:%s\n' "${release_details}"
|
||||
fi
|
||||
|
||||
if [[ "${mode}" == "fail" && ( "${has_update}" -ne 0 || "${has_unknown}" -ne 0 ) ]]; then
|
||||
exit 1
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user