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