[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