set -xeuo pipefail
shopt -s inherit_errexit
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
. "${SCRIPT_DIR}/lib.sh"
BASE_IMAGE="quay.io/fedora/fedora-minimal:latest"
ROOTFS_IMAGE="localhost/test-buildtime-rootfs:latest"
CHUNKED_IMAGE="localhost/fedora-minimal-chunked:test"
CHUNKED_IMAGE2="localhost/fedora-minimal-chunked:test2"
CHUNKED_IMAGE3="localhost/fedora-minimal-chunked:test3"
cleanup() {
cleanup_images "${CHUNKED_IMAGE}" "${CHUNKED_IMAGE2}" "${ROOTFS_IMAGE}"
}
trap cleanup EXIT
podman pull "${BASE_IMAGE}"
cat > Containerfile.rootfs <<EOF
FROM ${BASE_IMAGE}
RUN dnf install -y jq acl attr && \
dnf clean all
EOF
buildah build -t "${ROOTFS_IMAGE}" -f Containerfile.rootfs .
cat > Containerfile <<EOF
FROM ${ROOTFS_IMAGE} AS builder
# create a test binary with various xattr types
RUN cp /usr/bin/true /usr/bin/test-xattrs && \
setcap cap_net_raw+ep /usr/bin/test-xattrs && \
setfacl -m u:nobody:r /usr/bin/test-xattrs && \
setfattr -n user.testkey1 -v testvalue1 /usr/bin/test-xattrs && \
setfattr -n user.testkey2 -v testvalue2 /usr/bin/test-xattrs && \
truncate -s 20M /usr/bin/chungus && \
cp /usr/bin/chungus /usr/bin/chungus2 && \
touch -d @0 /usr/bin/chungus
FROM ${CHUNKAH_IMG:?} AS chunkah
RUN --mount=from=builder,src=/,target=/chunkah,ro \\
--mount=type=bind,target=/run/src,rw \\
SOURCE_DATE_EPOCH=1700000000 \\
chunkah build -v > /run/src/out.ociarchive
FROM oci-archive:out.ociarchive
EOF
buildah_build -t "${CHUNKED_IMAGE}" -f Containerfile .
podman run --rm "${CHUNKED_IMAGE}" jq --version
assert_has_components "${CHUNKED_IMAGE}" "rpm/filesystem" "rpm/setup" "rpm/glibc" "rpm/jq" "bigfiles/chungus" "bigfiles/chungus2"
assert_layer_count "${CHUNKED_IMAGE}" 64
assert_path_mtime "${CHUNKED_IMAGE}" /usr/bin/chungus 0
assert_path_mtime "${CHUNKED_IMAGE}" /usr/bin/chungus2 1700000000
caps=$(podman run --rm "${CHUNKED_IMAGE}" getcap /usr/bin/test-xattrs)
[[ "${caps}" == *"cap_net_raw=ep"* ]]
acl=$(podman run --rm "${CHUNKED_IMAGE}" getfacl -c /usr/bin/test-xattrs)
[[ "${acl}" == *"user:nobody:r--"* ]]
xattr1=$(podman run --rm "${CHUNKED_IMAGE}" getfattr -n user.testkey1 --only-values /usr/bin/test-xattrs)
[[ "${xattr1}" == "testvalue1" ]]
xattr2=$(podman run --rm "${CHUNKED_IMAGE}" getfattr -n user.testkey2 --only-values /usr/bin/test-xattrs)
[[ "${xattr2}" == "testvalue2" ]]
buildah_build --no-cache -t "${CHUNKED_IMAGE2}" -f Containerfile .
id1=$(podman inspect --format '{{.Id}}' "${CHUNKED_IMAGE}")
id2=$(podman inspect --format '{{.Id}}' "${CHUNKED_IMAGE2}")
if [[ "${id1}" != "${id2}" ]]; then
echo "ERROR: image IDs differ between builds"
echo "Build 1: ${id1}"
echo "Build 2: ${id2}"
assert_no_diff "${CHUNKED_IMAGE}" "${CHUNKED_IMAGE2}"
exit 1
fi
sed -i -e 's/\<SOURCE_DATE_EPOCH=17/SOURCE_DATE_EPOCH=16/' Containerfile
buildah_build --no-cache -t "${CHUNKED_IMAGE3}" -f Containerfile .
assert_layer_unmodified "bigfiles/chungus" "${CHUNKED_IMAGE}" "${CHUNKED_IMAGE3}"