[projects/cleanbuild] cleanbuild-docker: refactor to use functions
glen
glen at pld-linux.org
Mon Dec 31 10:28:49 CET 2018
commit e2ea04e5474ce5ba927b69769d379ad306c1701c
Author: Elan Ruusamäe <glen at pld-linux.org>
Date: Mon Dec 31 10:54:33 2018 +0200
cleanbuild-docker: refactor to use functions
cleanbuild-docker.sh | 201 +++++++++++++++++++++++++++++++--------------------
1 file changed, 123 insertions(+), 78 deletions(-)
---
diff --git a/cleanbuild-docker.sh b/cleanbuild-docker.sh
index 8183ab8..6574190 100755
--- a/cleanbuild-docker.sh
+++ b/cleanbuild-docker.sh
@@ -1,94 +1,139 @@
#!/bin/sh
-set -e
+set -eu
-package=${1%.spec}
+PROGRAM=${0##*/}
-test -n "$package" || exit 1
+# defaults
+: ${PACKAGE_NAME=''}
dir=$(pwd)
image=registry.gitlab.com/pld-linux/cleanbuild
-name=cleanbuild-$package
topdir=$dir/rpm
home=/home/builder
buildsize="4G"
-# cleanup first
-docker kill $name >/dev/null 2>&1 || :
-docker rm $name >/dev/null 2>&1 || :
-
-install -d $topdir/logs
-
-# start the container
-docker run --name=$name -d \
- -w $home \
- -v $topdir:$home/rpm \
- -v $dir:$home/cleanbuild \
- -v $dir/cache/poldek:/var/cache/poldek \
- -v $dir/cache/ccache/$package:$home/.ccache \
- --tmpfs $home/rpm/BUILD:rw,exec,nosuid,size=$buildsize \
- $image
-
-# set the homedir
-docker exec --user=root -w / $name usermod -d $home builder
-
-# these paths need to be accessible for builder
-docker exec --user=root -w / $name sh -c "cd $home && chown builder:builder rpm rpm/logs rpm/BUILD .ccache"
-
-if [ ! -d $topdir/rpm-build-tools ]; then
- docker exec $name builder --init-rpm-dir
-fi
-
-# fetch sources and install deps
-if [ -d $topdir/packages/$package ]; then
- # chown, as it might be different owner (root) modified outside container
- docker exec --user=root -w / $name chown -R builder:builder $home/rpm/packages/$package
-fi
-docker exec $name builder -g $package
-
-# prevent network access like pld builders do
-docker exec --user=root -w / $name setfacl -m u:builder:--- /etc/resolv.conf
-
-git_tag=$(GIT_DIR=$topdir/packages/$package/.git git describe --tags --always)
-buildlog=rpm/logs/${git_tag#auto/*/}.log
-
-
-while true; do
- # install deps
- docker exec $name builder -g -nn -R $package
- # remove .la dependencies
- docker exec --user=root -w / $name $home/cleanbuild/cleanup-la
- # reset findunusedbr state after deps install
- docker exec --user=root -w / $name $home/cleanbuild/findunusedbr -c / $home/rpm/packages/$package/$package.spec
-
- # actual build
- docker exec $name cleanbuild/teeboth $buildlog builder -nn -bb $package --define '__spec_clean_body %{nil}' && rc=$? || rc=$?
-
- findbr=$package.findbr.log
- builddir=$(docker exec $name sh -c 'test ! -d rpm/BUILD/* || echo rpm/BUILD/*')
- if [ -z "$builddir" ]; then
- echo >&2 "No build dir. Build failed?"
- exit 6
- fi
- # need root to run poldek
- docker exec --user=root -w / $name sh -c "cd $home && cleanbuild/findbr $builddir $buildlog" > $findbr
+die() {
+ echo >&2 "$0: $*"
+ exit 1
+}
+
+create_container() {
+ # cleanup first
+ docker kill $name >/dev/null 2>&1 || :
+ docker rm $name >/dev/null 2>&1 || :
- installed_something=false
- while read pkg msg; do
- ./addbr rpm/packages/$package/$package.spec "$pkg" "$msg" || continue
- installed_something=true
- done < $findbr
- rm -f $findbr
+ install -d $topdir/logs
- # go for another try
- $installed_something && continue
+ # start the container
+ docker run --name=$name -d \
+ -w $home \
+ -v $topdir:$home/rpm \
+ -v $dir:$home/cleanbuild \
+ -v $dir/cache/poldek:/var/cache/poldek \
+ -v $dir/cache/ccache/$PACKAGE_NAME:$home/.ccache \
+ --tmpfs $home/rpm/BUILD:rw,exec,nosuid,size=$buildsize \
+ $image
- docker exec --user=root -w / $name $home/cleanbuild/findunusedbr -c / $home/rpm/packages/$package/$package.spec
+ # set the homedir
+ docker exec --user=root -w / $name usermod -d $home builder
- if [ $rc -eq 0 ]; then
- # finished ok, cleanup
- docker kill $name >/dev/null && docker rm $name >/dev/null || :
+ # these paths need to be accessible for builder
+ docker exec --user=root -w / $name sh -c "cd $home && chown builder:builder rpm rpm/logs rpm/BUILD .ccache"
+
+ if [ ! -d $topdir/rpm-build-tools ]; then
+ docker exec $name builder --init-rpm-dir
fi
+}
- # propagate error
- exit $rc
-done
+package_prepare() {
+ # fetch sources and install deps
+ if [ -d $topdir/packages/$PACKAGE_NAME ]; then
+ # chown, as it might be different owner (root) modified outside container
+ docker exec --user=root -w / $name chown -R builder:builder $home/rpm/packages/$PACKAGE_NAME
+ fi
+ docker exec $name builder -g $PACKAGE_NAME
+
+ # prevent network access like pld builders do
+ docker exec --user=root -w / $name setfacl -m u:builder:--- /etc/resolv.conf
+
+ git_tag=$(GIT_DIR=$topdir/packages/$PACKAGE_NAME/.git git describe --tags --always)
+ buildlog=rpm/logs/${git_tag#auto/*/}.log
+}
+
+package_build() {
+ while true; do
+ # install deps
+ docker exec $name builder -g -nn -R $PACKAGE_NAME
+ # remove .la dependencies
+ docker exec --user=root -w / $name $home/cleanbuild/cleanup-la
+ # reset findunusedbr state after deps install
+ docker exec --user=root -w / $name $home/cleanbuild/findunusedbr -c / $home/rpm/packages/$PACKAGE_NAME/$PACKAGE_NAME.spec
+
+ # actual build
+ docker exec $name cleanbuild/teeboth $buildlog builder -nn -bb $PACKAGE_NAME --define '__spec_clean_body %{nil}' && rc=$? || rc=$?
+
+ findbr=$PACKAGE_NAME.findbr.log
+ builddir=$(docker exec $name sh -c 'test ! -d rpm/BUILD/* || echo rpm/BUILD/*')
+ if [ -z "$builddir" ]; then
+ echo >&2 "No build dir. Build failed?"
+ exit 6
+ fi
+ # need root to run poldek
+ docker exec --user=root -w / $name sh -c "cd $home && cleanbuild/findbr $builddir $buildlog" > $findbr
+
+ installed_something=false
+ while read pkg msg; do
+ ./addbr rpm/packages/$PACKAGE_NAME/$PACKAGE_NAME.spec "$pkg" "$msg" || continue
+ installed_something=true
+ done < $findbr
+ rm -f $findbr
+
+ # go for another try
+ $installed_something && continue
+
+ docker exec --user=root -w / $name $home/cleanbuild/findunusedbr -c / $home/rpm/packages/$PACKAGE_NAME/$PACKAGE_NAME.spec
+
+ if [ $rc -eq 0 ]; then
+ # finished ok, cleanup
+ docker kill $name >/dev/null && docker rm $name >/dev/null || :
+ fi
+
+ # propagate error
+ exit $rc
+ done
+}
+
+parse_options() {
+ local t
+ t=$(getopt -o '' --long '' -n "$PROGRAM" -- "$@")
+ [ $? != 0 ] && exit $?
+ eval set -- "$t"
+
+ while :; do
+ case "$1" in
+ --)
+ shift
+ break
+ ;;
+ *)
+ die "Internal error: [$1] not recognized!"
+ ;;
+ esac
+ shift
+ done
+
+ test "$#" -eq 1 || die "package not specified or excess arguments"
+ PACKAGE_NAME="${1%.spec}"
+}
+
+main() {
+ parse_options "$@"
+
+ local name="cleanbuild-$PACKAGE_NAME"
+
+ create_container
+ package_prepare
+ package_build
+}
+
+main "$@"
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/projects/cleanbuild.git/commitdiff/2da31caa754f920335a6c371f2b883b570fe717f
More information about the pld-cvs-commit
mailing list