]> git.pld-linux.org Git - projects/cleanbuild.git/blob - cleanbuild-docker.sh
1775014b06ce08c5119ad4a1890b23772e05a5ad
[projects/cleanbuild.git] / cleanbuild-docker.sh
1 #!/bin/sh
2 set -e
3
4 package=$1
5
6 test -n "$package" || exit 1
7
8 dir=$(pwd)
9 image=registry.gitlab.com/pld-linux/cleanbuild
10 name=cleanbuild-$package
11 topdir=$dir/rpm
12 home=/home/services/builder
13 buildsize="4G"
14
15 # cleanup first
16 docker kill $name >/dev/null 2>&1 || :
17 docker rm $name >/dev/null 2>&1 || :
18
19 install -d $topdir/logs
20
21 # start the container
22 docker run --name=$name -d \
23         -v $topdir:$home/rpm \
24         -v $dir:$home/cleanbuild \
25         -v $dir/cache/poldek:/var/cache/poldek \
26         -v $dir/cache/ccache/$package:/home/services/builder/.ccache \
27         --tmpfs $home/rpm/BUILD:rw,exec,nosuid,size=$buildsize \
28         $image
29
30 # these paths need to be accessible for builder
31 docker exec --user=root $name chown builder:builder rpm rpm/logs rpm/BUILD .ccache
32
33 if [ ! -d $topdir/rpm-build-tools ]; then
34         docker exec $name builder --init-rpm-dir
35 fi
36
37 # fetch sources and install deps
38 if [ -d $topdir/packages/$package ]; then
39         # chown, as it might be different owner (root) modified outside container
40         docker exec --user=root $name chown -R builder:builder rpm/packages/$package
41 fi
42 docker exec $name builder -g -R $package
43
44 # prevent network access like pld builders do
45 docker exec --user=root $name setfacl -m u:builder:--- /etc/resolv.conf
46
47 git_tag=$(GIT_DIR=$topdir/packages/$package/.git git describe --tags --always)
48 buildlog=rpm/logs/${git_tag#auto/*/}.log
49
50 # remove .la dependencies
51 docker exec --user=root $name cleanbuild/cleanup-la
52
53 while true; do
54         docker exec $name cleanbuild/teeboth $buildlog builder -nn -bb -R $package --define 'clean exit 0' && rc=$? || rc=$?
55
56         # reset findunusedbr state after deps install
57         docker exec --user=root $name cleanbuild/findunusedbr -c / rpm/packages/$package/$package.spec
58
59         findbr=$package.findbr.log
60         builddir=$(docker exec $name sh -c 'test ! -d rpm/BUILD/* || echo rpm/BUILD/*')
61         if [ -z "$builddir" ]; then
62                 echo >&2 "No build dir. Build failed?"
63                 exit 6
64         fi
65         # need root to run poldek
66         docker exec --user=root $name cleanbuild/findbr $builddir $buildlog > $findbr
67
68         installed_something=false
69         while read pkg msg; do
70                 ./addbr rpm/packages/$package/$package.spec "$pkg" "$msg" || continue
71                 installed_something=true
72         done < $findbr
73         rm -f $findbr
74
75         # go for another try
76         $installed_something && continue
77
78         docker exec --user=root $name cleanbuild/findunusedbr / rpm/packages/$package/$package.spec
79
80         if [ $rc -eq 0 ]; then
81                 # finished ok, cleanup
82                 docker kill $name >/dev/null && docker rm $name >/dev/null || :
83         fi
84
85         # propagate error
86         exit $rc
87 done
This page took 0.042599 seconds and 2 git commands to generate.