summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
Diffstat (limited to 'bin')
l---------[-rwxr-xr-x]bin/build-deb-package409
1 files changed, 1 insertions, 408 deletions
diff --git a/bin/build-deb-package b/bin/build-deb-package
index e787c69..af8f69a 100755..120000
--- a/bin/build-deb-package
+++ b/bin/build-deb-package
@@ -1,408 +1 @@
-#!/bin/bash
-
-# Copyright (C) 2011-2015 by Mike Gabriel <mike.gabriel@das-netzwerkteam.de>
-#
-# 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.
-
-export PATH="${HOME}/bin:${PATH}"
-
-GIT_USER="gituser"
-GIT_HOSTNAME="git.mydomain.org"
-
-DEBEMAIL="firstname.lastname@mydomain.org"
-DEBFULLNAME="Firstname Lastname"
-GPG_KEY=""
-DEB_DISTS_SUPPORTED="debian ubuntu"
-DEBIAN_DISTROS="lenny,squeeze,wheezy,jessie,sid"
-UBUNTU_DISTROS="lucid,precise"
-
-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}") [<subpath>/]<git-project> {main,main/<codename>,nightly,nightly/<codename>} [<git-checkout>]"; exit 1; }
-
-PREFIX="$(cut -d"-" -f1 <<< "$(basename "${0}")")"
-test -f "${HOME}/.buildscripts/${PREFIX}.conf" && . "${HOME}/.buildscripts/${PREFIX}.conf" || { echo "${0} has no valid context prefix..." >&2; exit 1; }
-
-: ${NO_DELAY:="no"}
-: ${FORCE_BUILD:="no"}
-: ${DEB_BUILD_FOR:="debian:${DEBIAN_DISTROS} ubuntu:${UBUNTU_DISTROS}"}
-
-# These parts are not user-serviceable.
-typeset -ag temp_cleanup=""
-# End of non-user-serviceable part.
-
-set -ex
-
-# Cleans up temporary directories and files.
-# RFC SHOULD be called by trap handlers.
-cleanup () {
- typeset temp_dir=""
- for temp_dir in "${temp_cleanup[@]}"; do
- if [ -n "${temp_dir}" ] && [ -d "${temp_dir}" ]; then
- rm -Rf -- "${temp_dir}"
- fi
- done
-}
-
-# Run cleanup() automatically.
-trap cleanup ERR EXIT SIGTERM SIGINT SIGHUP SIGPIPE SIGALRM SIGUSR1 SIGUSR2
-
-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="$(cut -d"/" -f1 <<< "${2}/")"
- ARGV2_CODENAME="$(cut -d"/" -f2 <<< "${2}/")"
- COMPONENT="${ARGV2_COMPONENT:-${COMPONENT:-$COMPONENT_NIGHTLY}}"
- CODENAMES="${ARGV2_CODENAME:-${CODENAMES}}"
- [ -n "${ARGV2_CODENAME}" ] && FORCE_BUILD="yes" || true
- DATE="${DATE:-$(date +%Y%m%d)}"
- if [ "x${COMPONENT}" = "x${COMPONENT_MAIN}" ]; then
- CHECKOUT="${3:-build-main}"
- elif [ "x${COMPONENT}" = "x${COMPONENT_MAIN}-test" ]; then
- CHECKOUT="${3:-build-main-test}"
- elif grep -qs "$COMPONENT" <<< "${COMPONENT_RELEASES}"; then
- CHECKOUT="${3:-build-$COMPONENT}"
- elif [ "x${COMPONENT}" = "x${COMPONENT_NIGHTLY}" ]; then
- CHECKOUT="${3:-master}"
- 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_ONLY:=""}
-
- # lock file
- LOCK_FILE="${PROJECT_DIR}/../.${PROJECT}.lock"
-
- # creating paths
- mkdir -p -- "${PROJECT_DIR}"
- mkdir -p -- "${PKGDIST}"
-
- return 0
-}
-
-prepare_workspace() {
- # 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}"
- git fetch origin upstream:upstream || true
- git fetch origin pristine-tar:pristine-tar || true
- # and again, get the ${CHECKOUT} refspec in pure state
- git reset --hard
- git clean -df
- else
- cd "$(dirname "${PROJECT_DIR}")"
- git clone "git://${GIT_HOSTNAME}/${PROJECT_PATH}.git"
- cd "${PROJECT}"
- git checkout --force "${CHECKOUT}" || git checkout --force -b "${CHECKOUT}"
- git fetch origin upstream:upstream
- git fetch origin pristine-tar:pristine-tar || true
- git clean -df
- fi
-
- GIT_OBJECT_ID="$(git rev-parse --verify HEAD)"
- cd "${PROJECT_DIR}"
-
- # by default we build for all current debian versions
- if [ "x${ARGV2_CODENAME}" != "x" ]; then
- if grep -qs "${ARGV2_CODENAME}" <<< "${DEBIAN_DISTROS}"; then
- DEB_BUILD_FOR="debian:${ARGV2_CODENAME}"
- elif grep -qs "${ARGV2_CODENAME}" <<< "${UBUNTU_DISTROS}"; then
- DEB_BUILD_FOR="ubuntu:${ARGV2_CODENAME}"
- fi
- fi
- return 0
-}
-
-clear_pkgdist() {
- # pkgdist directory cleanup
-
- # Do NOT spawn a subshell here.
- # Allow changing global variables in the main process.
- typeset -a deb_build_for_arr
- typeset OLDIFS="${IFS}"
- IFS=" "
- read -a deb_build_for_arr <<< "${DEB_BUILD_FOR}"
- IFS="${OLDIFS}"
-
- typeset line=""
- for line in "${deb_build_for_arr[@]}"; do
- l_DIST="$(cut -d":" -f1 <<< "${line/: /:}" | tr [:upper:] [:lower:])"
- l_CODENAMES="${CODENAMES:-$(cut -d":" -f2- <<< "${line/: /:}" | sed -e 's/,/ /g' | tr [:upper:] [:lower:])}"
- grep -qs "${l_DIST}" <<< "${DEB_DISTS_SUPPORTED}" && {
- 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}" || grep "${CODENAMES}" <<< "${line}" || 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
-
- # Do NOT spawn a subshell here.
- # Allow changing global variables in the main process.
- typeset -a deb_build_for_arr
- typeset OLDIFS="${IFS}"
- IFS=" "
- read -a deb_build_for_arr <<< "${DEB_BUILD_FOR}"
- IFS="${OLDIFS}"
-
- typeset line=""
- for line in "${deb_build_for_arr[@]}"; do
- l_DIST="$(cut -d":" -f1 <<< "${line/: /:}" | tr [:upper:] [:lower:])"
- l_CODENAMES="${CODENAMES:-$(cut -d":" -f2- <<< "${line/: /:}" | sed -e 's/,/ /g' | tr [:upper:] [:lower:])}"
- grep -qs "${l_DIST}" <<< "${DEB_DISTS_SUPPORTED}" && {
- 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}" || grep "${CODENAMES}" <<< "${line}" || break
-
- TEMP_DIR="$(mktemp -d --tmpdir=${TEMP_BASE})"
- temp_cleanup+=("${TEMP_DIR}")
- mkdir -p -- "${TEMP_DIR}/${PROJECT}"
- chmod 2770 -Rf -- "${TEMP_DIR}"
-
- cd "${PROJECT_DIR}"
- git clone "${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 -qs "${PROJECT}_"*.orig.tar.gz && cp -- "${PROJECT_DIR}/../${PROJECT}_"*.orig.tar.gz ..
- GITREV="$(gitrevno)"
-
- # we always build native packages for our repos
- SA_OPTION=""
- test -f "debian/source/format" && grep -Eqs '^3.0.*\(quilt\)$' "debian/source/format" && {
- git fetch origin upstream:upstream
- UPSTREAM_VERSION="$(dpkg-parsechangelog | grep "Version:" | cut -d " " -f2 | sed -e 's/-.*//' -e 's/^.*://')"
- REVISION="$(dpkg-parsechangelog | grep "Version:" | cut -d " " -f2 | sed -e 's/.*-//')"
- git archive --prefix="${PROJECT}-${UPSTREAM_VERSION}/" -o "../${PROJECT}_${UPSTREAM_VERSION}.orig.tar.gz" "upstream/${UPSTREAM_VERSION}" && {
- SA_OPTION="--debbuildopts=-sa"
- } || echo "1.0" > "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" = "xjessie" ] && VERSION=testing
- #[ "x$l_CODENAME" = "xwheezy" ] && VERSION=stable
- #[ "x$l_CODENAME" = "xoldstable" ] && VERSION=oldstable
-
- # modify the section for non-main package builds
- [ "x${COMPONENT}" != "xmain" ] && {
- mv -- "debian/control" "debian/control.tmp"
- sed "s,Section:[\ ]*\(.*\),Section: ${COMPONENT}/\1,g" debian/control.tmp > debian/control
- }
-
- # modify changelog for this build
- if [ "${COMPONENT}" != "${COMPONENT_NIGHTLY}" ]; then
- dch --distribution "${VERSION}" --force-distribution -l "+git${DATE}.${GITREV}+${l_CODENAME}.${COMPONENT}." "Auto-built ${l_DIST} ${l_CODENAME} package for ${REPOS_SERVER} repository (Git commit: ${GIT_OBJECT_ID})."
- else
- dch --distribution "${VERSION}" --force-distribution -l "~git${DATE}.${GITREV}+${l_CODENAME}.${COMPONENT}." "Development-Snapshot!!! Auto-built ${l_DIST} ${l_CODENAME} package for ${REPOS_SERVER} repository (Git commit: ${GIT_OBJECT_ID})."
- fi
- mkdir -p -- "${PKGDIST}/${l_DIST}/${l_CODENAME}/"{amd64,i386}
- OTHERMIRROR=""
- if [ "x${COMPONENT}" = "x${COMPONENT_NIGHTLY}" ]; then
- grep -qs "${PROJECT}" <<< "${PACKAGE_WITHOUT_OTHERMIRROR}" || OTHERMIRROR="deb http://${REPOS_SERVER}/${l_DIST}-nightly ${l_CODENAME} ${COMPONENT_MAIN}"
- else
- grep "${PROJECT}" <<< "${PACKAGE_WITHOUT_OTHERMIRROR}" || OTHERMIRROR="deb http://${REPOS_SERVER}/${l_DIST} ${l_CODENAME} ${COMPONENT}"
- fi
- # create git changelog immediately prior to building the package
- git --no-pager log --since "2 years ago" --format="%ai %aN (%h) %n%n%x09*%w(68,0,10) %s%d%n" > ChangeLog.gitlog
-
- [ "x${USE_SUDO}" != "xyes" ] && {
- [ "x${EXTRA_ARCHS_ONLY}" = "x" ] && {
- [ "x${SKIP_ARCH}" != "xamd64" ] && grep -Eqs 'Architecture.*(all|any|amd64)' "debian/control" && {
- DIST="${l_DIST}" CODENAME="${l_CODENAME}" ARCH="amd64" nice ${PDEBUILD} --auto-debsign --debsign-k "${GPG_KEY}" --buildresult "${PKGDIST}/${l_DIST}/${l_CODENAME}/amd64" -- --allow-untrusted ${SA_OPTION} 0<&-
- }
- [ "x${SKIP_ARCH}" != "xi386" ] && grep -Eqs 'Architecture.*(any|i386)' "debian/control" && {
- DIST="${l_DIST}" CODENAME="${l_CODENAME}" ARCH="i386" nice ${PDEBUILD} --auto-debsign --debsign-k "${GPG_KEY}" --buildresult "${PKGDIST}/${l_DIST}/${l_CODENAME}/i386" -- --binary-arch --allow-untrusted ${SA_OPTION} 0<&-
- }
- }
- for extra_arch in ${EXTRA_ARCHS}; do
- mkdir -p -- "${PKGDIST}/${l_DIST}/${l_CODENAME}/${extra_arch}"
- grep -Eqs "Architecture.*(any|$extra_arch)" "debian/control" && {
- 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 --allow-untrusted ${SA_OPTION} 0<&-
- }
- done
- }
- [ "x${USE_SUDO}" = "xyes" ] && {
- [ "x${EXTRA_ARCHS_ONLY}" = "x" ] && {
- [ "x${SKIP_ARCH}" != "xamd64" ] && grep -Eqs 'Architecture.*(all|any|amd64)' "debian/control" && {
- nice 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" -- --allow-untrusted ${SA_OPTION} 0<&-
- }
- [ "x${SKIP_ARCH}" != "xi386" ] && grep -Eqs 'Architecture.*(any|i386)' "debian/control" && {
- nice 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 --allow-untrusted ${SA_OPTION} 0<&-
- }
- }
- for extra_arch in ${EXTRA_ARCHS}; do
- mkdir -p -- "${PKGDIST}/${l_DIST}/${l_CODENAME}/${extra_arch}"
- grep -Eqs "Architecture.*(any|$extra_arch)" "debian/control" && {
- nice 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 --allow-untrusted ${SA_OPTION} 0<&-
- }
- done
- }
- done
- }
- done
- return 0
-}
-
-upload_packages() {
- # dupload the new packages to the reprepro repository
-
- # Do NOT spawn a subshell here.
- # Allow changing global variables in the main process.
- typeset -a deb_build_for_arr
- typeset OLDIFS="${IFS}"
- IFS=" "
- read -a deb_build_for_arr <<< "${DEB_BUILD_FOR}"
- IFS="${OLDIFS}"
-
- typeset line=""
- for line in "${deb_build_for_arr[@]}"; do
- l_DIST="$(cut -d":" -f1 <<< "${line/: /:}" | tr [:upper:] [:lower:])"
- l_CODENAMES="${CODENAMES:-$(cut -d":" -f2- <<< "${line/: /:}" | sed -e 's/,/ /g' | 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}" || grep "${CODENAMES}" <<< "${line}" || 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 -- "${HOME}/.dupload.conf.${PREFIX}" "./dupload.conf"
- ls -- "${PROJECT}_"*.changes >/dev/null 2>&1 && 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 -- "${HOME}/.dupload.conf.${PREFIX}" "./dupload.conf"
- ls -- "${PROJECT}_"*.changes >/dev/null 2>&1 && dupload -c --to "${PREFIX}-${l_DIST}-${l_CODENAME}" "${PROJECT}_"*.changes 0<&-
- done
- done
- done
- return 0
-}
-
-wait_for_lock() {
- while [ -f "${LOCK_FILE}" ]; do
- pid="$(head -n1 "${LOCK_FILE}")"
- if ! ps "${pid}" 1>/dev/null; then
- rm -f -- "${LOCK_FILE}"
- else
- echo "PROJECT directory is locked, sleeping for 10 seconds..."
- sleep 10
- fi
- done
-}
-
-lock_workspace() {
- wait_for_lock
-
- echo "${$}" > "${LOCK_FILE}"
-}
-
-unlock_workspace() {
- rm -f -- "${LOCK_FILE}"
-}
-
-delay_build() {
- sleep $[ ( $RANDOM % 30 ) + 1 ]s
-}
-
-### MAIN ###
-set_vars "$@" && {
- if [ "x$(basename "${0}")" = "x${PREFIX}-build-deb-package" ] || [ "x$(basename "${0}")" = "x${PREFIX}-build+upload-deb-package" ]; then
- # Treat any value other than "no" and "0" as true.
- cd "${PROJECT_DIR}" && pkgneedsbuild "${CHECKOUT}" || ( [ "x${FORCE_BUILD}" != "xno" ] && [ "x${FORCE_BUILD}" != "x0" ] ) && {
- if [ "x${FORCE_BUILD}" != "xno" ] && [ "x${FORCE_BUILD}" != "x0" ] && ( [ "x${NO_DELAY}" = "xno" ] || [ "x${NO_DELAY}" = "x0" ] ); then
- delay_build
- fi
- lock_workspace
- prepare_workspace && {
- unlock_workspace
- clear_pkgdist
- build_packages
- }
- unlock_workspace
- }
- fi
- if [ "x$(basename "${0}")" = "x${PREFIX}-upload-deb-package" ] || [ "x$(basename "${0}")" = "x${PREFIX}-build+upload-deb-package" ]; then
- upload_packages
- fi
-}
+sbuild-deb-package \ No newline at end of file