Files
cozystack/hack/retention-packages_test.bats
Aleksei Sviridkin 957397ed42 ci(retention): derive swept package names from the published tree
GitHub refuses to list org container packages to an app installation
token, so the retention workflow cannot enumerate what to sweep. Name
the packages from the published nightly packages tree instead: it is
the tree the nightly mirror copied images for, so it covers every
component image that receives dated nightly tags, including those
digest-pinned only by the build and therefore absent from the
committed tree. A tree that does not reference the packages artifact
is refused rather than read as a shorter list.

Assisted-by: LLM
Signed-off-by: Aleksei Sviridkin <f@lex.la>
2026-10-09 17:12:14 +03:00

81 lines
3.0 KiB
Bash

#!/usr/bin/env bats
# Tests for hack/retention-packages.sh — the package-name source of the GHCR
# retention workflow. GitHub refuses to list org container packages to an app
# installation token, so the workflow sweeps exactly the packages this script
# names. A name missing here is a package whose nightlies are never pruned, so
# the tests pin what is included and that an unusable tree fails rather than
# yielding a shorter list.
#
# Run with: bats hack/retention-packages_test.bats
load test_helper
SCRIPT="${BATS_TEST_DIRNAME}/retention-packages.sh"
# A published nightly tree: refs already rewritten to the GHCR host.
_make_tree() {
D="$(printf 'a%.0s' $(seq 1 64))"
t="$1"
mkdir -p "$t/core/installer" "$t/system/single" "$t/system/split" \
"$t/system/nested" "$t/system/third" "$t/system/leftover" \
"$t/system/tagfile/images" "$t/system/multus/templates"
{
echo 'cozystackOperator:'
echo ' platformSourceUrl: oci://ghcr.io/cozystack/cozystack/cozystack-packages'
printf ' platformSourceRef: digest=sha256:%s\n' "$D"
} > "$t/core/installer/values.yaml"
printf 'image: ghcr.io/cozystack/cozystack/single:v1.0.0@sha256:%s\n' "$D" \
> "$t/system/single/values.yaml"
{
echo 'image:'
echo ' repository: ghcr.io/cozystack/cozystack/split'
printf ' tag: v1.0.0@sha256:%s\n' "$D"
} > "$t/system/split/values.yaml"
printf 'image: ghcr.io/cozystack/cozystack/metallb/controller:v1@sha256:%s\n' "$D" \
> "$t/system/nested/values.yaml"
printf 'ghcr.io/cozystack/cozystack/tagfile:v1.0.0@sha256:%s\n' "$D" \
> "$t/system/tagfile/images/thing.tag"
printf ' image: ghcr.io/cozystack/cozystack/multus-cni:v1@sha256:%s\n' "$D" \
> "$t/system/multus/templates/multus-daemonset-thick.yml"
# Not ours to prune: a third-party image and a sibling GHCR namespace.
{
printf 'a: docker.io/library/busybox:1.37.0@sha256:%s\n' "$D"
printf 'b: ghcr.io/cozystack/ingress-nginx-with-protobuf-exporter/controller:v1@sha256:%s\n' "$D"
} > "$t/system/third/values.yaml"
# A ref the mirror failed to rewrite lives in the build registry, not GHCR.
printf 'image: iad.ocir.io/idyksih5sir9/cozystack/leftover:main@sha256:%s\n' "$D" \
> "$t/system/leftover/values.yaml"
}
@test "names every GHCR cozystack package in all storage shapes plus the published extras" {
tree="${BATS_TEST_TMPDIR}/tree"
_make_tree "$tree"
run "$SCRIPT" "$tree"
[ "$status" -eq 0 ]
expected="cozystack/cozy-installer
cozystack/cozystack-nocloud
cozystack/cozystack-packages
cozystack/metallb/controller
cozystack/multus-cni
cozystack/single
cozystack/split
cozystack/tagfile"
[ "$output" = "$expected" ]
}
@test "fails on a missing tree" {
run "$SCRIPT" "${BATS_TEST_TMPDIR}/absent"
[ "$status" -ne 0 ]
}
@test "fails on a tree that does not reference the packages artifact" {
tree="${BATS_TEST_TMPDIR}/tree"
_make_tree "$tree"
rm "$tree/core/installer/values.yaml"
run "$SCRIPT" "$tree"
[ "$status" -ne 0 ]
case "$output" in
*cozystack/single*) echo "FAIL: names printed despite failure"; false ;;
esac
}