Skip to content

Commit b54eaf3

Browse files
authored
microshift-io/microshift-nightly COPR: RPM with rhocp-mirror-beta configs (#203)
* Tools for creating RPM with rhocp beta .repo files * Add rhocp deps rpm to nightly-copr workflow * Update docs * containernetworking-plugins RPM * General improvement around COPR tools
1 parent 96ec1e9 commit b54eaf3

9 files changed

Lines changed: 309 additions & 22 deletions

File tree

.github/workflows/nightly-copr.yaml

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,57 @@ on:
44
schedule:
55
- cron: "0 1 * * *"
66
workflow_dispatch:
7+
inputs:
8+
copr-repo-name:
9+
description: COPR repository name
10+
default: "@microshift-io/microshift-nightly"
11+
type: string
712

813
env:
9-
COPR_REPO_NAME: "@microshift-io/microshift-nightly"
14+
COPR_REPO_NAME: ${{ github.event.inputs.copr-repo-name || '@microshift-io/microshift-nightly' }}
1015

1116
jobs:
17+
build-dependencies-rpm:
18+
if: github.event_name != 'schedule' || github.repository == 'microshift-io/microshift'
19+
runs-on: ubuntu-24.04
20+
steps:
21+
- name: Check out MicroShift upstream repository
22+
uses: actions/checkout@v4
23+
24+
- name: Detect OKD version tag
25+
id: detect-okd-version
26+
uses: ./.github/actions/okd-version
27+
28+
- name: Build dependencies RPM
29+
shell: bash
30+
env:
31+
COPR_CONFIG: |
32+
${{ secrets.COPR_CONFIG }}
33+
run: |
34+
set -euo pipefail
35+
cd ${GITHUB_WORKSPACE}/
36+
echo "${COPR_CONFIG}" > /tmp/copr-config
37+
38+
make copr-dependencies \
39+
OKD_VERSION_TAG=${{ steps.detect-okd-version.outputs.okd-version-tag }} \
40+
COPR_REPO_NAME=${{ env.COPR_REPO_NAME }} \
41+
COPR_CONFIG=/tmp/copr-config
42+
43+
- name: Build CNI plugins RPM
44+
shell: bash
45+
env:
46+
COPR_CONFIG: |
47+
${{ secrets.COPR_CONFIG }}
48+
run: |
49+
set -euo pipefail
50+
cd ${GITHUB_WORKSPACE}/
51+
echo "${COPR_CONFIG}" > /tmp/copr-config
52+
53+
make copr-cni \
54+
COPR_REPO_NAME=${{ env.COPR_REPO_NAME }} \
55+
COPR_CONFIG=/tmp/copr-config
56+
57+
1258
build-rpms:
1359
if: github.event_name != 'schedule' || github.repository == 'microshift-io/microshift'
1460
runs-on: ubuntu-24.04

docs/run.md

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,13 @@ sudo ./src/rpm/create_repos.sh -delete
3838
#### RPMs from the COPR
3939

4040
Run the following commands to install MicroShift nightly RPM packages from the COPR.
41-
Before installing MicroShift, RHOCP beta mirror must be enabled to provide dependencies.
42-
43-
> Note: By skipping `create_repos.sh -delete` users can keep the RPM repositories configuration
44-
> and use `dnf update` to update MicroShift and its dependencies (withing single Major.Minor release
45-
> when new MicroShift minor version is released, rerunning the `create_repos.sh -rhocp-mirror` might be necessary
46-
> to enable newer dependency repository).
4741

4842
```bash
4943
sudo dnf copr enable -y @microshift-io/microshift-nightly
50-
sudo ./src/rpm/create_repos.sh -rhocp-mirror
44+
# microshift-io-dependencies must be installed
45+
# before microshift in order to setup dependencies repositories.
46+
sudo dnf install -y microshift-io-dependencies
5147
sudo dnf install -y microshift microshift-kindnet
52-
# Optionally run the following command to remove the configured MicroShift COPR and dependencies repositories.
53-
# sudo ./src/rpm/create_repos.sh -delete
5448
```
5549

5650
### Start MicroShift Service

src/copr/cni/build.sh

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
#!/usr/bin/env bash
2+
3+
set -euo pipefail
4+
5+
_package_name="containernetworking-plugins"
6+
_scriptdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7+
8+
if [ $# -ne 1 ]; then
9+
echo "Usage: $(basename "$0") <copr-repo-name>"
10+
exit 1
11+
fi
12+
13+
COPR_REPO_NAME="$1"
14+
15+
[ -z "${COPR_REPO_NAME}" ] && echo "ERROR: COPR_REPO_NAME is not set" && exit 1
16+
echo "COPR_REPO_NAME: '${COPR_REPO_NAME}'"
17+
18+
latest_tag=$(curl -fsSL --retry 3 \
19+
-H "Accept: application/vnd.github+json" \
20+
-H "X-GitHub-Api-Version: 2022-11-28" \
21+
https://api.github.com/repos/containernetworking/plugins/releases/latest | jq -r '.tag_name')
22+
23+
if [ -z "${latest_tag}" ] || [ "${latest_tag}" = "null" ]; then
24+
echo "ERROR: Failed to retrieve latest tag from containernetworking/plugins" >&2
25+
exit 1
26+
fi
27+
28+
echo "### containernetworking/plugins latest tag: '${latest_tag}'"
29+
version="${latest_tag#v}"
30+
31+
echo "### Checking if package ${_package_name} ${version} already exists in the COPR repository"
32+
cni_pkg="$(copr-cli list-packages "${COPR_REPO_NAME}" | jq -r '.[] | select(.name == "'${_package_name}'")')"
33+
if [ -n "${cni_pkg}" ]; then
34+
existing_package_version=$(copr-cli get-package \
35+
--name "${_package_name}" \
36+
--with-latest-succeeded-build \
37+
"${COPR_REPO_NAME}" \
38+
| jq -r '.latest_succeeded_build.source_package.version')
39+
40+
if [[ "${existing_package_version}" == "1:${version}-1" ]]; then
41+
echo "### Package ${_package_name} ${version} already exists in the COPR repository"
42+
exit 0
43+
fi
44+
fi
45+
46+
temp_dir="$(mktemp -d "/tmp/containernetworking-plugins-${version}.XXXXXX")"
47+
cp "${_scriptdir}/containernetworking-plugins.spec" "${temp_dir}/"
48+
49+
pushd "${temp_dir}" >/dev/null
50+
51+
echo "### Downloading the CNI plugins x86_64 and aarch64 releases for ${version}"
52+
curl -L -o amd64.tgz "https://github.com/containernetworking/plugins/releases/download/v${version}/cni-plugins-linux-amd64-v${version}.tgz"
53+
curl -L -o arm64.tgz "https://github.com/containernetworking/plugins/releases/download/v${version}/cni-plugins-linux-arm64-v${version}.tgz"
54+
55+
mkdir -p "containernetworking-plugins-${version}"/{x86_64,aarch64}
56+
57+
tar xf amd64.tgz -C "containernetworking-plugins-${version}/x86_64"
58+
tar xf arm64.tgz -C "containernetworking-plugins-${version}/aarch64"
59+
cp \
60+
"containernetworking-plugins-${version}/x86_64/LICENSE" \
61+
"containernetworking-plugins-${version}/x86_64/README.md" \
62+
"containernetworking-plugins-${version}/"
63+
64+
tar czf "containernetworking-plugins-${version}.tar.gz" -C "containernetworking-plugins-${version}" .
65+
66+
mkdir -p buildroot/{RPMS,SRPMS,SOURCES,SPECS,BUILD}
67+
mv "containernetworking-plugins-${version}.tar.gz" buildroot/SOURCES/
68+
69+
cat > buildroot/SPECS/containernetworking-plugins.spec <<EOF
70+
%global ver ${version}
71+
72+
EOF
73+
cat containernetworking-plugins.spec >> buildroot/SPECS/containernetworking-plugins.spec
74+
75+
echo "### Building the SRPM"
76+
rpmbuild -bs --define "_topdir ./buildroot" ./buildroot/SPECS/containernetworking-plugins.spec
77+
78+
echo "### Pushing the SRPM to COPR (${COPR_REPO_NAME}) and waiting for the build"
79+
# Just epel-10 chroots because of the obsolesence of the original package in the CentOS Stream 10.
80+
if copr-cli build "${COPR_REPO_NAME}" \
81+
--chroot epel-10-aarch64 --chroot epel-10-x86_64 \
82+
"${temp_dir}/buildroot/SRPMS/containernetworking-plugins-${version}-1.src.rpm"; then
83+
copr-cli regenerate-repos "${COPR_REPO_NAME}"
84+
else
85+
exit 1
86+
fi
87+
88+
popd >/dev/null
89+
rm -rf "${temp_dir}"
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
%global debug_package %{nil}
2+
3+
Name: containernetworking-plugins
4+
# Setting epoch to workaround containers-common's Obsolete of 'containernetworking-plugins < 2'
5+
Epoch: 1
6+
Version: %{ver}
7+
Release: 1
8+
Summary: Binaries required to provision kubernetes container networking
9+
10+
Packager: MicroShift team
11+
License: Apache-2.0
12+
URL: https://microshift.io
13+
Source0: %{name}-%{version}.tar.gz
14+
15+
%description
16+
%{summary}.
17+
18+
%prep
19+
%setup -q -c
20+
21+
%build
22+
# Nothing to build
23+
24+
%install
25+
# Detect host arch
26+
KUBE_ARCH="$(uname -m)"
27+
28+
# Install files
29+
mkdir -p %{buildroot}/usr/libexec/cni/
30+
mkdir -p %{buildroot}%{_sysconfdir}/cni/net.d/
31+
32+
cp -a ${KUBE_ARCH}/* %{buildroot}/usr/libexec/cni/
33+
34+
%files
35+
/usr/libexec/cni/
36+
%dir %{_sysconfdir}/cni
37+
%dir %{_sysconfdir}/cni/net.d
38+
%license LICENSE
39+
%doc README.md
40+
41+
%changelog
42+
* Fri Feb 13 2026 Patryk Matuszak <pmatusza@redhat.com> 0.0.0
43+
- Init specfile based on https://download.opensuse.org/repositories/isv:/kubernetes:/core:/prerelease:/v1.36/rpm/src/kubernetes-cni-1.8.0-150500.1.1.src.rpm

src/copr/copr-cli.Containerfile

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
11
FROM quay.io/fedora/fedora:latest
22

3-
RUN dnf install -y copr-cli && dnf clean all
3+
RUN dnf install \
4+
--setopt=install_weak_deps=False \
5+
-y \
6+
copr-cli jq rpm-build \
7+
&& dnf clean all
8+
9+
COPY create-build.sh microshift-io-dependencies.sh cni/containernetworking-plugins.spec /
10+
COPY cni/build.sh cni/containernetworking-plugins.spec /cni/

src/copr/copr.mk

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -61,25 +61,25 @@ copr-cli:
6161
@echo "Building the COPR CLI container"
6262
sudo podman build \
6363
--tag "${COPR_CLI_IMAGE}" \
64-
--file src/copr/copr-cli.Containerfile .
64+
--file src/copr/copr-cli.Containerfile src/copr/
6565

6666
.PHONY: copr-delete-build
6767
copr-delete-build: copr-cfg-ensure-podman-secret copr-cli
6868
@echo "Deleting the COPR build ${COPR_BUILD_ID}"
6969
sudo podman run \
7070
--rm \
71-
--secret ${COPR_SECRET_NAME} \
71+
--secret ${COPR_SECRET_NAME},target=/root/.config/copr \
7272
"${COPR_CLI_IMAGE}" \
73-
bash -c "copr-cli --config /run/secrets/${COPR_SECRET_NAME} delete-build ${COPR_BUILD_ID}"
73+
bash -c "copr-cli delete-build ${COPR_BUILD_ID}"
7474

7575
.PHONY: copr-regenerate-repos
7676
copr-regenerate-repos: copr-cfg-ensure-podman-secret copr-cli
7777
@echo "Regenerating the COPR repository"
7878
sudo podman run \
7979
--rm \
80-
--secret ${COPR_SECRET_NAME} \
80+
--secret ${COPR_SECRET_NAME},target=/root/.config/copr \
8181
"${COPR_CLI_IMAGE}" \
82-
bash -c "copr-cli --config /run/secrets/${COPR_SECRET_NAME} regenerate-repos ${COPR_REPO_NAME}"
82+
bash -c "copr-cli regenerate-repos ${COPR_REPO_NAME}"
8383

8484
.PHONY: copr-create-build
8585
copr-create-build: copr-cfg-ensure-podman-secret copr-cli
@@ -94,10 +94,9 @@ copr-create-build: copr-cfg-ensure-podman-secret copr-cli
9494
fi
9595
sudo podman run \
9696
--rm \
97-
--secret ${COPR_SECRET_NAME} \
97+
--secret ${COPR_SECRET_NAME},target=/root/.config/copr \
9898
--env COPR_REPO_NAME="${COPR_REPO_NAME}" \
9999
--volume "${SRPM_WORKDIR}:/srpms:Z" \
100-
--volume "./src/copr/create-build.sh:/create-build.sh:Z" \
101100
"${COPR_CLI_IMAGE}" \
102101
bash -c "bash -x /create-build.sh"
103102

@@ -109,3 +108,21 @@ copr-watch-build: copr-cli
109108
--volume "${SRPM_WORKDIR}:/srpms:Z" \
110109
"${COPR_CLI_IMAGE}" \
111110
bash -c "copr-cli watch-build ${COPR_BUILD_ID}"
111+
112+
.PHONY: copr-dependencies
113+
copr-dependencies: copr-cfg-ensure-podman-secret copr-cli
114+
@echo "Building RPM with MicroShift dependencies repositories configuration"
115+
sudo podman run \
116+
--rm -ti \
117+
--secret ${COPR_SECRET_NAME},target=/root/.config/copr \
118+
"${COPR_CLI_IMAGE}" \
119+
/microshift-io-dependencies.sh "${OKD_VERSION_TAG}" "${COPR_REPO_NAME}"
120+
121+
.PHONY: copr-cni
122+
copr-cni: copr-cfg-ensure-podman-secret copr-cli
123+
@echo "Building RPM with CNI plugins"
124+
sudo podman run \
125+
--rm -ti \
126+
--secret ${COPR_SECRET_NAME},target=/root/.config/copr \
127+
"${COPR_CLI_IMAGE}" \
128+
/cni/build.sh "${COPR_REPO_NAME}"

src/copr/create-build.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ if [[ -z "${COPR_REPO_NAME:-}" ]]; then
66
exit 1
77
fi
88

9-
out="$(copr-cli --config /run/secrets/copr-cfg build --nowait "${COPR_REPO_NAME}" /srpms/microshift*.src.rpm)"
9+
out="$(copr-cli build --nowait "${COPR_REPO_NAME}" /srpms/microshift*.src.rpm)"
1010
echo "${out}"
1111
build=$(echo "${out}" | grep "Created builds" | cut -d: -f2 | xargs)
1212
if [[ -z "${build}" ]]; then
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
#!/usr/bin/env bash
2+
set -euo pipefail
3+
4+
_package_name="microshift-io-dependencies"
5+
6+
if [ $# -ne 2 ]; then
7+
echo "Usage: $(basename "$0") <okd-version-tag> <copr-repo-name>"
8+
exit 1
9+
fi
10+
11+
OKD_VERSION_TAG="$1"
12+
COPR_REPO_NAME="$2"
13+
14+
echo "OKD_VERSION_TAG: '${OKD_VERSION_TAG}'"
15+
echo "COPR_REPO_NAME: '${COPR_REPO_NAME}'"
16+
17+
[ -z "${OKD_VERSION_TAG}" ] && echo "ERROR: OKD_VERSION_TAG is not set" && exit 1
18+
[ -z "${COPR_REPO_NAME}" ] && echo "ERROR: COPR_REPO_NAME is not set" && exit 1
19+
20+
major=$(echo "${OKD_VERSION_TAG}" | cut -d. -f1)
21+
minor=$(echo "${OKD_VERSION_TAG}" | cut -d. -f2)
22+
pkg_version="${major}.${minor}"
23+
echo "New package version: '${pkg_version}'"
24+
25+
if copr-cli list-packages "${COPR_REPO_NAME}" | jq -r '.[].name' | grep -q "${_package_name}"; then
26+
existing_package_version=$(copr-cli get-package \
27+
--name "${_package_name}" \
28+
--with-latest-succeeded-build \
29+
"${COPR_REPO_NAME}" \
30+
| jq -r '.latest_succeeded_build.source_package.version')
31+
32+
if [[ "${existing_package_version}" == "${pkg_version}-1" ]]; then
33+
echo "Package ${_package_name} ${pkg_version} already exists in the COPR repository"
34+
exit 0
35+
fi
36+
fi
37+
38+
# Include 3 repos (X.Y, X.Y-1, and X.Y-2) just in case there's some dependencies misalignment.
39+
minor_version_start=$((minor - 2))
40+
rhocp_versions=""
41+
for min in $(seq "${minor_version_start}" "${minor}") ; do
42+
rhocp_versions+="${major}.${min} "
43+
done
44+
45+
echo "RHOCP versions to create .repo files for: '${rhocp_versions}'"
46+
47+
dest=$(mktemp -d "/tmp/${_package_name}.XXXXXX")
48+
cat > "${dest}/${_package_name}.spec" <<EOF
49+
%global rhocp_versions ${rhocp_versions}
50+
%global version ${pkg_version}
51+
52+
Name: ${_package_name}
53+
Version: %{version}
54+
Release: 1%{?dist}
55+
Summary: RPM repository configurations for MicroShift dependencies
56+
57+
License: Apache-2.0
58+
URL: https://github.com/microshift-io/microshift-io
59+
BuildArch: noarch
60+
61+
%description
62+
This package installs RPM repository configuration files required
63+
for installing MicroShift dependencies from the OpenShift beta mirror repository.
64+
65+
%install
66+
install -d %{buildroot}%{_sysconfdir}/yum.repos.d
67+
68+
for v in %{rhocp_versions}; do
69+
cat >> %{buildroot}%{_sysconfdir}/yum.repos.d/openshift-mirror-beta.repo <<EOF2
70+
[openshift-mirror-\${v}-beta]
71+
name=OpenShift \${v} Mirror Beta Repository
72+
baseurl=https://mirror.openshift.com/pub/openshift-v4/\\\$basearch/dependencies/rpms/\${v}-el9-beta/
73+
enabled=1
74+
gpgcheck=0
75+
skip_if_unavailable=0
76+
77+
EOF2
78+
done
79+
80+
%files
81+
%config(noreplace) %{_sysconfdir}/yum.repos.d/openshift-mirror-beta.repo
82+
83+
EOF
84+
85+
echo "--------------- SPEC FILE ---------------"
86+
cat "${dest}/${_package_name}.spec"
87+
echo "-----------------------------------------"
88+
89+
if copr-cli build "${COPR_REPO_NAME}" "${dest}/${_package_name}.spec"; then
90+
copr-cli regenerate-repos "${COPR_REPO_NAME}"
91+
else
92+
exit 1
93+
fi

0 commit comments

Comments
 (0)