id-pbuild.sh: clear distro list if distro option is given
[git-tools-moved-to-github.git] / id-deb-build / id-pbuild.sh
1 #!/bin/sh
2 # This script builds Debian packages for one or more distributions
3 # in i386/amd64 architectures. It uses pbuilder. pbuilder requires root
4 # privilege and so this script should be invoked with sudo.
5
6 usage()
7 {
8     cat <<EOF
9 Usage: id-pbuild.sh [OPTIONS]
10 Options:
11         [--debian=distros]
12         [--ubuntu=distros]
13         [--centos=distros]
14         [--upload]
15         [--concurrency=N]
16         [--product=X]
17 EOF
18     exit $1
19 }
20
21 # things that might be set by options
22 upload=false
23 do_help=false
24 concurrency=4
25 ARCHS="i386 amd64"
26
27 if test -f IDMETA; then
28     . ./IDMETA
29 fi
30 while test $# -gt 0; do
31     case "$1" in
32         -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
33         *) optarg= ;;
34     esac
35     case $1 in
36         --debian=*)
37             DEBIAN_DIST_A=$optarg
38             ;;
39         --ubuntu=*)
40             UBUNTU_DIST_A=$optarg
41             ;;
42         --centos=*)
43             CENTOS_DIST_A=$optarg
44             ;;
45         --upload)
46             upload=true
47             ;;
48         --concurrency=*)
49             concurrency=$optarg
50             ;;
51         --product=*)
52             PRODUCT=$optarg
53             ;;
54         -*)
55             do_help=yes
56             ;;
57     esac
58     shift
59 done
60 if test $DEBIAN_DIST_A -o $UBUNTU_DIST_A -o $CENTOS_DIST_A; then
61     DEBIAN_DIST=$DEBIAN_DIST_A
62     UBUNTU_DIST=$UBUNTU_DIST_A
63     CENTOS_DIST=$CENTOS_DIST_A
64 fi
65
66 if test "$do_help" = "yes"; then
67     usage 1 1>&2
68 fi
69
70 if test "$DEBIAN_DIST" -o "$UBUNTU_DIST"; then
71     debian=true
72 else
73     debian=false
74 fi
75
76 D0=`dirname $0`
77 ID_DEB_BUILD=`cd $D0; pwd`
78 PBUILDROOT=${ID_DEB_BUILD}/id-pbuild-root.sh
79 if test ! -x $PBUILDROOT; then
80     echo "$PBUILDROOT not found"
81     exit 1
82 fi
83
84 MKDEBSRC=${ID_DEB_BUILD}/id-mk-deb-src.sh
85 if test ! -x $MKDEBSRC; then
86     echo "$MKDEBSRC not found"
87     exit 1
88 fi
89
90 if $upload; then
91     :
92 else
93     if $debian; then
94         if test "${SUDO_USER}"; then
95             if test ! -d deb-src; then
96                 $MKDEBSRC
97             fi
98         else
99             if test -d deb-src; then
100                 rm -f deb-src/*.gz
101                 if test $? -ne 0; then
102                     echo "deb-src could not be removed. Remove deb-src manually"
103                     exit 1
104                 fi
105             fi
106             $MKDEBSRC
107         fi
108     else
109         mkdir -p deb-src
110     fi
111 fi
112
113 cd deb-src
114
115 if $debian; then
116     for f in *.dsc; do
117         if test -f "$f"; then
118             PKG=$f
119         fi
120     done
121     if test -z "$PKG"; then
122         echo "Specify .dsc file"
123         exit 1
124     fi
125     if test ! -e "$PKG"; then
126         echo "${PKG} does not exist"
127         exit 1
128     fi
129     if grep "Architecture: all" $PKG >/dev/null; then
130         USE_ARCHS=i386
131     else
132         USE_ARCHS=$ARCHS
133     fi
134 fi
135
136 if test -z "$PRODUCT"; then
137     PRODUCT=$NAME
138 fi
139 if test -z "$PRODUCT"; then
140     if $debian; then
141         PRODUCT=`echo *.dsc|sed 's/_.*//g'`
142     else
143         PRODUCT=`cd ..;rpm -q --specfile *.spec --queryformat "%{NAME};" | cut -d ";" -f1`
144     fi
145 fi
146 echo "Dsc $PKG . Product $PRODUCT"
147 echo "Ubuntu distros: $UBUNTU_DIST"
148 echo "Debian distros: $DEBIAN_DIST"
149 echo "Centos distros: $CENTOS_DIST"
150
151 if $debian; then
152     if test "${SUDO_USER}"; then
153         echo "Running as sudo."
154         echo "Tip: You can avoid it by adding the following in /etc/sudoers"
155         echo "${SUDO_USER} ALL=NOPASSWD: ${ID_DEB_BUILD}/id-pbuild-root.sh"
156         HOME_EXPORT=/home/${SUDO_USER}
157     else
158         sudo -k
159         HOME_EXPORT=$HOME
160     fi
161     if test ! -f ${HOME_EXPORT}/.pbuilderrc; then
162         echo "${HOME_EXPORT}/.pbuilderrc missing"
163         exit 1
164     fi
165 fi
166
167 if $upload; then
168     for dist in ${CENTOS_DIST}; do
169         arch=amd64
170         prodver=${PRODUCT}-${VERSION}
171         if scp ${ID_DEB_BUILD}/../id-rpm-build/upload-rpms.sh ${dist}:rpmbuild/SOURCES/${prodver}/; then
172             :
173         else
174             echo "Copy of upload-rpms.sh to $dist failed"
175             exit 1
176         fi
177         if ssh $dist "cd rpmbuild/SOURCES/${prodver} && chmod +x upload-rpms.sh && ./upload-rpms.sh ${PRODUCT}.spec"; then
178             :
179         else
180             echo "Upload failed for $dist"
181             exit 1
182         fi
183     done
184     for dist in ${UBUNTU_DIST}; do
185         scp ${dist}-*/* ftp.indexdata.dk:/home/ftp/pub/${PRODUCT}/ubuntu/${dist}
186     done
187     for dist in ${DEBIAN_DIST}; do
188         scp ${dist}-*/* ftp.indexdata.dk:/home/ftp/pub/${PRODUCT}/debian/${dist}
189     done
190     echo ""
191     echo "===================================================="
192     echo "APT/YUM should be updated via cron every 15 minutes "
193     echo " from July 11 2013 and later."
194     echo "No need to call update archive on kebab"
195     echo "===================================================="
196     exit 0
197 fi
198
199 rm -f *.log
200
201 # copy tars to centos build hosts
202 for dist in ${CENTOS_DIST}; do
203     arch=amd64
204     prodver=${PRODUCT}-${VERSION}
205     tarname=${prodver}.tar.gz
206     if test ! -f ../${tarname}; then
207         echo "$tarname: missing"
208         exit 1
209     fi
210
211     if ssh $dist "test -f .rpmmacros && test -d rpmbuild/SOURCES && test -d rpmbuild/RPMS && test -d rpmbuild/SRPMS"; then
212         :
213     else
214         echo "Host $dist does not seem to be prepared with rpmbuild directories"
215         exit 1
216     fi
217
218     if scp ../${tarname} $dist:rpmbuild/SOURCES/ ; then
219         :
220     else
221         echo "Could not copy $tarname to $dist"
222         exit 1
223     fi
224     if ssh $dist "cd rpmbuild/SOURCES && rm -fr $prodver && tar zxf $tarname && cd ${prodver} && rpmbuild -ba ${PRODUCT}.spec" >${dist}-${arch}.log 2>&1; then
225         :
226     else
227         echo "FAILED: See ${dist}-${arch}.log"
228         exit 1
229     fi
230 done
231
232 # call our privileged wrapper to clean the directories, no --dsc option
233 for dist in ${DEBIAN_DIST} ${UBUNTU_DIST}; do
234     for arch in ${USE_ARCHS}; do
235         sudo -n $PBUILDROOT --home=${HOME_EXPORT} --dist=$dist --arch=$arch
236         if test $? -ne 0; then
237             echo "FAILED"
238             echo "Run id-pbuild.sh using sudo or add yourself to /etc/sudoers:"
239             echo "${USER} ALL=NOPASSWD: ${ID_DEB_BUILD}/id-pbuild-root.sh"
240             exit 1
241         fi
242     done
243 done
244
245 # call our privileged wrapper to do the real work, with --dsc option
246 i=0
247 date
248 for dist in ${DEBIAN_DIST} ${UBUNTU_DIST}; do
249     for arch in ${USE_ARCHS}; do
250         sudo -n $PBUILDROOT --home=${HOME_EXPORT} \
251             --dist=$dist --arch=$arch --dsc=$PKG >${dist}-${arch}.log 2>&1 &
252         i=`expr $i + 1`
253         if test $i -eq $concurrency; then
254             i=0
255             wait
256             if test -f ${dist}-${arch}/*.dsc; then
257                 :
258             else
259                 echo "FAILED: No .dsc file for ${dist}-${arch}"
260                 exit 1
261             fi
262         fi
263     done
264 done
265 wait
266 for dist in ${DEBIAN_DIST} ${UBUNTU_DIST}; do
267     for arch in ${USE_ARCHS}; do
268         if test -f ${dist}-${arch}/*.dsc; then
269             :
270         else
271             echo "FAILED: No .dsc file for ${dist}-${arch}"
272             exit 1
273         fi
274     done
275 done
276
277 date
278 echo "Done"
279 # Local Variables:
280 # mode:shell-script
281 # sh-indentation: 2
282 # sh-basic-offset: 4
283 # End: