From e7d8a39fcfa8f2da30f63feed3088c4db94be2b7 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Wed, 18 Dec 2024 09:41:31 +0100 Subject: [PATCH] test: add minimal test for container based building of images This commit adds a smoke test that builds the ibcli container and runs a fedora-41 raw-minimal build to double check that the container based building actually works. Thanks to Ondrej for suggesting this. --- .github/workflows/go.yml | 8 +------- .github/workflows/testdeps.yml | 10 ++++++++++ Containerfile | 2 +- entrypoint.sh | 2 -- test/containerbuild.py | 23 +++++++++++++++++++++++ test/test_container.py | 27 +++++++++++++++++++++++++++ 6 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 .github/workflows/testdeps.yml create mode 100644 test/containerbuild.py create mode 100644 test/test_container.py diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index 7dbaf2e..810e047 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -13,6 +13,7 @@ jobs: build: runs-on: ubuntu-latest + uses: ./.github/workflows/testdeps.yml steps: - uses: actions/checkout@v4 @@ -21,13 +22,6 @@ jobs: with: go-version: 'stable' - - name: Apt update - run: sudo apt update - - # This is needed for the container resolver dependencies - - name: Install test dependencies - run: sudo apt install -y libgpgme-dev libbtrfs-dev libdevmapper-dev podman - - name: Build run: go build -v ./... diff --git a/.github/workflows/testdeps.yml b/.github/workflows/testdeps.yml new file mode 100644 index 0000000..09a02c6 --- /dev/null +++ b/.github/workflows/testdeps.yml @@ -0,0 +1,10 @@ +name: Install test dependencies + +jobs: + install: + runs-on: ubuntu-latest + steps: + - name: Install test dependencies + run: | + sudo apt update + sudo apt install -y libgpgme-dev libbtrfs-dev libdevmapper-dev podman diff --git a/Containerfile b/Containerfile index 4ccd3b2..9e11bee 100644 --- a/Containerfile +++ b/Containerfile @@ -48,8 +48,8 @@ COPY entrypoint.sh /entrypoint.sh ENTRYPOINT ["/entrypoint.sh"] VOLUME /output WORKDIR /output +# XXX: add "store" flag like bib VOLUME /store -VOLUME /rpmmd VOLUME /var/lib/containers/storage LABEL description="This tools allows to build and deploy disk-images." diff --git a/entrypoint.sh b/entrypoint.sh index 939c3b5..5a67770 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -9,11 +9,9 @@ mkdir /run/osbuild mkdir /run/osbuild-store mount -t tmpfs tmpfs /run/osbuild -mount -t tmpfs tmpfs /run/osbuild-store cp -p /usr/bin/osbuild /run/osbuild/osbuild -chcon system_u:object_r:root_t:s0 /run/osbuild-store chcon system_u:object_r:install_exec_t:s0 /run/osbuild/osbuild mount -t devtmpfs devtmpfs /dev diff --git a/test/containerbuild.py b/test/containerbuild.py new file mode 100644 index 0000000..bf5a4bc --- /dev/null +++ b/test/containerbuild.py @@ -0,0 +1,23 @@ +import os +import platform +import random +import string +import subprocess +import textwrap +from contextlib import contextmanager + +import pytest + + +# XXX: copied from bib +@pytest.fixture(name="build_container", scope="session") +def build_container_fixture(): + """Build a container from the Containerfile and returns the name""" + + container_tag = "image-builder-cli-test" + subprocess.check_call([ + "podman", "build", + "-f", "Containerfile", + "-t", container_tag, + ]) + return container_tag diff --git a/test/test_container.py b/test/test_container.py new file mode 100644 index 0000000..6f6a87f --- /dev/null +++ b/test/test_container.py @@ -0,0 +1,27 @@ +import os +import subprocess + +import pytest + +from containerbuild import build_container_fixture + + +@pytest.mark.skipif(os.getuid() != 0, reason="needs root") +def test_container_builds_image(tmp_path, build_container): + output_dir = tmp_path / "output" + output_dir.mkdir() + subprocess.check_call([ + "podman", "run", + "--privileged", + "-v", f"{output_dir}:/output", + build_container, + "build", + "minimal-raw", + "--distro", "fedora-41" + ]) + arch = "x86_64" + assert (output_dir / f"fedora-41-minimal-raw-{arch}/xz/disk.raw.xz").exists() + # XXX: ensure no other leftover dirs + dents = os.listdir(output_dir) + assert len(dents) == 1, f"too many dentries in output dir: {dents}" +