12 : ${KEEP_CONTAINER=true}
17 image=registry.gitlab.com/pld-linux/cleanbuild
22 echo >&2 "[cleanbuild:notice]: $*"
27 echo >&2 "[cleanbuild:error]: $1"
38 no|No|NO|false|False|FALSE|off|Off|OFF|N|n|0)
50 if is_no "${TMPFS:-true}" || [ "$TMPFS" = "0" ]; then
54 echo "--tmpfs $home/rpm/BUILD:rw,exec,nosuid,size=$TMPFS"
60 id=$(docker ps -a -f "label=cleanbuild=$name" --format '{{.ID}}')
66 if ! $KEEP_CONTAINER; then
67 notice "Clean up old container: $name"
68 docker kill $name >/dev/null 2>&1 || :
69 docker rm $name >/dev/null 2>&1 || :
72 install -d $topdir/logs
75 if ! have_container "$PACKAGE_NAME"; then
77 PACKAGE_NAME=$PACKAGE_NAME \
78 docker-compose run --rm -d \
80 --workdir=$home/rpm/packages/$PACKAGE_NAME \
81 --label=cleanbuild=$PACKAGE_NAME \
87 notice "Setup builder user ($UID:$GID)"
89 docker exec --user=root -w / $name usermod -d $home builder
91 if [ "$UID" -gt 0 ]; then
92 docker exec --user=root -w / $name usermod -u $UID builder
94 if [ "$GID" -gt 0 ]; then
95 docker exec --user=root -w / $name groupmod -g $GID builder
98 notice "Setup permissions"
99 docker exec --user=root -w / $name sh -c "cd $home && chown builder:builder . rpm rpm/logs rpm/BUILD rpm/RPMS rpm/packages .ccache"
101 if [ ! -d $topdir/rpm-build-tools ]; then
102 notice "Initialize rpm-build-tools"
103 docker exec -w / $name builder --init-rpm-dir
108 notice "Entering container for $PACKAGE_NAME"
109 docker exec --user=root -it $name bash
113 notice "Fetch sources and install dependencies"
114 if [ -d $topdir/packages/$PACKAGE_NAME ]; then
115 # chown, as it might be different owner (root) modified outside container
116 notice "Fix ownership of existing package directory"
117 docker exec --user=root -w / $name chown -R builder:builder $home/rpm/packages/$PACKAGE_NAME
120 notice "Fetch package sources"
121 docker exec --user=root -w / $name setfacl -x u:builder /etc/resolv.conf
122 docker exec -w / $name builder -g $PACKAGE_NAME
124 if ! $NETWORKING; then
125 notice "Disable networking: Prevent network access for user builder like PLD Linux builders"
126 docker exec --user=root -w / $name setfacl -m u:builder:--- /etc/resolv.conf
129 notice "Find latest tag on the branch"
130 git_tag=$(docker exec -w / -e GIT_DIR=$home/rpm/packages/$PACKAGE_NAME/.git $name git describe --tags --always)
131 buildlog=rpm/logs/${git_tag#auto/*/}.log
132 notice "Build log: $buildlog"
136 # create default args for builder
137 set -- -nn ${WITH:+--with "${WITH# }"} ${WITHOUT:+--without "${WITHOUT# }"} "$PACKAGE_NAME"
140 notice "Install dependencies"
141 docker exec -w / -t $name builder -g -R "$@"
142 notice "Remove .la dependencies"
143 docker exec --user=root -w / $name $home/cleanbuild/bin/cleanup-la
144 notice "Reset findunusedbr state after deps install"
145 docker exec --user=root -w / $name $home/cleanbuild/bin/findunusedbr -c / $home/rpm/packages/$PACKAGE_NAME/$PACKAGE_NAME.spec
147 notice "Build package"
148 docker exec -w $home $name cleanbuild/bin/teeboth $buildlog builder -bb --define '__spec_clean_body %{nil}' "$@" && rc=$? || rc=$?
149 # Kill processes on Ctrl+C
150 if [ "$rc" = 255 ]; then
151 docker exec -w / $name pkill -e -u builder
155 findbr=$PACKAGE_NAME.findbr.log
156 builddir=$(docker exec -w $home $name sh -c 'test ! -d rpm/BUILD/* || echo rpm/BUILD/*')
157 if [ -z "$builddir" ]; then
158 die "No build dir. Build failed?" 6
160 notice "Execute findbr"
161 docker exec --user=root -w / $name sh -c "cd $home && cleanbuild/bin/findbr $builddir $buildlog" > $findbr
163 installed_something=false
164 while read pkg msg; do
165 bin/addbr rpm/packages/$PACKAGE_NAME/$PACKAGE_NAME.spec "$pkg" "$msg" || continue
166 installed_something=true
171 $installed_something && continue
173 notice "Execute findunusedbr"
174 docker exec --user=root -w / $name $home/cleanbuild/bin/findunusedbr -c / $home/rpm/packages/$PACKAGE_NAME/$PACKAGE_NAME.spec
176 if [ $rc -eq 0 ] && ! $KEEP_CONTAINER; then
177 notice "Finished ok, cleanup container"
178 docker kill $name >/dev/null && docker rm $name >/dev/null || :
188 t=$(getopt -o 'x' --long 'network,exec,no-tmpfs,notmpfs,tmpfs:,keep-container:,with:,without:' -n "$PROGRAM" -- "$@")
189 [ $? != 0 ] && exit $?
203 --no-tmpfs|--notmpfs)
212 [ "$1" = "true" -o "$1" = "false" ] || die "Invalid boolean value: $1"
221 WITHOUT="$WITHOUT,$1"
228 die "Internal error: [$1] not recognized!"
234 test "$#" -eq 1 || die "Package not specified or excess arguments"
235 PACKAGE_NAME="${1%.spec}"
242 local name="cleanbuild-$PACKAGE_NAME"