Improve Docker-based build & test pipeline for pkgmgr

- Add .dockerignore rules to prevent Arch package artifacts from entering the build context
- Rework Dockerfile to remove stale package artifacts before makepkg and use a dev entry script
- Introduce docker-entry-dev.sh to always rebuild pkgmgr from the mounted /src tree
- Update Makefile 'test' target to rebuild pkgmgr inside the container before running tests
- Fix predictable makepkg failures caused by residual *.pkg.tar.* files

Conversation reference: https://chatgpt.com/share/6935e6e8-f3fc-800f-a4e9-7537114f13d1
This commit is contained in:
Kevin Veen-Birkenbach
2025-12-07 21:43:38 +01:00
parent 225d6a84b7
commit 9679478353
5 changed files with 49 additions and 9 deletions

View File

@@ -24,3 +24,7 @@ venv/
.idea/ .idea/
.DS_Store .DS_Store
Thumbs.db Thumbs.db
# Arch pkg artifacts
*.pkg.tar.*
*.log

View File

@@ -13,20 +13,21 @@ ENV NIX_CONFIG="experimental-features = nix-command flakes"
# 2) Unprivileged user for building Arch packages # 2) Unprivileged user for building Arch packages
RUN useradd -m builder RUN useradd -m builder
# 3) Build-Stage (optional): einmal aus /build bauen, wenn du magst
WORKDIR /build WORKDIR /build
# 3) Only PKGBUILD rein, um dein Wrapper-Paket zu bauen
COPY . . COPY . .
RUN chown -R builder:builder /build \ RUN chown -R builder:builder /build \
&& su builder -c "makepkg -s --noconfirm --clean" \ && su builder -c "cd /build && rm -f package-manager-*.pkg.tar.* && makepkg -sf --noconfirm --clean" \
&& pacman -U --noconfirm package-manager-*.pkg.tar.* \ && pacman -U --noconfirm package-manager-*.pkg.tar.* \
&& rm -rf /build && rm -rf /build
# 4) Projekt-Quellen für Tests in den Container kopieren # 4) Runtime-Workingdir für das gemountete Repo
WORKDIR /src WORKDIR /src
COPY . .
# pkgmgr (Arch-Package) ist installiert und ruft nix run auf. # 5) Entry-Script für „always build from /src“
ENTRYPOINT ["pkgmgr"] COPY scripts/docker-entry-dev.sh /usr/local/bin/docker-entry-dev.sh
RUN chmod +x /usr/local/bin/docker-entry-dev.sh
ENTRYPOINT ["/usr/local/bin/docker-entry-dev.sh"]
CMD ["--help"] CMD ["--help"]

View File

@@ -34,7 +34,20 @@ test: build
--workdir /src \ --workdir /src \
--entrypoint bash \ --entrypoint bash \
package-manager-test \ package-manager-test \
-c 'git config --global --add safe.directory /src && nix develop .#default --no-write-lock-file -c python3 -m unittest discover -s tests -p "test_*.py"' -c '\
set -e; \
echo "Remove existing Arch package-manager (if any)..."; \
pacman -Rns --noconfirm package-manager || true; \
echo "Rebuild Arch package from /src..."; \
rm -f /src/package-manager-*.pkg.tar.* || true; \
chown -R builder:builder /src; \
su builder -c "cd /src && makepkg -sf --noconfirm --clean"; \
pacman -U --noconfirm /src/package-manager-*.pkg.tar.*; \
echo "Run tests inside Nix devShell..."; \
git config --global --add safe.directory /src && \
nix develop .#default --no-write-lock-file -c \
python3 -m unittest discover -s tests -p \"test_*.py\" \
'
install: install:
@if [ -n "$$IN_NIX_SHELL" ]; then \ @if [ -n "$$IN_NIX_SHELL" ]; then \

Binary file not shown.

View File

@@ -0,0 +1,22 @@
#!/usr/bin/env bash
set -euo pipefail
echo "[entry] Using /src as working tree for package-manager..."
cd /src
# Optional: altes Paket entfernen
echo "[entry] Removing existing 'package-manager' Arch package (if installed)..."
pacman -Rns --noconfirm package-manager || true
# Build-Owner richtig setzen (falls /src vom Host kommt)
echo "[entry] Fixing ownership of /src for user 'builder'..."
chown -R builder:builder /src
echo "[entry] Rebuilding Arch package from /src as user 'builder'..."
su builder -c "cd /src && makepkg -s --noconfirm --clean"
echo "[entry] Installing freshly built package-manager-*.pkg.tar.*..."
pacman -U --noconfirm /src/package-manager-*.pkg.tar.*
echo "[entry] Handing off to pkgmgr with args: $*"
exec pkgmgr "$@"