diff --git a/Dockerfile.deb b/Dockerfile.deb index 890834d..94c501c 100644 --- a/Dockerfile.deb +++ b/Dockerfile.deb @@ -1,4 +1,7 @@ -FROM ubuntu:noble +ARG DISTRO=ubuntu +ARG RELEASE=noble + +FROM ${DISTRO}:${RELEASE} RUN apt-get update && apt-get install -y \ dpkg-dev \ diff --git a/Dockerfile.el7 b/Dockerfile.el7 new file mode 100644 index 0000000..b89d2d8 --- /dev/null +++ b/Dockerfile.el7 @@ -0,0 +1,15 @@ +# Dockerfile.rpm + +ARG DISTRO=oraclelinux +ARG RELEASE=7 + +FROM ${DISTRO}:${RELEASE} + +RUN yum install -y \ + rpm-build \ + make \ + oracle-epel-release-el7 \ + && yum clean all + +WORKDIR /src +CMD ["make", "package-rpm"] diff --git a/Dockerfile.rpm b/Dockerfile.rpm index 547c38d..1b229df 100644 --- a/Dockerfile.rpm +++ b/Dockerfile.rpm @@ -1,5 +1,9 @@ # Dockerfile.rpm -FROM rockylinux:9 + +ARG DISTRO=rockylinux +ARG RELEASE=9 + +FROM ${DISTRO}:${RELEASE} RUN dnf install -y \ rpm-build \ diff --git a/Makefile b/Makefile index 70cfecd..e6b2b0d 100644 --- a/Makefile +++ b/Makefile @@ -8,8 +8,15 @@ RPM_IMAGE := rpm-package-builder SCRIPT := src/$(PACKAGE_NAME).py -# Top-level targets -.PHONY: all clean deb rpm test +INSTALL_TEST_DEBIAN := 11 +INSTALL_TEST_REDHAT := 9 +INSTALL_TEST_UBUNTU := 24.04 + +## +# These targets are the main ones to use for most things. +## + +.PHONY: all clean deb rpm test install install-tests all: deb rpm @@ -18,6 +25,7 @@ deb: docker run --rm \ -v .:/src:ro \ -v ./$(BUILD_DIR)/deb:/output \ + --user $(shell id -u):$(shell i -g) \ $(DEB_IMAGE) rpm: @@ -25,47 +33,21 @@ rpm: docker run --rm \ -v .:/src:ro \ -v ./$(BUILD_DIR)/rpm:/output \ + --user $(shell id -u):$(shell i -g) \ $(RPM_IMAGE) +tgz: + rm -rf $(BUILD_DIR)/tgz/root + mkdir -p $(BUILD_DIR)/tgz/root + $(MAKE) install DESTDIR=$(BUILD_DIR)/tgz/root + tar -cz -f $(BUILD_DIR)/tgz/$(PACKAGE_NAME)-$(VERSION).tgz -C $(BUILD_DIR)/tgz/root . + clean: rm -rf $(BUILD_DIR) test: cd src ; python3 -m unittest -# Container targets -.PHONY: docker deb-package-image rpm-package-image - -docker: deb-package-image rpm-package-image - -deb-package-image: Dockerfile.deb - docker build -t $(DEB_IMAGE) -f Dockerfile.deb . - -rpm-package-image: Dockerfile.rpm - docker build -t $(RPM_IMAGE) -f Dockerfile.rpm . - - -# Inside-container targets -.PHONY: package-deb package-rpm - -# Debian package creation logic -package-deb: - $(MAKE) install DESTDIT=/output - cp -r DEBIAN /output/ - dpkg-deb --build /output /output/$(PACKAGE_NAME)_$(VERSION).deb - -# RPM package creation logic -package-rpm: - mkdir -p /output/{BUILD,RPMS,SOURCES,SPECS,SRPMS} - cp RPM/$(PACKAGE_NAME).spec /output/SPECS/ - rpmbuild --define '_topdir /output' \ - --define 'version $(VERSION)' \ - -bb /output/SPECS/$(PACKAGE_NAME).spec - cp /output/RPMS/x86_64/*.rpm /output/ - -# Install into the specified destination directory (used inside the packaging systems) -.PHONY: install - install: # Set up directories mkdir -p $(DESTDIR)/usr/local/bin @@ -86,3 +68,66 @@ install: # Install systemd unit files cp systemd/* $(DESTDIR)/lib/systemd/system/ + +install-tests: debian-install-test rocky-install-test ubuntu-install-test + +debian-install-test: + docker run --rm \ + -v ./$(BUILD_DIR)/deb:/output \ + debian:$(INSTALL_TEST_DEBIAN) \ + bash -c 'apt-get update && apt-get install -y /output/$(PACKAGE_NAME)_$(VERSION).deb' + +rocky-install-test: + docker run --rm \ + -v ./$(BUILD_DIR)/rpm:/output \ + rockylinux:$(INSTALL_TEST_REDHAT) \ + bash -c 'yum makecache && yum install -y /output/$(PACKAGE_NAME)-$(VERSION)-1.el$(INSTALL_TEST_REDHAT).noarch.rpm' + +ubuntu-install-test: + docker run --rm \ + -v ./$(BUILD_DIR)/deb:/output \ + ubuntu:$(INSTALL_TEST_UBUNTU) \ + bash -c 'apt-get update && apt-get install -y /output/$(PACKAGE_NAME)_$(VERSION).deb' + + +## +# Inside-container targets +# +# These targets are used inside containers. They expect the repo to be mounted +# at /src and the package manager specific build directory to be mounted at +# /output. +## + +.PHONY: package-deb package-rpm + +# Debian package creation logic +package-deb: + $(MAKE) install DESTDIR=/output + cp -r DEBIAN /output/ + dpkg-deb -Zgzip --build /output /output/$(PACKAGE_NAME)_$(VERSION).deb + +# RPM package creation logic +package-rpm: + mkdir -p /output/{BUILD,RPMS,SOURCES,SPECS,SRPMS} + cp RPM/$(PACKAGE_NAME).spec /output/SPECS/ + rpmbuild --define '_topdir /output' \ + --define 'version $(VERSION)' \ + -bb /output/SPECS/$(PACKAGE_NAME).spec + cp /output/RPMS/noarch/*.rpm /output/ + + +## +# Container targets +# +# These targets build the docker images used to create packages +## + +.PHONY: docker deb-package-image rpm-package-image + +docker: deb-package-image rpm-package-image + +deb-package-image: Dockerfile.deb + docker build -t $(DEB_IMAGE) -f Dockerfile.deb . + +rpm-package-image: Dockerfile.rpm + docker build -t $(RPM_IMAGE) -f Dockerfile.rpm . diff --git a/RPM/pgmon.spec b/RPM/pgmon.spec index 1428214..6a4da7a 100644 --- a/RPM/pgmon.spec +++ b/RPM/pgmon.spec @@ -5,8 +5,8 @@ Summary: A bridge to sit between monitoring tools and PostgreSQL License: MIT URL: https://www.commandprompt.com -Source0: %{name}-%{version}.tar.gz +BuildArch: noarch Requires: python3, python3-psycopg2, systemd %description