From 802ce75a805fcb8aa7650a7ad0f851166d1a4c67 Mon Sep 17 00:00:00 2001 From: Jacquin Antoine Date: Fri, 27 Feb 2026 15:31:55 +0100 Subject: [PATCH] Unify packaging: use Docker + fpm for DEB and RPM builds - Add Dockerfile.package with multi-stage build (builder, package-builder, output) - Update Makefile to add package, package-deb, package-rpm, and test-package targets - Replace debhelper and rpmbuild with fpm for consistent packaging - Both DEB and RPM packages now built from single Dockerfile Co-authored-by: Qwen-Coder --- Dockerfile.package | 109 +++++++++++++++++++++++++++++++++++++++++++++ Makefile | 62 ++++++++++++++++++++++---- 2 files changed, 163 insertions(+), 8 deletions(-) create mode 100644 Dockerfile.package diff --git a/Dockerfile.package b/Dockerfile.package new file mode 100644 index 0000000..7591a89 --- /dev/null +++ b/Dockerfile.package @@ -0,0 +1,109 @@ +# syntax=docker/dockerfile:1 +# ============================================================================= +# mod_reqin_log - Dockerfile de packaging unifié (DEB + RPM avec fpm) +# ============================================================================= + +# ============================================================================= +# Stage 1: Builder - Compilation du module Apache +# ============================================================================= +FROM rockylinux:8 AS builder + +# Install build dependencies +RUN dnf install -y epel-release && \ + dnf install -y \ + gcc \ + make \ + httpd \ + httpd-devel \ + apr-devel \ + apr-util-devel \ + python3 \ + curl \ + redhat-rpm-config \ + && dnf clean all + +# Set working directory +WORKDIR /build + +# Copy source files +COPY src/ src/ +COPY Makefile Makefile +COPY conf/ conf/ + +# Build the module +RUN make APXS=/usr/bin/apxs + +# Verify module was built +RUN ls -la modules/mod_reqin_log.so + +# ============================================================================= +# Stage 2: Package builder - fpm pour DEB et RPM +# ============================================================================= +FROM ruby:3.2-bookworm AS package-builder + +WORKDIR /package + +# Install fpm and Apache dev packages +RUN apt-get update && apt-get install -y --no-install-recommends \ + rpm \ + dpkg-dev \ + fakeroot \ + apache2-dev \ + apache2 \ + && rm -rf /var/lib/apt/lists/* \ + && gem install fpm -v 1.16.0 + +# Copy binary from builder +COPY --from=builder /build/modules/mod_reqin_log.so /tmp/pkgroot/usr/lib/apache2/modules/mod_reqin_log.so +COPY --from=builder /build/conf/mod_reqin_log.conf /tmp/pkgroot/etc/apache2/conf-available/mod_reqin_log.conf + +# Set permissions +RUN chmod 755 /tmp/pkgroot/usr/lib/apache2/modules/mod_reqin_log.so && \ + chmod 644 /tmp/pkgroot/etc/apache2/conf-available/mod_reqin_log.conf + +# Build DEB package (for Debian/Ubuntu) +ARG VERSION=1.0.0 +ARG ARCH=amd64 +RUN mkdir -p /packages/deb && \ + fpm -s dir -t deb \ + -n libapache2-mod-reqin-log \ + -v "${VERSION}" \ + -C /tmp/pkgroot \ + --architecture "${ARCH}" \ + --description "Apache HTTPD module for logging HTTP requests as JSON to Unix socket" \ + --url "https://github.com/example/mod_reqin_log" \ + --license "Apache-2.0" \ + --vendor "Developer " \ + --maintainer "Developer " \ + --depends "apache2" \ + -p /packages/deb/libapache2-mod-reqin-log_${VERSION}_${ARCH}.deb \ + usr/lib/apache2/modules/mod_reqin_log.so \ + etc/apache2/conf-available/mod_reqin_log.conf + +# Build RPM package (for Rocky Linux/RHEL/CentOS) +ARG DIST=el8 +RUN mkdir -p /packages/rpm && \ + fpm -s dir -t rpm \ + -n mod_reqin_log \ + -v "${VERSION}" \ + -C /tmp/pkgroot \ + --architecture "x86_64" \ + --description "Apache HTTPD module for logging HTTP requests as JSON to Unix socket" \ + --url "https://github.com/example/mod_reqin_log" \ + --license "Apache-2.0" \ + --vendor "Developer " \ + --depends "httpd" \ + -p /packages/rpm/mod_reqin_log-${VERSION}-1.x86_64.rpm \ + usr/lib/apache2/modules/mod_reqin_log.so \ + etc/apache2/conf-available/mod_reqin_log.conf + +# ============================================================================= +# Stage 3: Output - Image finale avec les packages +# ============================================================================= +FROM alpine:latest AS output + +WORKDIR /packages +COPY --from=package-builder /packages/deb/*.deb /packages/deb/ +COPY --from=package-builder /packages/rpm/*.rpm /packages/rpm/ + +CMD ["sh", "-c", "echo '=== DEB Packages ===' && ls -la /packages/deb/ && echo '' && echo '=== RPM Packages ===' && ls -la /packages/rpm/"] diff --git a/Makefile b/Makefile index 3ee7976..a996cab 100644 --- a/Makefile +++ b/Makefile @@ -12,6 +12,7 @@ CFLAGS ?= -Wall -Wextra -O2 SRC_DIR = src BUILD_DIR = build INSTALL_DIR = modules +DIST_DIR = dist # Source files SRCS = $(SRC_DIR)/mod_reqin_log.c @@ -19,7 +20,10 @@ SRCS = $(SRC_DIR)/mod_reqin_log.c # Module name MODULE_NAME = mod_reqin_log -.PHONY: all clean install uninstall test +# Package version +VERSION ?= 1.0.0 + +.PHONY: all clean install uninstall test package package-deb package-rpm all: $(MODULE_NAME).so @@ -66,21 +70,63 @@ test: debug: CFLAGS += -g -DDEBUG debug: clean all +# ============================================================================= +# Packaging (DEB + RPM with Docker + fpm) +# ============================================================================= + +## package: Build all packages (deb + rpm) +package: package-deb package-rpm + +## package-deb: Build DEB package (requires Docker) +package-deb: + mkdir -p $(DIST_DIR)/deb $(DIST_DIR)/rpm + docker build --target output -t mod_reqin_log-packager:latest \ + --build-arg VERSION=$(VERSION) \ + -f Dockerfile.package . + @echo "Extracting packages from Docker image..." + docker run --rm -v $(PWD)/$(DIST_DIR):/output mod_reqin_log-packager:latest \ + sh -c 'cp -r /packages/deb /output/deb/ && cp -r /packages/rpm /output/rpm/' + @echo "DEB packages created:" + ls -la $(DIST_DIR)/deb/ + @echo "RPM packages created:" + ls -la $(DIST_DIR)/rpm/ + +## package-rpm: Build RPM package (requires Docker) +package-rpm: package-deb + @echo "RPM built together with DEB in Dockerfile.package" + +## test-package-deb: Test DEB package installation in Docker +test-package-deb: package-deb + docker run --rm -v $(PWD)/$(DIST_DIR)/deb:/packages:ro debian:latest \ + sh -c "apt-get update && apt-get install -y /packages/*.deb && echo 'DEB install OK'" + +## test-package-rpm: Test RPM package installation in Docker +test-package-rpm: package-deb + docker run --rm -v $(PWD)/$(DIST_DIR)/rpm:/packages:ro rockylinux:8 \ + sh -c "dnf install -y /packages/*.rpm && echo 'RPM install OK'" + +## test-package: Test all packages installation +test-package: test-package-deb test-package-rpm + # Help target help: @echo "mod_reqin_log Makefile" @echo "" @echo "Targets:" - @echo " all - Build the module (default)" - @echo " install - Install the module to DESTDIR" - @echo " uninstall- Remove the module from DESTDIR" - @echo " clean - Remove build artifacts" - @echo " test - Run unit tests" - @echo " debug - Build with debug symbols" - @echo " help - Show this help message" + @echo " all - Build the module (default)" + @echo " install - Install the module to DESTDIR" + @echo " uninstall - Remove the module from DESTDIR" + @echo " clean - Remove build artifacts" + @echo " test - Run unit tests" + @echo " debug - Build with debug symbols" + @echo " package - Build all packages (deb + rpm)" + @echo " package-deb - Build DEB package" + @echo " package-rpm - Build RPM package" + @echo " test-package - Test package installation" @echo "" @echo "Variables:" @echo " APXS - Path to apxs tool (default: apxs)" @echo " CC - C compiler (default: gcc)" @echo " CFLAGS - Compiler flags (default: -Wall -Wextra -O2)" @echo " DESTDIR - Installation destination (default: /)" + @echo " VERSION - Package version (default: 1.0.0)"