mirror of
https://github.com/cozystack/cozystack.git
synced 2026-10-23 03:27:50 +09:00
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>
81 lines
3.0 KiB
Bash
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
|
|
}
|