--- /dev/null
+FROM $distro
+ENV DEBIAN_FRONTEND=noninteractive
+RUN apt-get update \
+ && apt-get install --assume-yes --no-install-recommends \
+ build-essential \
+ cmake \
+ file \
+ git \
+ cppcheck \
+ lcov \
+ && apt-get clean \
+ && rm --recursive --force /var/lib/apt/lists/*
+RUN apt-get update \
+ && apt-get install --assume-yes --no-install-recommends \
+ rsync \
+ bats \
+ bats-support \
+ bats-assert \
+ parallel \
+ sane-utils \
+ qpdf \
+ ocrmypdf \
+ libtiff-tools \
+ pdftk \
+ pdfgrep \
+ exiftool \
+ && apt-get clean \
+ && rm --recursive --force /var/lib/apt/lists/*
+COPY run /app/run
+ENTRYPOINT /app/run
--- /dev/null
+#!/bin/bash
+
+create_containerfile()
+{
+ local distro="$1"
+ local distro_postfix="$2"
+
+ cat builder/Containerfile.template \
+ | sed "s/\$distro/$distro/" \
+ > build/Containerfile-$distro_postfix \
+ || return $?
+}
+
+build_container_image()
+{
+ local distro_postfix="$1"
+
+ podman build \
+ --tag scantopdf-builder:$distro_postfix \
+ --file build/Containerfile-$distro_postfix \
+ || return $?
+}
+
+run_builder_container()
+{
+ local distro_postfix="$1"
+
+ podman run \
+ --tty \
+ --rm \
+ --volume .:/src \
+ scantopdf-builder:$distro_postfix \
+ || return $?
+}
+
+main()
+{
+ local distros=${DISTROS:="debian:oldstable-slim debian:stable-slim debian:testing-slim ubuntu:latest ubuntu:rolling"}
+ mkdir --parents build
+ cp builder/run build/run
+ chmod 755 build/run
+
+ for distro in $distros; do
+ local distro_postfix=${distro/:/-}
+ create_containerfile "$distro" "$distro_postfix" || return $?
+ build_container_image "$distro_postfix" || return $?
+ run_builder_container "$distro_postfix" || return $?
+ done
+}
+
+main
--- /dev/null
+#!/bin/bash
+
+get_source_date()
+{
+ umask 0022
+ cd /src && export SOURCE_DATE_EPOCH=$(git log --max-count=1 --pretty="%ct")
+ export EXTRA_VERSION="-$ID-$VERSION_CODENAME"
+}
+
+create_package_checksum()
+{
+ cd /app/build/build
+ local package=$(find . -maxdepth 1 -name '*.deb')
+ sha256sum *.deb > $package.sha256 || return $?
+ cat $package.sha256 || return $?
+}
+
+reproducible_package_checksum_check()
+{
+ cd /app/reproducible-build/build
+ local package=$(find . -maxdepth 1 -name '*.deb')
+ cp /src/build/$package.sha256 . || return $?
+ cat $package.sha256 || return $?
+ sha256sum -c $package.sha256
+}
+
+run_tests()
+{
+ cd /app
+ rsync -r --exclude=build* /src/ /app/tests/ || return $?
+ cd /app/tests
+ make --jobs=$(nproc) test || return $?
+}
+
+build_package()
+{
+ cd /app
+ rsync -r --exclude=build* /src/ /app/build || return $?
+ cd build
+ make --jobs=$(nproc) package || return $?
+}
+
+copy_package()
+{
+ mkdir --parents /src/build
+ cp /app/build/build/*.deb /src/build/ || return $?
+ cp /app/build/build/*.sha256 /src/build/ || return $?
+}
+
+build_reproducible_package()
+{
+ cd /app
+ rsync -r --exclude=build* /src/ /app/reproducible-build || return $?
+ cd reproducible-build
+ make --jobs=$(nproc) package || return $?
+}
+
+main()
+{
+ source /etc/os-release
+ get_source_date || return $?
+
+ run_tests || return $?
+ build_package || return $?
+ create_package_checksum || return $?
+ copy_package || return $?
+
+ build_reproducible_package || return $?
+ reproducible_package_checksum_check || return $?
+}
+
+main
\ No newline at end of file