12 : ${KEEP_CONTAINER=false}
16 image=registry.gitlab.com/pld-linux/cleanbuild
21 echo >&2 "[cleanbuild:notice]: $*"
26 echo >&2 "[cleanbuild:error]: $1"
37 no|No|NO|false|False|FALSE|off|Off|OFF|N|n|0)
49 if is_no "${TMPFS:-true}" || [ "$TMPFS" = "0" ]; then
53 echo "--tmpfs $home/rpm/BUILD:rw,exec,nosuid,size=$TMPFS"
57 notice "Clean up old container: $name"
58 docker kill $name >/dev/null 2>&1 || :
59 docker rm $name >/dev/null 2>&1 || :
61 install -d $topdir/logs
65 PACKAGE_NAME=$PACKAGE_NAME \
66 docker-compose run --rm -d \
68 --label=cleanbuild=$PACKAGE_NAME \
71 notice "Setup the homedir"
72 docker exec --user=root -w / $name usermod -d $home builder
74 notice "Setup permissions"
75 docker exec --user=root -w / $name sh -c "cd $home && chown builder:builder rpm rpm/logs rpm/BUILD .ccache"
77 if [ ! -d $topdir/rpm-build-tools ]; then
78 notice "Initialize rpm-build-tools"
79 docker exec $name builder --init-rpm-dir
84 notice "Fetch sources and install dependencies"
85 if [ -d $topdir/packages/$PACKAGE_NAME ]; then
86 # chown, as it might be different owner (root) modified outside container
87 notice "Fix ownership of existing package directory"
88 docker exec --user=root -w / $name chown -R builder:builder $home/rpm/packages/$PACKAGE_NAME
91 notice "Fetch package sources"
92 docker exec $name builder -g $PACKAGE_NAME
94 if ! $NETWORKING; then
95 notice "Disable networking: Prevent network access for user builder like PLD Linux builders"
96 docker exec --user=root -w / $name setfacl -m u:builder:--- /etc/resolv.conf
99 git_tag=$(GIT_DIR=$topdir/packages/$PACKAGE_NAME/.git git describe --tags --always)
100 buildlog=rpm/logs/${git_tag#auto/*/}.log
104 # create default args for builder
105 set -- -nn ${WITH:+--with "${WITH# }"} ${WITHOUT:+--without "${WITHOUT# }"} "$PACKAGE_NAME"
108 notice "Install dependencies"
109 docker exec $name builder -g -R "$@"
110 notice "Remove .la dependencies"
111 docker exec --user=root -w / $name $home/cleanbuild/bin/cleanup-la
112 notice "Reset findunusedbr state after deps install"
113 docker exec --user=root -w / $name $home/cleanbuild/bin/findunusedbr -c / $home/rpm/packages/$PACKAGE_NAME/$PACKAGE_NAME.spec
115 notice "Build package"
116 docker exec $name cleanbuild/bin/teeboth $buildlog builder -bb --define '__spec_clean_body %{nil}' "$@" && rc=$? || rc=$?
118 findbr=$PACKAGE_NAME.findbr.log
119 builddir=$(docker exec $name sh -c 'test ! -d rpm/BUILD/* || echo rpm/BUILD/*')
120 if [ -z "$builddir" ]; then
121 die "No build dir. Build failed?" 6
123 notice "Execute findbr"
124 docker exec --user=root -w / $name sh -c "cd $home && cleanbuild/bin/findbr $builddir $buildlog" > $findbr
126 installed_something=false
127 while read pkg msg; do
128 bin/addbr rpm/packages/$PACKAGE_NAME/$PACKAGE_NAME.spec "$pkg" "$msg" || continue
129 installed_something=true
134 $installed_something && continue
136 notice "Execute findunusedbr"
137 docker exec --user=root -w / $name $home/cleanbuild/bin/findunusedbr -c / $home/rpm/packages/$PACKAGE_NAME/$PACKAGE_NAME.spec
139 if [ $rc -eq 0 ] && ! $KEEP_CONTAINER; then
140 notice "Finished ok, cleanup container"
141 docker kill $name >/dev/null && docker rm $name >/dev/null || :
151 t=$(getopt -o 'x' --long 'network,no-tmpfs,notmpfs,tmpfs:,keep-container,with:,without:' -n "$PROGRAM" -- "$@")
152 [ $? != 0 ] && exit $?
163 --no-tmpfs|--notmpfs)
179 WITHOUT="$WITHOUT $1"
186 die "Internal error: [$1] not recognized!"
192 test "$#" -eq 1 || die "Package not specified or excess arguments"
193 PACKAGE_NAME="${1%.spec}"
200 local name="cleanbuild-$PACKAGE_NAME"