]> git.pld-linux.org Git - projects/cleanbuild.git/commitdiff
cleanbuild-docker: refactor to use functions
authorElan Ruusamäe <glen@pld-linux.org>
Mon, 31 Dec 2018 08:54:33 +0000 (10:54 +0200)
committerElan Ruusamäe <glen@pld-linux.org>
Mon, 31 Dec 2018 08:55:50 +0000 (10:55 +0200)
cleanbuild-docker.sh

index 8183ab83aea6eec07a74a353d2a2e74a9a4dd011..6574190fc4af348cf1c557b1ecd5286d6948f3f8 100755 (executable)
 #!/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 "$@"
This page took 0.082862 seconds and 4 git commands to generate.