#!/bin/bash # Copyright (C) 2011 by Mike Gabriel # # This programme is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. # # This programme is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the # Free Software Foundation, Inc., # 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. test -z $1 && { echo "usage: {main,main/,nightly,nightly/} []"; exit -1; } set -ex export GIT_SERVER="code.it-zukunft-schule.de" export DEBEMAIL=itzks-packages@it-zukunft-schule.de export DEBFULLNAME="ITZKS Packages" export GPG_KEY="E41B37C658842183" set_vars() { USE_SUDO="yes" PDEBUILD="pdebuild --pbuilder qemubuilder" TEMP_BASE="$HOME/tmp/" # first argv is the name of the Git project PROJECT=$1 # grab repository component area from command line (2nd argv) or guess it ARGV2_COMPONENT=$(echo "$2/" | cut -d"/" -f1) ARGV2_CODENAME=$(echo "$2/" | cut -d"/" -f2) COMPONENT=${ARGV2_COMPONENT:-${COMPONENT:-nightly}} CODENAMES=${ARGV2_CODENAME:-${CODENAMES}} [ -n "$ARGV2_CODENAME" ] && FORCE_BUILD=0 || FORCE_BUILD=-1 if [ "x$COMPONENT" = "xmain" ]; then CHECKOUT=${3:-build-main} elif [ "x$COMPONENT" = "xnightly" ]; then CHECKOUT=${3:-master} DATE="~${DATE:-$(date +%Y%m%d)}" else echo "error: no such package component area for ITZKS packages. Aborting..." exit -1 fi # the DATE might be given as ,,today'' from the command line [ "x$DATE" = "xtoday" ] && DATE="~$(date +%Y%m%d)" # setting paths PROJECT_DIR=$HOME/build/$COMPONENT/$PROJECT DIST_SUPPORTED="debian ubuntu" PKGDIST="$HOME/pkg-dist/$COMPONENT/$PROJECT" # build for other architectures than amd64/i386 EXTRA_ARCHS="${EXTRA_ARCHS:-}" EXTRA_ARCHS_ONLY="${EXTRA_ARCHS_ONLY:-}" # creating paths mkdir -p "$TEMP_BASE" mkdir -p $PROJECT_DIR mkdir -p $PKGDIST return 0 } clear_pkgdist() { # pkgdist directory cleanup cat BUILDS_FOR | egrep -v '(^$|^#.*$)' | while read line; do l_DIST=$(echo $line | cut -d":" -f1 | tr [A-Z] [a-z]) CODENAMES=${CODENAMES:-$(echo $line | cut -d":" -f2- | tr [A-Z] [a#-z])} echo "$DIST_SUPPORTED" | grep $l_DIST >/dev/null && { for l_CODENAME in $CODENAMES; do if [ "x$EXTRA_ARCHS_ONLY" = "x" ]; then for l_ARCH in amd64 i386; do mkdir -p $PKGDIST/$l_DIST/$l_CODENAME/$l_ARCH rm -f $PKGDIST/$l_DIST/$l_CODENAME/$l_ARCH/$PROJECT_*.changes rm -f $PKGDIST/$l_DIST/$l_CODENAME/$l_ARCH/$PROJECT_*.upload rm -f $PKGDIST/$l_DIST/$l_CODENAME/$l_ARCH/$PROJECT_*.build rm -f $PKGDIST/$l_DIST/$l_CODENAME/$l_ARCH/$PROJECT_*.dsc rm -f $PKGDIST/$l_DIST/$l_CODENAME/$l_ARCH/$PROJECT_*.tar.gz rm -f $PKGDIST/$l_DIST/$l_CODENAME/$l_ARCH/*.deb done fi for l_EXTRA_ARCH in $EXTRA_ARCHS; do mkdir -p $PKGDIST/$l_DIST/$l_CODENAME/$l_EXTRA_ARCH rm -f $PKGDIST/$l_DIST/$l_CODENAME/$l_EXTRA_ARCH/$PROJECT_*.changes rm -f $PKGDIST/$l_DIST/$l_CODENAME/$l_EXTRA_ARCH/$PROJECT_*.upload rm -f $PKGDIST/$l_DIST/$l_CODENAME/$l_EXTRA_ARCH/$PROJECT_*.build rm -f $PKGDIST/$l_DIST/$l_CODENAME/$l_EXTRA_ARCH/$PROJECT_*.dsc rm -f $PKGDIST/$l_DIST/$l_CODENAME/$l_EXTRA_ARCH/$PROJECT_*.tar.gz rm -f $PKGDIST/$l_DIST/$l_CODENAME/$l_EXTRA_ARCH/*.deb done done } done return 0 } prepare_workspace() { # in any case remove the BUILDS_FOR file rm -f $PROJECT_DIR/BUILDS_FOR # make sure our local working copy is up to date... if [ -d $PROJECT_DIR/.git ]; then cd $PROJECT_DIR && git reset --hard git checkout --force $CHECKOUT || git checkout --force -b $CHECKOUT git pull origin $CHECKOUT # and again, get the $CHECKOUT refspec in pure state git reset --hard else cd $(dirname $PROJECT_DIR) git clone git://$GIT_SERVER/$PROJECT.git cd $PROJECT git checkout --force $CHECKOUT || git checkout --force -b $CHECKOUT; fi cd $PROJECT_DIR test -f debian/source/format && cat debian/source/format | egrep '^3.0.*\(quilt\)$' >/dev/null && { UPSTREAM_VERSION=`head -n1 debian/changelog | sed 's,.*(\(.*\)).*,\1,' | sed 's,\(\.dfsg.*\),,' | cut -d"-" -f1` ORIG_TARBALL="${PROJECT}_${UPSTREAM_VERSION}.orig.tar.gz" } # by default we build for all current debian versions test -f BUILDS_FOR || cat > BUILDS_FOR </dev/null && { for l_CODENAME in $CODENAMES; do TEMP_DIR="$(mktemp -d --tmpdir=$TEMP_BASE)" mkdir -p $TEMP_DIR/$PROJECT git clone --local $PROJECT_DIR $TEMP_DIR/$PROJECT/ cd $TEMP_DIR/$PROJECT git checkout $CHECKOUT || git checkout master GITREV=$(itzks-gitrevno) test -n ${ORIG_TARBALL} && pristine-tar checkout ../${ORIG_TARBALL} # translate the version name for Debian releases [ "x$l_CODENAME" = "xsid" ] && VERSION=unstable [ "x$l_CODENAME" = "xwheezy" ] && VERSION=testing [ "x$l_CODENAME" = "xsqueeze" ] && VERSION=stable [ "x$l_CODENAME" = "xlenny" ] && VERSION=oldstable # modify the section for non-main package builds [ "x$COMPONENT" = "xmain" ] || { mv debian/control debian/control.tmp cat debian/control.tmp | sed "s#Section:[\ ]*\(.*\)#Section: $COMPONENT/\1#g" > debian/control } # modify changelog for this build dch --distribution $VERSION --force-distribution -l "+$l_CODENAME~$COMPONENT$DATE~$GITREV~build" "Auto-built $l_DIST $l_CODENAME package for packages.it-zukunft-schule.de repository." mkdir -p $PKGDIST/$l_DIST/$l_CODENAME/{amd64,i386} OTHERMIRROR="deb http://packages.it-zukunft-schule.de/debian $l_CODENAME $COMPONENT" [ "x$USE_SUDO" != "xyes" ] && { [ "x$EXTRA_ARCHS_ONLY" = "x" ] && { cat debian/control | egrep 'Architecture.*(all|any|amd64)' >/dev/null && { DIST=$l_DIST CODENAME=$l_CODENAME ARCH=amd64 $PDEBUILD --auto-debsign --debsign-k $GPG_KEY --buildresult $PKGDIST/$l_DIST/$l_CODENAME/amd64 } cat debian/control | egrep 'Architecture.*(any|i386)' >/dev/null && { DIST=$l_DIST CODENAME=$l_CODENAME ARCH=i386 $PDEBUILD --auto-debsign --debsign-k $GPG_KEY --buildresult $PKGDIST/$l_DIST/$l_CODENAME/i386 -- --binary-arch } } for extra_arch in $EXTRA_ARCHS; do mkdir -p $PKGDIST/$l_DIST/$l_CODENAME/$extra_arch cat debian/control | egrep "Architecture.*(any|$extra_arch)" >/dev/null && { DIST=$l_DIST CODENAME=$l_CODENAME ARCH=$extra_arch $PDEBUILD --auto-debsign --debsign-k $GPG_KEY --buildresult $PKGDIST/$l_DIST/$l_CODENAME/$extra_arch -- --binary-arch } done } [ "x$USE_SUDO" = "xyes" ] && { [ "x$EXTRA_ARCHS_ONLY" = "x" ] && { cat debian/control | egrep 'Architecture.*(all|any|amd64)' >/dev/null && { sudo DIST=$l_DIST CODENAME=$l_CODENAME ARCH=amd64 OTHERMIRROR="$OTHERMIRROR" $PDEBUILD --auto-debsign --debsign-k $GPG_KEY --buildresult $PKGDIST/$l_DIST/$l_CODENAME/amd64 } cat debian/control | egrep 'Architecture.*(any|i386)' >/dev/null && { sudo DIST=$l_DIST CODENAME=$l_CODENAME ARCH=i386 OTHERMIRROR="$OTHERMIRROR" $PDEBUILD --auto-debsign --debsign-k $GPG_KEY --buildresult $PKGDIST/$l_DIST/$l_CODENAME/i386 -- --binary-arch } } for extra_arch in $EXTRA_ARCHS; do mkdir -p $PKGDIST/$l_DIST/$l_CODENAME/$extra_arch cat debian/control | egrep "Architecture.*(any|$extra_arch)" >/dev/null && { sudo DIST=$l_DIST CODENAME=$l_CODENAME ARCH=$extra_arch OTHERMIRROR="$OTHERMIRROR" $PDEBUILD --auto-debsign --debsign-k $GPG_KEY --buildresult $PKGDIST/$l_DIST/$l_CODENAME/$extra_arch -- --binary-arch } done } cd - rm -Rf $TEMP_DIR done echo } echo done return 0 } upload_packages() { # dupload the new packages to the reprepro repository cd $PKGDIST cat $PROJECT_DIR/BUILDS_FOR | egrep -v '(^$|^#.*$)' | while read line; do l_DIST=$(echo $line | cut -d":" -f1 | tr [A-Z] [a-z]) CODENAMES=${CODENAMES:-$(echo $line | cut -d":" -f2- | tr [A-Z] [a#-z])} for l_CODENAME in $CODENAMES; do if [ "x$EXTRA_ARCHS_ONLY" = "x" ]; then for l_ARCH in amd64 i386; do cd $PKGDIST/$l_DIST/$l_CODENAME/$l_ARCH ls $PROJECT_*.changes &>/dev/null && dupload --to itzks-$l_DIST-$l_CODENAME $PROJECT_*.changes cd - done fi for l_EXTRA_ARCH in $EXTRA_ARCHS; do cd $PKGDIST/$l_DIST/$l_CODENAME/$l_EXTRA_ARCH ls $PROJECT_*.changes &>/dev/null && dupload --to itzks-$l_DIST-$l_CODENAME $PROJECT_*.changes cd - done done done cd - return 0 } ### MAIN ### set_vars $@ && { if [ "x$(basename $0)" = "xitzks-build-package" ] || [ "x$(basename $0)" = "xitzks-build+upload-package" ]; then cd $PROJECT_DIR && itzks-pkgneedsbuild $CHECKOUT || [ "$FORCE_BUILD" -eq 0 ] && { clear_pkgdist prepare_workspace && { build_packages } } fi if [ "x$(basename $0)" = "xitzks-upload-package" ] || [ "x$(basename $0)" = "xitzks-build+upload-package" ]; then upload_packages fi }