Files
InstanceBrick--nightcap/scripts/assemble_native_repositories.sh
T

111 lines
4.0 KiB
Bash
Executable File

#!/usr/bin/env bash
# Copyright 2026 Mocktail Project Authors
# SPDX-License-Identifier: Apache-2.0
set -Eeuo pipefail
umask 022
readonly STABLE_DEB="${1:?Stable DEB path is required}"
readonly NIGHTLY_DEB="${2:?Nightly DEB path is required}"
readonly STABLE_RPM="${3:?Stable RPM path is required}"
readonly NIGHTLY_RPM="${4:?Nightly RPM path is required}"
readonly PUBLIC_KEY="${5:?GPG public key path is required}"
readonly GPG_KEY_ID="${6:?GPG key ID is required}"
readonly GPG_HOME="${7:?GPG home path is required}"
readonly OUTPUT="${8:?Repository output path is required}"
readonly BASE_URL="https://mocktail.bigrat.space"
for command in apt-ftparchive createrepo_c dpkg-deb gpg gzip rpm rpmsign; do
command -v "${command}" >/dev/null || {
printf 'Required command is missing: %s\n' "${command}" >&2
exit 1
}
done
for package in "${STABLE_DEB}" "${NIGHTLY_DEB}" \
"${STABLE_RPM}" "${NIGHTLY_RPM}"; do
[[ -s "${package}" && ! -L "${package}" ]] || {
printf 'Package is missing or unsafe: %s\n' "${package}" >&2
exit 1
}
done
[[ -s "${PUBLIC_KEY}" && ! -L "${PUBLIC_KEY}" ]] || {
printf 'GPG public key is missing or unsafe: %s\n' "${PUBLIC_KEY}" >&2
exit 1
}
[[ -d "${GPG_HOME}" && ! -L "${GPG_HOME}" ]] || {
printf 'GPG home is missing or unsafe: %s\n' "${GPG_HOME}" >&2
exit 1
}
[[ ! -e "${OUTPUT}" ]] || {
printf 'Repository output already exists: %s\n' "${OUTPUT}" >&2
exit 1
}
[[ "$(dpkg-deb --field "${STABLE_DEB}" Package)" == mocktail ]]
[[ "$(dpkg-deb --field "${NIGHTLY_DEB}" Package)" == mocktail-nightly ]]
[[ "$(rpm --query --package --queryformat '%{NAME}' "${STABLE_RPM}")" == mocktail ]]
[[ "$(rpm --query --package --queryformat '%{NAME}' "${NIGHTLY_RPM}")" == mocktail-nightly ]]
readonly APT_ROOT="${OUTPUT}/apt"
readonly APT_POOL="${APT_ROOT}/pool/main/m/mocktail"
readonly APT_DIST="${APT_ROOT}/dists/mocktail"
readonly RPM_ROOT="${OUTPUT}/rpm/x86_64"
readonly DOWNLOADS="${OUTPUT}/downloads"
install -d -- \
"${APT_POOL}" "${APT_DIST}/main/binary-amd64" "${RPM_ROOT}" "${DOWNLOADS}"
install -m 0644 -- "${STABLE_DEB}" "${APT_POOL}/$(basename -- "${STABLE_DEB}")"
install -m 0644 -- "${NIGHTLY_DEB}" "${APT_POOL}/$(basename -- "${NIGHTLY_DEB}")"
install -m 0644 -- "${STABLE_RPM}" "${RPM_ROOT}/$(basename -- "${STABLE_RPM}")"
install -m 0644 -- "${NIGHTLY_RPM}" "${RPM_ROOT}/$(basename -- "${NIGHTLY_RPM}")"
install -m 0644 -- "${STABLE_DEB}" "${DOWNLOADS}/mocktail.deb"
install -m 0644 -- "${STABLE_RPM}" "${DOWNLOADS}/mocktail.rpm"
install -m 0644 -- "${PUBLIC_KEY}" "${OUTPUT}/mocktail-packages.gpg"
(
cd -- "${APT_ROOT}"
apt-ftparchive packages pool/main >dists/mocktail/main/binary-amd64/Packages
gzip -9n -c dists/mocktail/main/binary-amd64/Packages \
>dists/mocktail/main/binary-amd64/Packages.gz
apt-ftparchive \
-o APT::FTPArchive::Release::Origin=Mocktail \
-o APT::FTPArchive::Release::Label=Mocktail \
-o APT::FTPArchive::Release::Suite=mocktail \
-o APT::FTPArchive::Release::Codename=mocktail \
-o APT::FTPArchive::Release::Architectures=amd64 \
-o APT::FTPArchive::Release::Components=main \
release dists/mocktail >dists/mocktail/Release
)
gpg --batch --yes --homedir "${GPG_HOME}" --local-user "${GPG_KEY_ID}" \
--digest-algo SHA256 --clearsign \
--output "${APT_DIST}/InRelease" "${APT_DIST}/Release"
gpg --batch --yes --homedir "${GPG_HOME}" --local-user "${GPG_KEY_ID}" \
--digest-algo SHA256 --armor --detach-sign \
--output "${APT_DIST}/Release.gpg" "${APT_DIST}/Release"
for package in "${RPM_ROOT}"/*.rpm; do
GNUPGHOME="${GPG_HOME}" rpmsign --addsign \
--define "_gpg_name ${GPG_KEY_ID}" \
--define "_gpg_path ${GPG_HOME}" \
"${package}"
done
createrepo_c "${RPM_ROOT}"
gpg --batch --yes --homedir "${GPG_HOME}" --local-user "${GPG_KEY_ID}" \
--digest-algo SHA256 --armor --detach-sign \
--output "${RPM_ROOT}/repodata/repomd.xml.asc" \
"${RPM_ROOT}/repodata/repomd.xml"
cat >"${OUTPUT}/rpm/mocktail.repo" <<EOF
[mocktail]
name=Mocktail
baseurl=${BASE_URL}/rpm/\$basearch/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=${BASE_URL}/mocktail-packages.gpg
EOF