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