122 lines
3.8 KiB
Bash
122 lines
3.8 KiB
Bash
#!/bin/bash
|
|
#
|
|
# offload-build - build a PKGBUILD on a remote server using makechrootpkg.
|
|
#
|
|
# Copyright (c) 2019 by Eli Schwartz <eschwartz@archlinux.org>
|
|
#
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
source /usr/share/makepkg/util/config.sh
|
|
|
|
|
|
# global defaults suitable for use by Arch staff
|
|
repo=extra
|
|
arch=x86_64
|
|
server=build.archlinux.org
|
|
|
|
die() { printf "error: $1\n" "${@:2}"; exit 1; }
|
|
|
|
usage() {
|
|
cat <<- _EOF_
|
|
Usage: ${BASH_SOURCE[0]##*/} [--repo REPO] [--arch ARCHITECTURE] [--server SERVER] -- [ARCHBUILD_ARGS]
|
|
|
|
Build a PKGBUILD on a remote server using makechrootpkg. Requires a remote user
|
|
that can run archbuild without password auth. Options passed after a -- are
|
|
passed on to archbuild, and eventually to makechrootpkg.
|
|
|
|
OPTIONS
|
|
-r, --repo Build against a specific repository (current: $repo)
|
|
-a, --arch Build against a specific architecture (current: $arch)
|
|
-s, --server Offload to a specific build server (current: $server)
|
|
-h, --help Show this help text
|
|
_EOF_
|
|
}
|
|
|
|
# option checking
|
|
while (( $# )); do
|
|
case $1 in
|
|
-h|--help)
|
|
usage
|
|
exit 0
|
|
;;
|
|
-r|--repo)
|
|
repo=$2
|
|
shift 2
|
|
;;
|
|
-a|--arch)
|
|
arch=$2
|
|
shift 2
|
|
;;
|
|
-s|--server)
|
|
server=$2
|
|
shift 2
|
|
;;
|
|
--)
|
|
shift
|
|
break
|
|
;;
|
|
*)
|
|
die "invalid argument: %s" "$1"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# multilib must be handled specially
|
|
archbuild_arch="${arch}"
|
|
if [[ $repo = multilib* ]]; then
|
|
archbuild_arch=
|
|
fi
|
|
|
|
archbuild_cmd=("${repo}${archbuild_arch:+-$archbuild_arch}-build" "$@")
|
|
|
|
trap 'rm -rf $TEMPDIR' EXIT INT TERM QUIT
|
|
|
|
# Load makepkg.conf variables to be available
|
|
load_makepkg_config
|
|
|
|
# Use a source-only tarball as an intermediate to transfer files. This
|
|
# guarantees the checksums are okay, and guarantees that all needed files are
|
|
# transferred, including local sources, install scripts, and changelogs.
|
|
export TEMPDIR=$(mktemp -d --tmpdir offload-build.XXXXXXXXXX)
|
|
export SRCPKGDEST=${TEMPDIR}
|
|
makepkg --source || die "unable to make source package"
|
|
|
|
# Temporary cosmetic workaround makepkg if SRCDEST is set somewhere else
|
|
# but an empty src dir is created in PWD. Remove once fixed in makepkg.
|
|
rmdir --ignore-fail-on-non-empty src 2>/dev/null || true
|
|
|
|
mapfile -t files < <(
|
|
# This is sort of bash golfing but it allows running a mildly complex
|
|
# command over ssh with a single connection.
|
|
# shellcheck disable=SC2145
|
|
cat "$SRCPKGDEST"/*"$SRCEXT" |
|
|
ssh $server '
|
|
temp="${XDG_CACHE_HOME:-$HOME/.cache}/offload-build" &&
|
|
mkdir -p "$temp" &&
|
|
temp=$(mktemp -d -p "$temp") &&
|
|
cd "$temp" &&
|
|
{
|
|
bsdtar --strip-components 1 -xvf - &&
|
|
script -qefc "'"${archbuild_cmd[@]@Q}"'" /dev/null &&
|
|
printf "%s\n" "" "-> build complete" &&
|
|
printf "\t%s\n" "$temp"/*
|
|
} >&2 &&
|
|
makepkg_user_config="${XDG_CONFIG_HOME:-$HOME/.config}/pacman/makepkg.conf" &&
|
|
makepkg_config="/usr/share/devtools/makepkg.conf.d/'"${arch}"'.conf" &&
|
|
if [[ -f /usr/share/devtools/makepkg.conf.d/'"${repo}"'-'"${arch}"'.conf ]]; then
|
|
makepkg_config="/usr/share/devtools/makepkg.conf.d/'"${repo}"'-'"${arch}"'.conf"
|
|
fi &&
|
|
makepkg --config <(cat "${makepkg_user_config}" "${makepkg_config}" 2>/dev/null) --packagelist &&
|
|
printf "%s\n" "${temp}/PKGBUILD"
|
|
')
|
|
|
|
|
|
if (( ${#files[@]} )); then
|
|
printf '%s\n' '' '-> copying files...'
|
|
scp "${files[@]/#/$server:}" "${TEMPDIR}/"
|
|
mv "${TEMPDIR}"/*.pkg.tar* "${PKGDEST:-${PWD}}/"
|
|
mv "${TEMPDIR}/PKGBUILD" "${PWD}/"
|
|
else
|
|
exit 1
|
|
fi
|