1+ #! /bin/bash
2+
3+ # This script is used to publish new packages to the CLI RPM repository
4+ # Usage: ./publish-rpm-packages.sh
5+ set -eo pipefail
6+
7+ ROOT_DIR=$( git rev-parse --show-toplevel)
8+
9+ PACKAGES_BUCKET_URL=" https://packages.stackit.cloud"
10+ RPM_REPO_PATH=" rpm/cli"
11+ RPM_BUCKET_NAME=" distribution"
12+ CUSTOM_KEYRING_FILE=" rpm-keyring.gpg"
13+ GORELEASER_PACKAGES_FOLDER=" dist/"
14+ TEMP_DIR=$( mktemp -d)
15+
16+ # We need to disable the key database daemon (keyboxd)
17+ # This can be done by removing "use-keyboxd" from ~/.gnupg/common.conf (see https://github.com/gpg/gnupg/blob/master/README)
18+ echo -n > ~/.gnupg/common.conf
19+
20+ # Create a local mirror of the current state of the remote RPM repository
21+ printf " >>> Creating mirror \n"
22+ curl ${PACKAGES_BUCKET_URL} /${RPM_REPO_PATH} /repodata/repomd.xml > ${TEMP_DIR} /repomd.xml || echo " No existing repository found, creating new one"
23+
24+ # Create RPM repository structure
25+ mkdir -p ${TEMP_DIR} /rpm-repo/RPMS
26+
27+ # Copy existing RPMs from remote repository (if any)
28+ printf " \n>>> Downloading existing RPMs \n"
29+ aws s3 sync s3://${RPM_BUCKET_NAME} /${RPM_REPO_PATH} /RPMS/ ${TEMP_DIR} /rpm-repo/RPMS/ --endpoint-url https://object.storage.eu01.onstackit.cloud || echo " No existing RPMs found"
30+
31+ # Copy new generated .rpm packages to the local repo
32+ # Note: GoReleaser already signs these RPM packages with embedded signatures
33+ printf " \n>>> Adding new packages to local repo \n"
34+ cp ${GORELEASER_PACKAGES_FOLDER} /* .rpm ${TEMP_DIR} /rpm-repo/RPMS/
35+
36+ # Create RPM repository metadata using createrepo_c
37+ printf " \n>>> Creating RPM repository metadata \n"
38+ docker run --rm \
39+ -v " ${TEMP_DIR} /rpm-repo:/repo" \
40+ fedora:latest \
41+ bash -c "
42+ # Install createrepo_c
43+ dnf install -y createrepo_c
44+
45+ # Create repository metadata
46+ createrepo_c /repo
47+ "
48+
49+ # Sign the repository metadata using the same GPG key as APT
50+ if [ -n " $GPG_PRIVATE_KEY_FINGERPRINT " ] && [ -n " $GPG_PASSPHRASE " ]; then
51+ printf " \n>>> Signing repository metadata \n"
52+ gpg --batch --yes --pinentry-mode loopback --local-user=" ${GPG_PRIVATE_KEY_FINGERPRINT} " --passphrase=" ${GPG_PASSPHRASE} " --detach-sign --armor ${TEMP_DIR} /rpm-repo/repodata/repomd.xml
53+ else
54+ echo " >>> Skipping repository metadata signing (GPG environment variables not set)"
55+ fi
56+
57+ # Upload to S3
58+ printf " \n>>> Uploading to S3 \n"
59+ aws s3 sync ${TEMP_DIR} /rpm-repo/ s3://${RPM_BUCKET_NAME} /${RPM_REPO_PATH} / --endpoint-url https://object.storage.eu01.onstackit.cloud
60+
61+ # Clean up
62+ rm -rf ${TEMP_DIR}
63+
64+ printf " \n>>> RPM repository published successfully to ${PACKAGES_BUCKET_URL} /${RPM_REPO_PATH} \n"
0 commit comments