deploy-arch-repo/deploy.sh

54 lines
2 KiB
Bash
Executable file

#! /bin/bash
# This script deploys packages built with 'makepkg' to an Arch Linux repository
# that lives on a remote host not necessarily running Arch.
# It works by syncing the remote database to a local place, editing (adding
# packages and signing the database).
# It is meant to run on an Arch Linux system, where the necessary tools
# (repo-add and some libraries) are present.
set -e
# Configurable variables
REPO_NAME=abstractnonsense
REMOTE_REPO_ROOT=arch.abstractnonsen.se:/var/www/arch.abstractnonsen.se/
TMP_REPO_ROOT=~/.cache/${REPO_NAME}
# Might be modified if you want other rsync options
RSYNC_OPTIONS=(--links --safe-links "--info=del,progress2,remove,symsafe")
# Should not be changed, these files need to be synced in order for repo-add to work properly
REPO_FILES=("${REPO_NAME}".db.tar.gz "${REPO_NAME}".db.tar.gz.sig "${REPO_NAME}".files.tar.gz "${REPO_NAME}".files.tar.gz.sig
"${REPO_NAME}".db "${REPO_NAME}".db.sig "${REPO_NAME}".files "${REPO_NAME}".files.sig)
# Start script
mapfile -t packages < <(ls ./*pkg.tar.zst)
mapfile -t sigs < <(ls ./*pkg.tar.zst.sig)
mkdir -p $TMP_REPO_ROOT
echo "[deploy] Deploying the following $(echo "${packages[@]}" | wc -w) package(s):"
echo "${packages[*]}"
# get old state of repo
echo "[deploy] Syncing remote repo to locale cache"
remote_files=()
for f in "${REPO_FILES[@]}"; do
remote_files+=("${REMOTE_REPO_ROOT}/$f")
done
rsync --ignore-missing-args "${RSYNC_OPTIONS[@]}" "${remote_files[@]}" "${TMP_REPO_ROOT}"
# update repo locally
echo "[deploy] Updating repository locally"
cp "${packages[@]}" "${TMP_REPO_ROOT}"
cp "${sigs[@]}" "${TMP_REPO_ROOT}"
repo-add --new --remove --verify --sign "${TMP_REPO_ROOT}/${REPO_NAME}.db.tar.gz" "${packages[*]}"
# sync repo to remote
echo "[deploy] Syncing changes to remote"
local_files=()
for f in "${REPO_FILES[@]}" "${sigs[@]}" "${packages[@]}"; do
local_files+=("$TMP_REPO_ROOT/$f")
done
rsync "${RSYNC_OPTIONS[@]}" "${local_files[@]}" "${REMOTE_REPO_ROOT}"