#!/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. GIT_USER="gituser" GIT_HOSTNAME="git.mydomain.org" DEBEMAIL="firstname.lastname@mydomain.org" DEBFULLNAME="Firstname Lastname" GPG_KEY= DISTS_SUPPORTED="debian ubuntu" DEBIAN_DISTROS="lenny squeeze wheezy sid" UBUNTU_DISTROS="lucid maverick natty oneiric precise" BUILDS_FOR="\ debian: squeeze wheezy sid\n\ ubuntu: lucid precise\n\ " COMPONENT_MAIN="main" COMPONENT_NIGHTLY="nightly" COMPONENT_BUNDLES="bundle-release1 bundle-release2" REPOS_SERVER="packages.mydomain.org" PACKAGES_WITHOUT_OTHERMIRROR="keyring" GNUPGHOME=$HOME/.gnupg test -z $1 && { echo "usage: $(basename $0) [/] {main,main/,nightly,nightly/} []"; exit -1; } PREFIX=$(echo `basename $0` | cut -d"-" -f1) test -f ~/.buildscripts/$PREFIX.conf && . ~/.buildscripts/$PREFIX.conf || { echo "$0 has no valid context prefix..."; exit -1; } set -ex set_vars() { USE_SUDO="yes" PDEBUILD="pdebuild --pbuilder qemubuilder" TEMP_BASE="$HOME/tmp/" mkdir -p "$TEMP_BASE" chmod 2770 "$TEMP_BASE" # first argv is the name of the Git project PROJECT_PATH="$1" PROJECT_PATH=${PROJECT_PATH/%.git/} PROJECT="$(basename $PROJECT_PATH)" # 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:-$COMPONENT_NIGHTLY}}" CODENAMES="${ARGV2_CODENAME:-${CODENAMES}}" [ -n "$ARGV2_CODENAME" ] && FORCE_BUILD=0 || FORCE_BUILD=-1 if [ "x$COMPONENT" = "x$COMPONENT_MAIN" ]; then CHECKOUT="${3:-build-main}" elif [ echo "$COMPONENT_RELEASES" | grep "$COMPONENT" ]; then CHECKOUT="${3:-build-$COMPONENT}" elif [ "x$COMPONENT" = "x$COMPONENT_NIGHTLY" ]; then CHECKOUT="${3:-master}" DATE="~${DATE:-$(date +%Y%m%d)}" else echo "error: no such package component area for this Git project. 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" 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 } 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_HOSTNAME/$PROJECT_PATH.git cd "$PROJECT" git checkout --force $CHECKOUT || git checkout --force -b $CHECKOUT; fi cd "$PROJECT_DIR" # by default we build for all current debian versions if test -z $ARGV2_CODENAME; then test -f BUILDS_FOR || echo -e "$BUILDS_FOR" > BUILDS_FOR elif echo "$DEBIAN_DISTROS" | grep $ARGV2_CODENAME >/dev/null; then echo "debian: $ARGV2_CODENAME" > BUILDS_FOR elif echo "$UBUNUT_DISTROS" | grep $ARGV2_CODENAME >/dev/null; then echo "ubuntu: $ARGV2_CODENAME" >/dev/null fi return 0 } clear_pkgdist() { # pkgdist directory cleanup cat "$PROJECT_DIR/BUILDS_FOR" | egrep -v '(^$|^#.*$)' | while read line; do l_DIST="$(echo ${line/: /:} | cut -d":" -f1 | tr [:upper:] [:lower:])" l_CODENAMES="${CODENAMES:-$(echo ${line/: /:} | cut -d":" -f2- | tr [:upper:] [:lower:])}" echo "$DISTS_SUPPORTED" | grep $l_DIST >/dev/null && { for l_CODENAME in $l_CODENAMES; do # in case we build a special CODENAME (squeeze, wheezy, lucid, ...) do skip # the wrong distribution here... test -z $CODENAMES || echo $line | grep $CODENAMES || break if [ "x$EXTRA_ARCHS_ONLY" = "x" ]; then for l_ARCH in amd64 i386; do [ "x$SKIP_ARCH" != "x$l_ARCH" ] && { mkdir -p "$PKGDIST/$l_DIST/$l_CODENAME/$l_ARCH" rm -f "$PKGDIST/$l_DIST/$l_CODENAME/$l_ARCH/dupload.conf" 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/dupload.conf" 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 } build_packages() { # use pbuilder for building all variants of this package cat "$PROJECT_DIR/BUILDS_FOR" | egrep -v '(^$|^#.*$)' | while read line; do l_DIST="$(echo ${line/: /:} | cut -d":" -f1 | tr [:upper:] [:lower:])" l_CODENAMES="${CODENAMES:-$(echo ${line/: /:} | cut -d":" -f2- | tr [:upper:] [:lower:])}" echo "$DISTS_SUPPORTED" | grep $l_DIST >/dev/null && { for l_CODENAME in $l_CODENAMES; do # in case we build a special CODENAME (squeeze, wheezy, lucid, ...) do skip # the wrong distribution here... test -z $CODENAMES || echo $line | grep $CODENAMES || break TEMP_DIR="$(mktemp -d --tmpdir=$TEMP_BASE)" mkdir -p "$TEMP_DIR/$PROJECT" chmod 2770 "$TEMP_DIR" -Rf cd "$PROJECT_DIR" git clone --local "$PROJECT_DIR" "$TEMP_DIR/$PROJECT/" cd "$TEMP_DIR/$PROJECT" git checkout $CHECKOUT || git checkout master find $PROJECT_DIR/../ -type f -maxdepth 0 -mindepth 0 | grep $PROJECT_*.orig.tar.gz &>/dev/null && cp $PROJECT_DIR/../$PROJECT_*.orig.tar.gz .. GITREV=$(gitrevno) # we always build native packages for our repos test -f debian/source/format && cat debian/source/format | egrep '^3.0.*\(quilt\)$' >/dev/null && { echo "3.0 (native)" > debian/source/format } # for Ubuntu version is the codename of the distribution release VERSION=$l_CODENAME # 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 $REPOS_SERVER repository." mkdir -p $PKGDIST/$l_DIST/$l_CODENAME/{amd64,i386} OTHERMIRROR="" echo $PACKAGE_WITHOUT_OTHERMIRROR | grep $PROJECT >/dev/null || OTHERMIRROR="deb http://$REPOS_SERVER/$l_DIST $l_CODENAME $COMPONENT" [ "x$USE_SUDO" != "xyes" ] && { [ "x$EXTRA_ARCHS_ONLY" = "x" ] && { [ "x$SKIP_ARCH" != "xamd64" ] && 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" 0<&- } [ "x$SKIP_ARCH" != "xi386" ] && 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 0<&- } } 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 0<&- } done } [ "x$USE_SUDO" = "xyes" ] && { [ "x$EXTRA_ARCHS_ONLY" = "x" ] && { [ "x$SKIP_ARCH" != "xamd64" ] && cat debian/control | egrep 'Architecture.*(all|any|amd64)' >/dev/null && { sudo GNUPGHOME=$GNUPGHOME DIST=$l_DIST CODENAME=$l_CODENAME ARCH=amd64 OTHERMIRROR="$OTHERMIRROR" $PDEBUILD --auto-debsign --debsign-k $GPG_KEY --buildresult $PKGDIST/$l_DIST/$l_CODENAME/amd64 0<&- } [ "x$SKIP_ARCH" != "xi386" ] && cat debian/control | egrep 'Architecture.*(any|i386)' >/dev/null && { sudo GNUPGHOME=$GNUPGHOME 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 0<&- } } 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 GNUPGHOME=$GNUPGHOME 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 0<&- } done } rm -Rf "$TEMP_DIR" done } done return 0 } upload_packages() { # dupload the new packages to the reprepro repository cat "$PROJECT_DIR/BUILDS_FOR" | egrep -v '(^$|^#.*$)' | while read line; do l_DIST=$(echo ${line/: /:} | cut -d":" -f1 | tr [:upper:] [:lower:]) l_CODENAMES=${CODENAMES:-$(echo ${line/: /:} | cut -d":" -f2- | tr [:upper:] [:lower:])} for l_CODENAME in $l_CODENAMES; do # in case we build a special CODENAME (squeeze, wheezy, lucid, ...) do skip # the wrong distribution here... test -z $CODENAMES || echo $line | grep $CODENAMES || break if [ "x$EXTRA_ARCHS_ONLY" = "x" ]; then for l_ARCH in amd64 i386; do [ "x$SKIP_ARCH" != "x$l_ARCH" ] && { cd "$PKGDIST/$l_DIST/$l_CODENAME/$l_ARCH" test -f ./dupload.conf || ln -s ~/.dupload.conf.$PREFIX ./dupload.conf ls $PROJECT_*.changes &>/dev/null && dupload -c --to $PREFIX-$l_DIST-$l_CODENAME $PROJECT_*.changes 0<&- } done fi for l_EXTRA_ARCH in $EXTRA_ARCHS; do cd "$PKGDIST/$l_DIST/$l_CODENAME/$l_EXTRA_ARCH" test -f ./dupload.conf || ln -s ~/.dupload.conf.$PREFIX ./dupload.conf ls $PROJECT_*.changes &>/dev/null && dupload -c --to $PREFIX-$l_DIST-$l_CODENAME $PROJECT_*.changes 0<&- done done done return 0 } ### MAIN ### set_vars $@ && { if [ "x$(basename $0)" = "x$PREFIX-build-package" ] || [ "x$(basename $0)" = "x$PREFIX-build+upload-package" ]; then cd $PROJECT_DIR && pkgneedsbuild $CHECKOUT || [ "$FORCE_BUILD" -eq 0 ] && { prepare_workspace && { clear_pkgdist build_packages } } fi if [ "x$(basename $0)" = "x$PREFIX-upload-package" ] || [ "x$(basename $0)" = "x$PREFIX-build+upload-package" ]; then upload_packages fi }