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