blob: 33c8972f871cac4daed0cb46e76615a9e891d23f [file]
#!/bin/sh
set -eu
cd "$(dirname "$0")"
all_platforms=false
if [ "${1:-}" = "--all-platforms" ]; then
all_platforms=true
shift
fi
if [ "$#" -ne 0 ]; then
echo "usage: $0 [--all-platforms]" >&2
exit 64
fi
server_platform="$(docker version --format '{{.Server.Os}}/{{.Server.Arch}}')"
case "$server_platform" in
linux/x86_64) server_platform=linux/amd64 ;;
linux/aarch64) server_platform=linux/arm64 ;;
esac
if [ "$all_platforms" = true ]; then
platforms="linux/amd64 linux/arm64"
else
platforms="$server_platform"
fi
mkdir -p tmp
image_tag() {
platform_slug="$(echo "$3" | tr '/' '-')"
echo "thrift-docker-test:$1-$2-$platform_slug"
}
version_field() {
python3 - "$1" "$2" <<'PY'
import json
import sys
from pathlib import Path
data = json.loads(Path("versions.json").read_text())
print(data["versions"][sys.argv[1]][sys.argv[2]])
PY
}
maintained_versions() {
python3 - <<'PY'
import json
from pathlib import Path
data = json.loads(Path("versions.json").read_text())
versions = sorted(data["versions"], key=lambda version: tuple(int(part) for part in version.split(".")), reverse=True)
for version in versions[: int(data.get("maintained_releases", 2))]:
print(version)
PY
}
file_owner() {
if stat -c '%u:%g' "$1" >/dev/null 2>&1; then
stat -c '%u:%g' "$1"
else
stat -f '%u:%g' "$1"
fi
}
smoke_image() {
image="$1"
platform="$2"
version="$3"
variant="$4"
if docker run --rm --platform "$platform" "$image" > tmp/no-args.out 2>&1; then
:
fi
grep -F "Usage: thrift" tmp/no-args.out >/dev/null
docker run --rm --platform "$platform" "$image" --version | grep -F "$version" >/dev/null
docker run --rm --platform "$platform" "$image" thrift --version | grep -F "$version" >/dev/null
docker run --rm --platform "$platform" "$image" sh -c 'command -v thrift' >/dev/null
out_dir="tmp/out-$version-$variant-$(echo "$platform" | tr '/' '-')"
rm -rf "$out_dir"
mkdir -p "$out_dir"
docker run --rm --platform "$platform" \
-u "$(id -u):$(id -g)" \
-v "$PWD:/data" \
"$image" --gen json -o /data/"$out_dir" /data/tests/smoke.thrift
find "$out_dir" -type f | grep -q .
docker run --rm --platform "$platform" \
-u "$(id -u):$(id -g)" \
-v "$PWD:/data" \
"$image" --gen py -o /data/"$out_dir" /data/tests/smoke.thrift
find "$out_dir" -type f | grep -q .
if [ "$platform" = "$server_platform" ]; then
first_file="$(find "$out_dir" -type f | head -n 1)"
expected_owner="$(id -u):$(id -g)"
actual_owner="$(file_owner "$first_file")"
if [ "$actual_owner" != "$expected_owner" ]; then
echo "generated file has owner $actual_owner, expected $expected_owner: $first_file" >&2
exit 1
fi
fi
}
for version in $(maintained_versions); do
for platform in $platforms; do
for variant in debian alpine; do
case "$variant" in
debian)
context="$version"
dockerfile="Dockerfile"
;;
alpine)
context="$version"
dockerfile="Dockerfile.alpine"
;;
esac
image="$(image_tag "$version" "$variant" "$platform")"
echo "Building $image for $platform"
docker buildx build --platform "$platform" --load -t "$image" -f "$context/$dockerfile" "$context"
echo "Testing $image for $platform"
smoke_image "$image" "$platform" "$version" "$variant"
done
done
done
./generate-stackbrew-library.sh > tmp/stackbrew-library
if grep -q 'GitCommit: 0000000000000000000000000000000000000000' tmp/stackbrew-library; then
echo "generated stackbrew metadata contains the placeholder GitCommit" >&2
exit 1
fi
ALLOW_DIRTY_OFFICIAL_IMAGES_MANIFEST=1 ./generate-official-images-library.sh tmp/thrift-official-images-library