12 : ${KEEP_CONTAINER=false}
16 image=registry.gitlab.com/pld-linux/cleanbuild
32 no|No|NO|false|False|FALSE|off|Off|OFF|N|n|0)
44 if is_no "${TMPFS:-true}" || [ "$TMPFS" = "0" ]; then
48 echo "--tmpfs $home/rpm/BUILD:rw,exec,nosuid,size=$TMPFS"
53 docker kill $name >/dev/null 2>&1 || :
54 docker rm $name >/dev/null 2>&1 || :
56 install -d $topdir/logs
59 docker run --name=$name -d \
61 -v $topdir:$home/rpm \
62 -v $dir:$home/cleanbuild \
63 -v $dir/cache/poldek:/var/cache/poldek \
64 -v $dir/cache/ccache/$PACKAGE_NAME:$home/.ccache \
65 --label=cleanbuild=$name \
70 docker exec --user=root -w / $name usermod -d $home builder
72 # these paths need to be accessible for builder
73 docker exec --user=root -w / $name sh -c "cd $home && chown builder:builder rpm rpm/logs rpm/BUILD .ccache"
75 if [ ! -d $topdir/rpm-build-tools ]; then
76 docker exec $name builder --init-rpm-dir
81 # fetch sources and install deps
82 if [ -d $topdir/packages/$PACKAGE_NAME ]; then
83 # chown, as it might be different owner (root) modified outside container
84 docker exec --user=root -w / $name chown -R builder:builder $home/rpm/packages/$PACKAGE_NAME
86 docker exec $name builder -g $PACKAGE_NAME
88 # prevent network access like pld builders do
89 $NETWORKING || docker exec --user=root -w / $name setfacl -m u:builder:--- /etc/resolv.conf
91 git_tag=$(GIT_DIR=$topdir/packages/$PACKAGE_NAME/.git git describe --tags --always)
92 buildlog=rpm/logs/${git_tag#auto/*/}.log
96 # create default args for builder
97 set -- -nn ${WITH:+--with "${WITH# }"} ${WITHOUT:+--without "${WITHOUT# }"} "$PACKAGE_NAME"
101 docker exec $name builder -g -R "$@"
102 # remove .la dependencies
103 docker exec --user=root -w / $name $home/cleanbuild/bin/cleanup-la
104 # reset findunusedbr state after deps install
105 docker exec --user=root -w / $name $home/cleanbuild/bin/findunusedbr -c / $home/rpm/packages/$PACKAGE_NAME/$PACKAGE_NAME.spec
108 docker exec $name cleanbuild/bin/teeboth $buildlog builder -bb --define '__spec_clean_body %{nil}' "$@" && rc=$? || rc=$?
110 findbr=$PACKAGE_NAME.findbr.log
111 builddir=$(docker exec $name sh -c 'test ! -d rpm/BUILD/* || echo rpm/BUILD/*')
112 if [ -z "$builddir" ]; then
113 echo >&2 "No build dir. Build failed?"
116 # need root to run poldek
117 docker exec --user=root -w / $name sh -c "cd $home && cleanbuild/bin/findbr $builddir $buildlog" > $findbr
119 installed_something=false
120 while read pkg msg; do
121 ./addbr rpm/packages/$PACKAGE_NAME/$PACKAGE_NAME.spec "$pkg" "$msg" || continue
122 installed_something=true
127 $installed_something && continue
129 docker exec --user=root -w / $name $home/cleanbuild/bin/findunusedbr -c / $home/rpm/packages/$PACKAGE_NAME/$PACKAGE_NAME.spec
131 if [ $rc -eq 0 ] && ! $KEEP_CONTAINER; then
132 # finished ok, cleanup
133 docker kill $name >/dev/null && docker rm $name >/dev/null || :
143 t=$(getopt -o 'x' --long 'network,no-tmpfs,notmpfs,tmpfs:,keep-container,with:,without:' -n "$PROGRAM" -- "$@")
144 [ $? != 0 ] && exit $?
155 --no-tmpfs|--notmpfs)
171 WITHOUT="$WITHOUT $1"
178 die "Internal error: [$1] not recognized!"
184 test "$#" -eq 1 || die "package not specified or excess arguments"
185 PACKAGE_NAME="${1%.spec}"
192 local name="cleanbuild-$PACKAGE_NAME"