[arch-projects] [devtools] [PATCH v2] Add new tool: offload-build
Eli Schwartz
eschwartz at archlinux.org
Thu Apr 18 01:15:06 UTC 2019
This tool is useful for running makechrootpkg on a remote build server,
and is by default hooked up to send a PKGBUILD and initiate a build on
our shiny new build server "dragon".
Signed-off-by: Eli Schwartz <eschwartz at archlinux.org>
---
v2: script -qfc does not preserve the exit status of the wrapped
command. Add -e so that we can properly abort if makechrootpkg failed.
Makefile | 1 +
offload-build | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 101 insertions(+)
create mode 100755 offload-build
diff --git a/Makefile b/Makefile
index ba2d3e4..2306a17 100644
--- a/Makefile
+++ b/Makefile
@@ -20,6 +20,7 @@ IN_PROGS = \
BINPROGS = \
$(IN_PROGS) \
+ offload-build \
sogrep
CONFIGFILES = \
diff --git a/offload-build b/offload-build
new file mode 100755
index 0000000..c991754
--- /dev/null
+++ b/offload-build
@@ -0,0 +1,100 @@
+#!/bin/bash
+#
+# offload-build - build a PKGBUILD on a remote server using makechrootpkg.
+#
+# Copyright (c) 2019 by Eli Schwartz <eschwartz at archlinux.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <https://www.gnu.org/licenses/>.
+#
+
+
+# global defaults suitable for use by Arch staff
+repo=extra
+arch=x86_64
+server=dragon.archlinux.org
+
+die() { printf "error: $1\n" "${@:2}"; exit 1; }
+
+usage() {
+ cat <<- _EOF_
+ Usage: ${BASH_SOURCE[0]##*/} [--repo REPO] [--arch ARCHITECTURE] [--server SERVER]
+
+ Build a PKGBUILD on a remote server using makechrootpkg. Requires a remote user
+ that can run archbuild without password auth.
+
+ 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
+ ;;
+ *)
+ die "invalid argument: %s" "$1"
+ ;;
+ esac
+done
+
+# multilib must be handled specially
+if [[ $repo = multilib* ]]; then
+ arch=
+fi
+
+trap 'rm -rf $SRCPKGDEST' EXIT
+
+# 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 SRCPKGDEST=$(mktemp -d)
+makepkg --source || die "unable to make source package"
+
+mapfile -t files < <(
+ # This is sort of bash golfing but it allows running a mildly complex
+ # command over ssh with a single connection.
+ cat "$SRCPKGDEST"/*.src.tar.gz |
+ 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 '"${repo}${arch:+-$arch}-build"' /dev/null &&
+ printf "%s\n" "" "-> build complete" &&
+ printf "\t%s\n" "$temp"/*
+ } >&2 &&
+ makepkg --packagelist
+')
+
+(( ${#files[@]} )) && printf '%s\n' '' '-> copying files...' && scp "${files[@]/#/$server:}" .
--
2.21.0
More information about the arch-projects
mailing list