#!/bin/sh
-# This script builds Debian packages for one or more distributions
-# in i386/amd64 architectures. It uses pbuilder. pbuilder requires root
-# privilege and so this script should be invoked with sudo.
-
usage()
{
cat <<EOF
-Usage: id-pbuild-all.sh [OPTIONS]
+Usage: id-pbuild.sh [OPTIONS]
Options:
- [--debian=distros]
- [--ubuntu=distros]
- [--upload]
- [--concurrency=N]
+ [--debian=distros]
+ [--ubuntu=distros]
+ [--centos=distros]
+ [--concurrency=level]
+ [--update=true|false]
+ [--upload]
EOF
exit $1
}
-
-# things that might be set by options
-upload=false
+D0=`dirname $0`
+ID_DEB_BUILD=`cd $D0; pwd`
+update=true
do_help=false
-concurrency=4
-
-if test -f IDMETA; then
- . ./IDMETA
-fi
+upload=false
+concurrency=8
+ARCHS="i386 amd64"
while test $# -gt 0; do
case "$1" in
- -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
- *) optarg= ;;
+ -*=*) optarg=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+ *) optarg= ;;
esac
-
case $1 in
- --ubuntu=*)
- UBUNTU_DIST=$optarg
- ;;
- --debian=*)
- DEBIAN_DIST=$optarg
- ;;
+ --debian=*)
+ DEBIAN_DIST_A=$optarg
+ ;;
+ --ubuntu=*)
+ UBUNTU_DIST_A=$optarg
+ ;;
+ --centos=*)
+ CENTOS_DIST_A=$optarg
+ ;;
--concurrency=*)
- concurrency=$optarg
- ;;
+ concurrency=$optarg
+ ;;
--upload)
- upload=true
- ;;
- -*)
- do_help=yes
- ;;
+ upload=true
+ ;;
+ --update=*)
+ update=$optarg
+ ;;
+ -*)
+ do_help=yes
+ ;;
esac
shift
done
-
if test "$do_help" = "yes"; then
usage 1 1>&2
fi
+if test ! -x /usr/bin/lxc-attach; then
+ echo "No lxc-attach. Probably not running on mochi!!"
+ exit 1
+fi
+if test -f IDMETA; then
+ . ./IDMETA
+else
+ echo "IDMETA missing"
+ exit 1
+fi
+UPLOAD_HOST=${UPLOAD_HOST:=ftp.indexdata.dk}
+UPLOAD_PATH=${UPLOAD_PATH:=/home/ftp/pub}
-if test -d deb-src; then
- cd deb-src
+if test "$DEBIAN_DIST_A" -o "$UBUNTU_DIST_A" -o "$CENTOS_DIST_A"; then
+ DEBIAN_DIST=$DEBIAN_DIST_A
+ UBUNTU_DIST=$UBUNTU_DIST_A
+ CENTOS_DIST=$CENTOS_DIST_A
fi
-for f in *.dsc; do
- if test -f "$f"; then
- PKG=$f
+if test "$DEBIAN_DIST" -o "$UBUNTU_DIST"; then
+ debian=true
+ DNAME=`awk '/Source:/ {print $2}' debian/control`
+ if test "$NAME" -a "$NAME" != "$DNAME"; then
+ echo "NAME in IDMETA ($NAME) does not match debian/control ($DNAME)"
+ exit 1
fi
-done
-if test -z "$PKG"; then
- echo "Specify .dsc file"
- exit 1
+ PRODUCT=$DNAME
+else
+ debian=false
fi
-if test ! -e "$PKG"; then
- echo "${PKG} does not exist"
- exit 1
+if test "$CENTOS_DIST"; then
+ centos=true
+ RNAME=`awk '/Name:/ {print $2}' *.spec`
+ if test "$NAME" -a "$NAME" != "$RNAME"; then
+ echo "NAME in IDMETA ($NAME) does not match RPM spec NAME ($RNAME)"
+ exit 1
+ fi
+ PRODUCT=$RNAME
+ if test ! -d ~/rpmbuild; then
+ echo "Creating ~/rpmbuild"
+ mkdir -p ~/pmbuild/BUILD
+ mkdir -p ~/rpmbuild/RPMS/noarch
+ mkdir -p ~/rpmbuild/RPMS/x86_64
+ mkdir -p ~/rpmbuild/SOURCES
+ mkdir -p ~/rpmbuild/SPECS
+ mkdir -p ~/rpmbuild/SRPMS
+ fi
+ if test ! -f ~/.rpmmacros; then
+ echo "Creating ~/.rpmmacros"
+ echo "%_topdir $HOME/rpmbuild" >~/.rpmmacros
+ echo "%_source_filedigest_algorithm 0" >>~/.rpmmacros
+ echo "%_binary_filedigest_algorithm 0" >>~/.rpmmacros
+ fi
+else
+ centos=false
fi
-PBUILDER=/usr/sbin/pbuilder
-PRODUCT=`echo *.dsc|sed 's/_.*//g'`
-ARCHS="i386 amd64"
-echo "Dsc $PKG . Product $PRODUCT"
-echo "Ubuntu distros: $UBUNTU_DIST"
-echo "Debian distros: $DEBIAN_DIST"
+TAR=${PRODUCT}-${VERSION}.tar.gz
+
if $upload; then
- for dist in ${UBUNTU_DIST}; do
- scp ${dist}-*/* ftp.indexdata.dk:/home/ftp/pub/${PRODUCT}/ubuntu/${dist}
- done
- for dist in ${DEBIAN_DIST}; do
- scp ${dist}-*/* ftp.indexdata.dk:/home/ftp/pub/${PRODUCT}/debian/${dist}
- done
- echo "Remember to update APT on ftp.indexdata.dk"
- echo "cd git-tools/update-archive"
- echo "sudo su"
- echo "./update-archive.sh"
+ UPLOAD_URI=${UPLOAD_HOST}:${UPLOAD_PATH}/${PRODUCT}
+ echo "Uploading to ${UPLOAD_URI}"
+ if $centos; then
+ pkg_names=`sudo lxc-attach -n mockbuild -- rpm -q --specfile ~/rpmbuild/SPECS/${PRODUCT}.spec --queryformat "%{NAME}-%{VERSION}-%{RELEASE}\n"`
+ for dist in ${CENTOS_DIST}; do
+ case $dist in
+ centos5)
+ ftpdir=centos/5.5
+ r=id-epel-5-x86_64 ;;
+ centos6)
+ ftpdir=centos/6
+ r=id-epel-6-x86_64 ;;
+ centos7)
+ ftpdir=centos/7
+ r=id-epel-7-x86_64 ;;
+ *)
+ ftpdir=centos/$dist
+ r=$dist ;;
+ esac
+ echo "$r"
+ for pkg in ${pkg_names}; do
+ ssh ${UPLOAD_HOST} "mkdir -p ${UPLOAD_PATH}/${PRODUCT}/redhat/${ftpdir}/SRPMS"
+ if test -f ~/rpmbuild/SRPMS/${pkg}.src.rpm; then
+ scp ~/rpmbuild/SRPMS/${pkg}.src.rpm ${UPLOAD_URI}/redhat/${ftpdir}/SRPMS
+ fi
+ for arch in x86_64 noarch; do
+ if test -f ~/rpmbuild/$r/${pkg}.${arch}.rpm; then
+ ssh ${UPLOAD_HOST} "mkdir -p ${UPLOAD_PATH}/${PRODUCT}/redhat/${ftpdir}/RPMS/${arch}"
+ scp ~/rpmbuild/$r/${pkg}.${arch}.rpm ${UPLOAD_URI}/redhat/${ftpdir}/RPMS/${arch}
+ fi
+ done
+ done
+ done
+ if ! ssh ${UPLOAD_HOST} "sudo -n /home/indexdata/proj/git-tools/update-archive/update-yum-archive.sh" >~/rpmbuild/yum-update.log 2>&1; then
+ echo "update-yum-archive.sh failed. Inspect ~/rpmbuild/yum-update.log"
+ exit 1
+ fi
+ fi
+
+ if $debian; then
+ cd deb-src
+ if test -n "${UBUNTU_DIST}"; then
+ for dist in ${UBUNTU_DIST}; do
+ ssh ${UPLOAD_HOST} "mkdir -p ${UPLOAD_PATH}/${PRODUCT}/ubuntu/${dist}"
+ if ! scp ${dist}-*/* ${UPLOAD_URI}/ubuntu/${dist}; then
+ echo "Upload failed for $dist"
+ exit 1
+ fi
+ done
+ fi
+ if test -n "${DEBIAN_DIST}"; then
+ for dist in ${DEBIAN_DIST}; do
+ ssh ${UPLOAD_HOST} "mkdir -p ${UPLOAD_PATH}/${PRODUCT}/debian/${dist}"
+ if ! scp ${dist}-*/* ${UPLOAD_URI}/debian/${dist}; then
+ echo "Upload failed for $dist"
+ exit 1
+ fi
+ done
+ fi
+ if ! ssh ${UPLOAD_HOST} "sudo -n /home/indexdata/proj/git-tools/update-archive/update-archive.sh --ubuntu=\"${UBUNTU_DIST}\" --debian=\"${DEBIAN_DIST}\""; then
+ echo "update-archive.sh failed"
+ exit 1
+ fi
+ fi
+ echo "Upload successful - we hope"
exit 0
fi
-i=0
-date
-for dist in ${DEBIAN_DIST} ${UBUNTU_DIST}; do
- for arch in ${ARCHS}; do
- rm -fr ${dist}-${arch}
- (
- if test ! -f /var/cache/pbuilder/${dist}-${arch}-base.tgz; then
- DIST=$dist ARCH=$arch $PBUILDER create
- fi
- DIST=$dist ARCH=$arch $PBUILDER update --override-config
- DIST=$dist ARCH=$arch $PBUILDER --build $PKG
- ) >${dist}-${arch}.log 2>&1 &
- i=`expr $i + 1`
- if test $i -eq $concurrency; then
- i=0
- wait
- fi
- done
-done
-wait
-for dist in ${DEBIAN_DIST} ${UBUNTU_DIST}; do
- for arch in ${ARCHS}; do
- if test -f ${dist}-${arch}/*.dsc; then
- :
+
+if $centos; then
+ SPEC=${PRODUCT}.spec
+ cp ${TAR} ~/rpmbuild/SOURCES
+ cat ${SPEC}|sed "s/%define idmetaversion.*/%define idmetaversion ${VERSION}/" >~/rpmbuild/SPECS/${SPEC}
+ sudo lxc-attach -n mockbuild -- rpmbuild -bs ~/rpmbuild/SPECS/${SPEC}
+ for dist in ${CENTOS_DIST}; do
+ case $dist in
+ centos5)
+ r=id-epel-5-x86_64 ;;
+ centos6)
+ r=id-epel-6-x86_64 ;;
+ centos7)
+ r=id-epel-7-x86_64 ;;
+ *)
+ r=$dist ;;
+ esac
+ echo -n "$r"
+ mkdir -p ~/rpmbuild/$r
+ if sudo lxc-attach -n mockbuild -- mock -q --resultdir=~/rpmbuild/$r -r $r ~/rpmbuild/SRPMS/${PRODUCT}-${VERSION}*src.rpm; then
+ echo " done"
else
- echo "No .dsc file for ${dist}-${arch}"
+ echo " failed. Inspect ~/rpmbuild/$r/build.log"
exit 1
fi
done
-done
-date
-echo "Done"
+fi
+if $debian; then
+ sudo rm -fr deb-src
+ MKDEBSRC=${ID_DEB_BUILD}/id-mk-deb-src.sh
+ if test ! -x $MKDEBSRC; then
+ echo "$MKDEBSRC not found"
+ exit 1
+ fi
+ if ! ${ID_DEB_BUILD}/id-mk-deb-changelog.sh; then
+ echo "id-mk-deb-changelog.sh failed"
+ fi
+ if ! ${MKDEBSRC}; then
+ echo "id-mk-deb-src.sh failed"
+ fi
+ cd deb-src
+ for f in *.dsc; do
+ if test -f "$f"; then
+ DSC=$f
+ fi
+ done
+ if test -z "$DSC"; then
+ echo "${DSC}does not exist"
+ exit 1
+ fi
+ if grep "Architecture: all" $DSC >/dev/null; then
+ USE_ARCHS=i386
+ else
+ USE_ARCHS=$ARCHS
+ fi
+ rm -f ~/.pbuilderrc
+ i=0
+ cat ${ID_DEB_BUILD}/pbuilderrc > ~/.pbuilderrc
+ for dist in ${DEBIAN_DIST} ${UBUNTU_DIST}; do
+ for arch in ${USE_ARCHS}; do
+ sudo ${ID_DEB_BUILD}/id-pbuild-root.sh --update=$update --dsc=$DSC --arch=$arch --dist=$dist &
+ i=`expr $i + 1`
+ if test $i -ge $concurrency; then
+ i=0
+ wait
+ if ! test -f ${dist}-${arch}/*.dsc; then
+ echo "FAILED: No .dsc file for ${dist}-${arch}"
+ exit 1
+ fi
+ fi
+ done
+ done
+ wait
+ for dist in ${DEBIAN_DIST} ${UBUNTU_DIST}; do
+ for arch in ${USE_ARCHS}; do
+ if ! test -f ${dist}-${arch}/*.dsc; then
+ echo "FAILED: No .dsc file for ${dist}-${arch}"
+ exit 1
+ fi
+ done
+ done
+fi
+
# Local Variables:
# mode:shell-script
-# sh-indentation: 2
+# sh-indentation: 4
# sh-basic-offset: 4
# End:
+