Provide 'successful' message if upload succeeds GA-12
[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
61 if test "$DEBIAN_DIST_A" -o "$UBUNTU_DIST_A" -o "$CENTOS_DIST_A"; then
62     DEBIAN_DIST=$DEBIAN_DIST_A
63     UBUNTU_DIST=$UBUNTU_DIST_A
64     CENTOS_DIST=$CENTOS_DIST_A
65 fi
66
67 if test "$do_help" = "yes"; then
68     usage 1 1>&2
69 fi
70
71 if test "$DEBIAN_DIST" -o "$UBUNTU_DIST"; then
72     debian=true
73 else
74     debian=false
75 fi
76
77 D0=`dirname $0`
78 ID_DEB_BUILD=`cd $D0; pwd`
79 PBUILDROOT=${ID_DEB_BUILD}/id-pbuild-root.sh
80 if test ! -x $PBUILDROOT; then
81     echo "$PBUILDROOT not found"
82     exit 1
83 fi
84
85 MKDEBSRC=${ID_DEB_BUILD}/id-mk-deb-src.sh
86 if test ! -x $MKDEBSRC; then
87     echo "$MKDEBSRC not found"
88     exit 1
89 fi
90
91 if ! $upload; then
92     if $debian; then
93         if test "${SUDO_USER}"; then
94             if test ! -d deb-src; then
95                 $MKDEBSRC
96             fi
97         else
98             if test -d deb-src; then
99                 rm -f deb-src/*.gz
100                 if test $? -ne 0; then
101                     echo "deb-src could not be removed. Remove deb-src manually"
102                     exit 1
103                 fi
104             fi
105             $MKDEBSRC
106         fi
107     else
108         mkdir -p deb-src
109     fi
110 fi
111
112 cd deb-src
113
114 if $debian; then
115     for f in *.dsc; do
116         if test -f "$f"; then
117             PKG=$f
118         fi
119     done
120     if test -z "$PKG"; then
121         echo "Specify .dsc file"
122         exit 1
123     fi
124     if test ! -e "$PKG"; then
125         echo "${PKG} does not exist"
126         exit 1
127     fi
128     if grep "Architecture: all" $PKG >/dev/null; then
129         USE_ARCHS=i386
130     else
131         USE_ARCHS=$ARCHS
132     fi
133 fi
134
135 if test -z "$PRODUCT"; then
136     PRODUCT=$NAME
137 fi
138 if test -z "$PRODUCT"; then
139     if $debian; then
140         PRODUCT=`echo *.dsc|sed 's/_.*//g'`
141     else
142         PRODUCT=`cd ..;rpm -q --specfile *.spec --queryformat "%{NAME};" | cut -d ";" -f1`
143     fi
144 fi
145 echo "Dsc $PKG . Product $PRODUCT"
146 echo "Ubuntu distros: $UBUNTU_DIST"
147 echo "Debian distros: $DEBIAN_DIST"
148 echo "Centos distros: $CENTOS_DIST"
149
150 if $debian; then
151     if test "${SUDO_USER}"; then
152         echo "Running as sudo."
153         echo "Tip: You can avoid it by adding the following in /etc/sudoers"
154         echo "${SUDO_USER} ALL=NOPASSWD: ${ID_DEB_BUILD}/id-pbuild-root.sh"
155         HOME_EXPORT=/home/${SUDO_USER}
156     else
157         sudo -k
158         HOME_EXPORT=$HOME
159     fi
160     if test ! -f ${HOME_EXPORT}/.pbuilderrc; then
161         echo "${HOME_EXPORT}/.pbuilderrc missing"
162         exit 1
163     fi
164 fi
165
166 if $upload; then
167     for dist in ${CENTOS_DIST}; do
168         arch=amd64
169         prodver=${PRODUCT}-${VERSION}
170         if ! scp ${ID_DEB_BUILD}/../id-rpm-build/upload-rpms.sh ${dist}:rpmbuild/SOURCES/${prodver}/; then
171             echo "Copy of upload-rpms.sh to $dist failed"
172             exit 1
173         fi
174         if ssh $dist "cd rpmbuild/SOURCES/${prodver} && chmod +x upload-rpms.sh && ./upload-rpms.sh ${PRODUCT}.spec"; then
175             :
176         else
177             echo "Upload failed for $dist"
178             exit 1
179         fi
180     done
181     for dist in ${UBUNTU_DIST}; do
182         ssh ftp.indexdata.dk "mkdir -p /home/ftp/pub/${PRODUCT}/ubuntu/${dist}"
183         if ! scp ${dist}-*/* ftp.indexdata.dk:/home/ftp/pub/${PRODUCT}/ubuntu/${dist}; then
184             echo "Upload failed for $dist"
185             exit 1
186         fi
187     done
188     for dist in ${DEBIAN_DIST}; do
189         ssh ftp.indexdata.dk "mkdir -p /home/ftp/pub/${PRODUCT}/debian/${dist}"
190         if ! scp ${dist}-*/* ftp.indexdata.dk:/home/ftp/pub/${PRODUCT}/debian/${dist}; then
191             echo "Upload failed for $dist"
192             exit 1
193         fi
194     done
195     if test "${CENTOS_DIST}"; then
196         if ! ssh ftp.indexdata.dk "sudo -n /home/indexdata/proj/git-tools/update-archive/update-yum-archive.sh"; then
197             echo "update-yum-archive.sh failed"
198             exit 1
199         fi
200     fi
201     if test "${UBUNTU_DIST}" -o "${DEBIAN_DIST}"; then
202         if ! ssh ftp.indexdata.dk "sudo -n /home/indexdata/proj/git-tools/update-archive/update-archive.sh --ubuntu=\"${UBUNTU_DIST}\" --debian=\"${DEBIAN_DIST}\""; then
203             echo "update-archive.sh failed"
204             exit 1
205         fi
206     fi
207     echo "Upload successful - we hope"
208     exit 0
209 fi
210
211 rm -f *.log
212
213 # copy tars to centos build hosts
214 for dist in ${CENTOS_DIST}; do
215     arch=amd64
216     prodver=${PRODUCT}-${VERSION}
217     tarname=${prodver}.tar.gz
218     if test ! -f ../${tarname}; then
219         echo "$tarname: missing"
220         exit 1
221     fi
222
223     if ssh $dist "test -f .rpmmacros && test -d rpmbuild/SOURCES && test -d rpmbuild/RPMS && test -d rpmbuild/SRPMS"; then
224         :
225     else
226         echo "Host $dist does not seem to be prepared with rpmbuild directories"
227         exit 1
228     fi
229
230     if scp ../${tarname} $dist:rpmbuild/SOURCES/ ; then
231         :
232     else
233         echo "Could not copy $tarname to $dist"
234         exit 1
235     fi
236     if ssh $dist "cd rpmbuild/SOURCES && rm -fr $prodver && tar zxf $tarname && cd ${prodver} && rpmbuild -ba ${PRODUCT}.spec" >${dist}-${arch}.log 2>&1; then
237         :
238     else
239         echo "FAILED: See ${dist}-${arch}.log"
240         exit 1
241     fi
242 done
243
244 # call our privileged wrapper to clean the directories, no --dsc option
245 for dist in ${DEBIAN_DIST} ${UBUNTU_DIST}; do
246     for arch in ${USE_ARCHS}; do
247         sudo -n $PBUILDROOT --home=${HOME_EXPORT} --dist=$dist --arch=$arch
248         if test $? -ne 0; then
249             echo "FAILED"
250             echo "Run id-pbuild.sh using sudo or add yourself to /etc/sudoers:"
251             echo "${USER} ALL=NOPASSWD: ${ID_DEB_BUILD}/id-pbuild-root.sh"
252             exit 1
253         fi
254     done
255 done
256
257 # call our privileged wrapper to do the real work, with --dsc option
258 i=0
259 date
260 for dist in ${DEBIAN_DIST} ${UBUNTU_DIST}; do
261     for arch in ${USE_ARCHS}; do
262         sudo -n $PBUILDROOT --home=${HOME_EXPORT} \
263             --dist=$dist --arch=$arch --dsc=$PKG >${dist}-${arch}.log 2>&1 &
264         i=`expr $i + 1`
265         if test $i -eq $concurrency; then
266             i=0
267             wait
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         fi
275     done
276 done
277 wait
278 for dist in ${DEBIAN_DIST} ${UBUNTU_DIST}; do
279     for arch in ${USE_ARCHS}; do
280         if test -f ${dist}-${arch}/*.dsc; then
281             :
282         else
283             echo "FAILED: No .dsc file for ${dist}-${arch}"
284             exit 1
285         fi
286     done
287 done
288
289 date
290 echo "Done"
291 # Local Variables:
292 # mode:shell-script
293 # sh-indentation: 2
294 # sh-basic-offset: 4
295 # End: