]> git.pld-linux.org Git - projects/cleanbuild.git/blob - cleanbuild-docker.sh
add --network option to docker builder
[projects/cleanbuild.git] / cleanbuild-docker.sh
1 #!/bin/sh
2 set -eu
3
4 PROGRAM=${0##*/}
5
6 # defaults
7 : ${PACKAGE_NAME=''}
8 : ${NETWORKING=false}
9
10 dir=$(pwd)
11 image=registry.gitlab.com/pld-linux/cleanbuild
12 topdir=$dir/rpm
13 home=/home/builder
14 buildsize="4G"
15
16 die() {
17         echo >&2 "$0: $*"
18         exit 1
19 }
20
21 create_container() {
22         # cleanup first
23         docker kill $name >/dev/null 2>&1 || :
24         docker rm $name >/dev/null 2>&1 || :
25
26         install -d $topdir/logs
27
28         # start the container
29         docker run --name=$name -d \
30                 -w $home \
31                 -v $topdir:$home/rpm \
32                 -v $dir:$home/cleanbuild \
33                 -v $dir/cache/poldek:/var/cache/poldek \
34                 -v $dir/cache/ccache/$PACKAGE_NAME:$home/.ccache \
35                 --tmpfs $home/rpm/BUILD:rw,exec,nosuid,size=$buildsize \
36                 $image
37
38         # set the homedir
39         docker exec --user=root -w / $name usermod -d $home builder
40
41         # these paths need to be accessible for builder
42         docker exec --user=root -w / $name sh -c "cd $home && chown builder:builder rpm rpm/logs rpm/BUILD .ccache"
43
44         if [ ! -d $topdir/rpm-build-tools ]; then
45                 docker exec $name builder --init-rpm-dir
46         fi
47 }
48
49 package_prepare() {
50         # fetch sources and install deps
51         if [ -d $topdir/packages/$PACKAGE_NAME ]; then
52                 # chown, as it might be different owner (root) modified outside container
53                 docker exec --user=root -w / $name chown -R builder:builder $home/rpm/packages/$PACKAGE_NAME
54         fi
55         docker exec $name builder -g $PACKAGE_NAME
56
57         # prevent network access like pld builders do
58         $NETWORKING || docker exec --user=root -w / $name setfacl -m u:builder:--- /etc/resolv.conf
59
60         git_tag=$(GIT_DIR=$topdir/packages/$PACKAGE_NAME/.git git describe --tags --always)
61         buildlog=rpm/logs/${git_tag#auto/*/}.log
62 }
63
64 package_build() {
65         while true; do
66                 # install deps
67                 docker exec $name builder -g -nn -R $PACKAGE_NAME
68                 # remove .la dependencies
69                 docker exec --user=root -w / $name $home/cleanbuild/cleanup-la
70                 # reset findunusedbr state after deps install
71                 docker exec --user=root -w / $name $home/cleanbuild/findunusedbr -c / $home/rpm/packages/$PACKAGE_NAME/$PACKAGE_NAME.spec
72
73                 # actual build
74                 docker exec $name cleanbuild/teeboth $buildlog builder -nn -bb $PACKAGE_NAME --define '__spec_clean_body %{nil}' && rc=$? || rc=$?
75
76                 findbr=$PACKAGE_NAME.findbr.log
77                 builddir=$(docker exec $name sh -c 'test ! -d rpm/BUILD/* || echo rpm/BUILD/*')
78                 if [ -z "$builddir" ]; then
79                         echo >&2 "No build dir. Build failed?"
80                         exit 6
81                 fi
82                 # need root to run poldek
83                 docker exec --user=root -w / $name sh -c "cd $home && cleanbuild/findbr $builddir $buildlog" > $findbr
84
85                 installed_something=false
86                 while read pkg msg; do
87                         ./addbr rpm/packages/$PACKAGE_NAME/$PACKAGE_NAME.spec "$pkg" "$msg" || continue
88                         installed_something=true
89                 done < $findbr
90                 rm -f $findbr
91
92                 # go for another try
93                 $installed_something && continue
94
95                 docker exec --user=root -w / $name $home/cleanbuild/findunusedbr -c / $home/rpm/packages/$PACKAGE_NAME/$PACKAGE_NAME.spec
96
97                 if [ $rc -eq 0 ]; then
98                         # finished ok, cleanup
99                         docker kill $name >/dev/null && docker rm $name >/dev/null || :
100                 fi
101
102                 # propagate error
103                 exit $rc
104         done
105 }
106
107 parse_options() {
108         local t
109         t=$(getopt -o '' --long 'network' -n "$PROGRAM" -- "$@")
110         [ $? != 0 ] && exit $?
111         eval set -- "$t"
112
113         while :; do
114                 case "$1" in
115                 --network)
116                         NETWORKING=true
117                         ;;
118                 --)
119                         shift
120                         break
121                         ;;
122                 *)
123                         die "Internal error: [$1] not recognized!"
124                         ;;
125                 esac
126                 shift
127         done
128
129         test "$#" -eq 1 || die "package not specified or excess arguments"
130         PACKAGE_NAME="${1%.spec}"
131 }
132
133 main() {
134         parse_options "$@"
135
136         local name="cleanbuild-$PACKAGE_NAME"
137
138         create_container
139         package_prepare
140         package_build
141 }
142
143 main "$@"
This page took 0.033544 seconds and 3 git commands to generate.