From e0221b2431051918b0421f14829c9bb96044f3dd Mon Sep 17 00:00:00 2001 From: Patryk Matuszak Date: Mon, 1 Dec 2025 18:08:00 +0100 Subject: [PATCH 1/2] Make targets for COPR interactions --- Makefile | 3 + packaging/rpms-copr.Containerfile | 23 +++++++ src/copr/copr-cli.Containerfile | 3 + src/copr/copr.mk | 104 ++++++++++++++++++++++++++++++ src/copr/create-build.sh | 11 ++++ 5 files changed, 144 insertions(+) create mode 100644 packaging/rpms-copr.Containerfile create mode 100644 src/copr/copr-cli.Containerfile create mode 100644 src/copr/copr.mk create mode 100644 src/copr/create-build.sh diff --git a/Makefile b/Makefile index 8461ff37..08fef9ed 100644 --- a/Makefile +++ b/Makefile @@ -42,6 +42,9 @@ SRPM_IMAGE := microshift-okd-srpm LVM_DISK := /var/lib/microshift-okd/lvmdisk.image VG_NAME := myvg1 +PROJECT_DIR := $(shell dirname $(abspath $(lastword $(MAKEFILE_LIST)))) +include $(PROJECT_DIR)/src/copr/copr.mk + # # Define the main targets # diff --git a/packaging/rpms-copr.Containerfile b/packaging/rpms-copr.Containerfile new file mode 100644 index 00000000..ec7e7ab9 --- /dev/null +++ b/packaging/rpms-copr.Containerfile @@ -0,0 +1,23 @@ +FROM quay.io/fedora/fedora:42 + +RUN dnf install -y \ + --setopt=install_weak_deps=False \ + copr-cli createrepo rpm2cpio cpio && \ + dnf clean all + +ARG COPR_BUILD_ID= +ARG BUILDER_RPM_REPO_PATH=/home/microshift/microshift/_output/rpmbuild/RPMS + +# hadolint ignore=DL3003,DL4006,SC3040 +RUN <" + @echo " rpm-copr: build the MicroShift RPMs using COPR" + @echo " copr-delete-build: delete the COPR build" + @echo " copr-regenerate-repos: regenerate the COPR RPM repository" + @echo " copr-create-build: create the COPR RPM build" + @echo " copr-watch-build: watch the COPR build" + @echo " copr-cfg-ensure-podman-secret: ensure the COPR secret is available and is up to date" + @echo " copr-cli: build the COPR CLI container" + @echo "" + @echo "Variables:" + @echo " COPR_BUILD_ID: COPR build ID (default: read from \$$SRPM_WORKDIR/build.txt)" + @echo " COPR_REPO_NAME: COPR repository name (default: ${COPR_REPO_NAME})" + @echo " COPR_CONFIG: COPR configuration file - from https://copr.fedorainfracloud.org/api/ (default: ${COPR_CONFIG})" + @echo "" + @echo "Recommended flow:" + @echo " 1. mkdir -p /tmp/microshift-srpm-copr" + @echo " 2. make srpm SRPM_WORKDIR=/tmp/microshift-srpm-copr" + @echo " 3. make copr-create-build COPR_REPO_NAME=USER/PROJECT SRPM_WORKDIR=/tmp/microshift-srpm-copr" + @echo " 4. make copr-watch-build SRPM_WORKDIR=/tmp/microshift-srpm-copr" + @echo " 5. make rpm-copr SRPM_WORKDIR=/tmp/microshift-srpm-copr" + @echo " 6. make image BUILDER_IMAGE=rpm-copr-builder" + @echo "" + +.PHONY: rpm-copr +rpm-copr: + @echo "Building MicroShift RPM image using COPR" + sudo podman build \ + --tag "${COPR_BUILDER_IMAGE}" \ + --build-arg COPR_BUILD_ID="${COPR_BUILD_ID}" \ + --file packaging/rpms-copr.Containerfile . + + @echo "Extracting the MicroShift RPMs" + outdir="$${RPM_OUTDIR:-$$(mktemp -d /tmp/microshift-rpms-XXXXXX)}" && \ + mntdir="$$(sudo podman image mount "${COPR_BUILDER_IMAGE}")" && \ + sudo cp -r "$${mntdir}/home/microshift/microshift/_output/rpmbuild/RPMS/." "$${outdir}" && \ + sudo podman image umount "${COPR_BUILDER_IMAGE}" && \ + echo "" && \ + echo "Build completed successfully" && \ + echo "RPMs are available in '$${outdir}'" + +.PHONY: copr-cfg-ensure-podman-secret +copr-cfg-ensure-podman-secret: + @echo "Ensuring the COPR secret is available and is up to date" + if sudo podman secret exists "${COPR_SECRET_NAME}"; then \ + sudo podman secret rm "${COPR_SECRET_NAME}" ; \ + fi ; \ + sudo podman secret create "${COPR_SECRET_NAME}" "${COPR_CONFIG}" + +.PHONY: copr-cli +copr-cli: + @echo "Building the COPR CLI container" + sudo podman build \ + --tag "${COPR_CLI_IMAGE}" \ + --file src/copr/copr-cli.Containerfile . + +.PHONY: copr-delete-build +copr-delete-build: copr-cfg-ensure-podman-secret copr-cli + @echo "Deleting the COPR build ${COPR_BUILD_ID}" + sudo podman run \ + --rm \ + --secret ${COPR_SECRET_NAME} \ + "${COPR_CLI_IMAGE}" \ + bash -c "copr-cli --config /run/secrets/copr-cfg delete-build ${COPR_BUILD_ID}" + +.PHONY: copr-regenerate-repos +copr-regenerate-repos: copr-cfg-ensure-podman-secret copr-cli + @echo "Regenerating the COPR repository" + sudo podman run \ + --rm \ + --secret ${COPR_SECRET_NAME} \ + "${COPR_CLI_IMAGE}" \ + bash -c "copr-cli --config /run/secrets/copr-cfg regenerate-repos ${COPR_REPO_NAME}" + +.PHONY: copr-create-build +copr-create-build: copr-cfg-ensure-podman-secret copr-cli + @echo "Creating the COPR build" + sudo podman run \ + --rm \ + --secret ${COPR_SECRET_NAME} \ + --env COPR_REPO_NAME="${COPR_REPO_NAME}" \ + --volume "${SRPM_WORKDIR}:/srpms:Z" \ + --volume "./src/copr/create-build.sh:/create-build.sh:Z" \ + "${COPR_CLI_IMAGE}" \ + bash -c "bash -x /create-build.sh" + +.PHONY: copr-watch-build +copr-watch-build: copr-cli + @echo "Watching the COPR build" + sudo podman run \ + --rm \ + --volume "${SRPM_WORKDIR}:/srpms:Z" \ + "${COPR_CLI_IMAGE}" \ + bash -c "copr-cli watch-build \$$(cat /srpms/build.txt)" diff --git a/src/copr/create-build.sh b/src/copr/create-build.sh new file mode 100644 index 00000000..13f42807 --- /dev/null +++ b/src/copr/create-build.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -euo pipefail + +out="$(copr-cli --config /run/secrets/copr-cfg build --nowait "${COPR_REPO_NAME}" /srpms/microshift*.src.rpm)" +echo "${out}" +build=$(echo "${out}" | grep "Created builds" | cut -d: -f2 | xargs) +if [[ -z "${build}" ]]; then + echo "ERROR: Failed to extract build ID from copr-cli output" + exit 1 +fi +echo "${build}" > /srpms/build.txt From 551ee5dd85dd017ed29dc4db48c38bd672d2b3ba Mon Sep 17 00:00:00 2001 From: Patryk Matuszak Date: Mon, 1 Dec 2025 18:09:53 +0100 Subject: [PATCH 2/2] Configurable FROM for the runner --- Makefile | 7 ++++--- packaging/microshift-runner.Containerfile | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 08fef9ed..28f0e3b6 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,7 @@ else OKD_RELEASE_IMAGE ?= $(OKD_RELEASE_IMAGE_X86_64) endif -BUILDER_IMAGE := microshift-okd-builder +BUILDER_IMAGE ?= microshift-okd-builder USHIFT_IMAGE := microshift-okd SRPM_IMAGE := microshift-okd-srpm LVM_DISK := /var/lib/microshift-okd/lvmdisk.image @@ -116,8 +116,8 @@ rpm-to-deb: .PHONY: image image: - @if ! sudo podman image exists microshift-okd-builder ; then \ - echo "ERROR: Run 'make rpm' to build the MicroShift RPMs" ; \ + @if ! sudo podman image exists "${BUILDER_IMAGE}" ; then \ + echo "ERROR: Run 'make rpm' or 'make rpm-copr' to build the MicroShift RPMs" ; \ exit 1 ; \ fi @@ -129,6 +129,7 @@ image: --label okd.version="${OKD_VERSION_TAG}" \ --build-arg BOOTC_IMAGE_URL="${BOOTC_IMAGE_URL}" \ --build-arg BOOTC_IMAGE_TAG="${BOOTC_IMAGE_TAG}" \ + --build-arg RPM_BUILDER_IMAGE="${BUILDER_IMAGE}" \ --env WITH_KINDNET="${WITH_KINDNET}" \ --env WITH_TOPOLVM="${WITH_TOPOLVM}" \ --env WITH_OLM="${WITH_OLM}" \ diff --git a/packaging/microshift-runner.Containerfile b/packaging/microshift-runner.Containerfile index 3c16b991..c509db7f 100644 --- a/packaging/microshift-runner.Containerfile +++ b/packaging/microshift-runner.Containerfile @@ -1,8 +1,9 @@ # Optionally allow for the base image override ARG BOOTC_IMAGE_URL=quay.io/centos-bootc/centos-bootc ARG BOOTC_IMAGE_TAG=stream9 +ARG RPM_BUILDER_IMAGE=microshift-okd-builder -FROM localhost/microshift-okd-builder:latest AS builder +FROM localhost/${RPM_BUILDER_IMAGE}:latest AS builder FROM ${BOOTC_IMAGE_URL}:${BOOTC_IMAGE_TAG} ARG REPO_CONFIG_SCRIPT=/tmp/create_repos.sh