]> git.pld-linux.org Git - projects/cleanbuild.git/blame - cleanbuild-docker.sh
add --network option to docker builder
[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}
ce96f77c 9
ce96f77c 10dir=$(pwd)
47ec7a26 11image=registry.gitlab.com/pld-linux/cleanbuild
ce96f77c 12topdir=$dir/rpm
8f52cf50 13home=/home/builder
73d3710b
ER
14buildsize="4G"
15
e2ea04e5
ER
16die() {
17 echo >&2 "$0: $*"
18 exit 1
19}
20
21create_container() {
22 # cleanup first
23 docker kill $name >/dev/null 2>&1 || :
24 docker rm $name >/dev/null 2>&1 || :
ce96f77c 25
e2ea04e5 26 install -d $topdir/logs
ce96f77c 27
e2ea04e5
ER
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
ce96f77c 37
e2ea04e5
ER
38 # set the homedir
39 docker exec --user=root -w / $name usermod -d $home builder
621943d5 40
e2ea04e5
ER
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
ce96f77c 46 fi
e2ea04e5 47}
ce96f77c 48
e2ea04e5
ER
49package_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
3ac42f8d 58 $NETWORKING || docker exec --user=root -w / $name setfacl -m u:builder:--- /etc/resolv.conf
e2ea04e5
ER
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
64package_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
107parse_options() {
108 local t
3ac42f8d 109 t=$(getopt -o '' --long 'network' -n "$PROGRAM" -- "$@")
e2ea04e5
ER
110 [ $? != 0 ] && exit $?
111 eval set -- "$t"
112
113 while :; do
114 case "$1" in
3ac42f8d
ER
115 --network)
116 NETWORKING=true
117 ;;
e2ea04e5
ER
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
133main() {
134 parse_options "$@"
135
136 local name="cleanbuild-$PACKAGE_NAME"
137
138 create_container
139 package_prepare
140 package_build
141}
142
143main "$@"
This page took 0.690831 seconds and 4 git commands to generate.