From 15077fde1701e505f539c48f06302a46b52d2c0d Mon Sep 17 00:00:00 2001 From: Julian Goldstein Date: Fri, 19 Jun 2026 15:16:25 -0500 Subject: [PATCH] ci: mark newest mainline release Latest; harden empty tag set GitHub's default Latest is recency-based, so a release/* back-port cut after a newer mainline release would steal the Latest badge. Pick the flag explicitly: mainline -> --latest, back-port -> --latest=false, flavor -> --prerelease (never Latest). Also wrap the baseline grep in { ... || true; } so an empty tag set doesn't fail the pipeline under pipefail (latent; surfaced on script-template). Co-Authored-By: Claude Opus 4.8 --- .github/workflows/vendor.yml | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/.github/workflows/vendor.yml b/.github/workflows/vendor.yml index f7580c1..fad4209 100644 --- a/.github/workflows/vendor.yml +++ b/.github/workflows/vendor.yml @@ -84,7 +84,8 @@ jobs: tagpat="^v${mm}(\.[0-9]+)?$" ;; *) tagpat='^v[0-9]+\.[0-9]+(\.[0-9]+)?$' ;; esac - prev="$(git tag -l 'v[0-9]*' | grep -E "$tagpat" | sed 's/^v//' | sort -V | tail -1)" + # `|| true` so an empty tag set (no match) doesn't fail under pipefail. + prev="$(git tag -l 'v[0-9]*' | { grep -E "$tagpat" || true; } | sed 's/^v//' | sort -V | tail -1)" prevtag="" [ -n "$prev" ] && prevtag="v$prev" echo "prevtag=$prevtag" >> "$GITHUB_OUTPUT" @@ -327,7 +328,8 @@ jobs: esac # Clean tags on this line only; suffixed tags (vX.Y.Z-) are # unordered variants and never advance the line. - latest="$(git tag -l 'v[0-9]*' | grep -E "$tagpat" | sed 's/^v//' | sort -V | tail -1)" + # `|| true` so an empty tag set (no match) doesn't fail under pipefail. + latest="$(git tag -l 'v[0-9]*' | { grep -E "$tagpat" || true; } | sed 's/^v//' | sort -V | tail -1)" flavor="${FLAVOR:-}" if [ -n "$flavor" ]; then # A flavor build is an unordered VARIANT of an existing release: it @@ -434,11 +436,18 @@ jobs: cp libbpf-headers.tar.gz dist/libbpf-headers.tar.gz # qemu for the optional kernel-matrix runner (fetched on demand, not by `make`). for a in x86_64 aarch64; do cp "qemu-$a.tar.gz" "dist/qemu-$a.tar.gz"; done - # Flavored tags (vX.Y.Z-) are opt-in variants — mark them - # prerelease so GitHub never surfaces one as "Latest". - prerelease=""; case "$tag" in *-*) prerelease="--prerelease" ;; esac + # Pick the "Latest" flag explicitly (GitHub's default is recency-based, + # so a release/* back-port cut after a newer mainline release would + # otherwise steal the badge): + # * flavor (vX.Y.Z-) -> --prerelease (GitHub never marks it Latest) + # * mainline (master) -> --latest (newest mainline IS Latest) + # * release/* back-port -> --latest=false (can't steal it) + case "$tag" in + *-*) flags="--prerelease --latest=false" ;; + *) if [ "${GITHUB_REF_NAME}" = master ]; then flags="--latest"; else flags="--latest=false"; fi ;; + esac gh release view "$tag" >/dev/null 2>&1 \ - || gh release create "$tag" --title "$tag" $prerelease \ + || gh release create "$tag" --title "$tag" $flags \ --notes "Static build toolchain $tag — clang/make/git built from source; bpftool/esbuild/libbpf headers re-hosted; qemu for the kernel-matrix runner." # --clobber so a same-version re-run refreshes assets. gh release upload "$tag" dist/* --clobber