summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorrubicks <naroza@gmail.com>2017-12-30 18:17:06 +0000
committerGuido Günther <agx@sigxcpu.org>2018-01-12 13:15:48 +0100
commitf1694df5c8948fbe3866fdfb92c947a2d380e640 (patch)
tree914a00e7fa34e1f6dcd4a7f41e875b7dc44c0ac4
parente36592d4b8c37756100dddbe0d6a1332bf31d57f (diff)
Rework docker script to allow to build packages as well
Move `tests/helpers/run-in-docker` to `packaging/run-in-docker` and add package option to build gbp packages in a docker container.
-rw-r--r--.travis.yml2
-rw-r--r--HACKING5
-rwxr-xr-xpackaging/run-in-docker127
-rwxr-xr-xtests/helpers/run-in-docker34
4 files changed, 131 insertions, 37 deletions
diff --git a/.travis.yml b/.travis.yml
index daac2b50..59101856 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -17,4 +17,4 @@ install: "pip install -r dev_requirements.txt"
script:
- flake8
- python $(which nosetests) -v tests/doctests/ tests/component/deb/
- - tests/helpers/run-in-docker
+ - packaging/run-in-docker
diff --git a/HACKING b/HACKING
index 69a30961..877d73c7 100644
--- a/HACKING
+++ b/HACKING
@@ -17,8 +17,9 @@ other tests use:
make all+net
-You can run the tests in a debian/sid docker container by using
-tests/helpers/run-in-docker.
+You can run the tests in a `debian:sid` docker container by using
+
+ packaging/run-in-docker
Building the API Docs
---------------------
diff --git a/packaging/run-in-docker b/packaging/run-in-docker
new file mode 100755
index 00000000..182f820d
--- /dev/null
+++ b/packaging/run-in-docker
@@ -0,0 +1,127 @@
+#!/bin/sh
+
+set -eu
+
+this="$(readlink -e ${0})"
+
+# assign defaults
+project_dir="$(dirname $(dirname ${this}))"
+debian_tag="${DEBIAN_TAG:-sid}"
+
+usage() {
+ cat << EOF
+Usage: $(basename ${this}) [OPTION]... [ACTION]
+Run tests or create package in a docker container
+
+Options:
+ -h print this usage and exit
+ -C PROJECT_DIR change to PROJECT_DIR (default: ${project_dir})
+ -t DEBIAN_TAG debian release tag (default: ${debian_tag})
+
+Actions:
+ help print this usage and exit
+ package create debian package artifacts
+ test run tests (default)
+
+Example:
+ $(basename ${this}) -C ~/code/git-buildpackage -t stretch package
+EOF
+}
+
+die() { { echo "ERROR: ${@}"; usage; } >&2; exit 1; }
+
+# convenience wrapper
+docker_build() {
+ docker build \
+ --force-rm=${DOCKER_BUILD_FORCE_RM:-false} \
+ --no-cache=${DOCKER_BUILD_NO_CACHE:-false} \
+ ${@}
+}
+
+# take path to project dir; build docker image for base
+base_build() {
+ (
+ cd ${project_dir}
+ [ -f .gitignore ] && cat .gitignore
+ [ -f .gitmodules ] && sed -nr 's|\s+path = (.+)|\1|gp' .gitmodules
+ cat <<EOF
+${this##${PWD}/}
+*.buildinfo
+*.changes
+*.deb
+*.dsc
+*.tar.xz
+.dockerignore
+.git*
+EOF
+ ) >${project_dir}/.dockerignore
+ docker_build \
+ --pull=${DOCKER_BUILD_PULL:-false} \
+ --build-arg=FROM_IMAGE=debian:${debian_tag} \
+ -t gbp-base:${debian_tag} -f- ${project_dir} <<'EOF'
+arg FROM_IMAGE
+from ${FROM_IMAGE}
+env DEBIAN_FRONTEND=noninteractive DEBCONF_NONINTERACTIVE_SEEN=true
+workdir /workdir/project
+run set -euvx \
+ && apt-get update -y \
+ && apt-get -y --no-install-recommends install \
+ build-essential devscripts equivs
+copy . .
+run yes | mk-build-deps -ir
+run groupadd luser && useradd -g luser luser && chown -R luser:luser ..
+user luser
+EOF
+ rm -vf ${project_dir}/.dockerignore
+}
+
+
+# run tests
+gbp_test() {
+ base_build
+ for L in C.UTF-8 C; do
+ docker run --rm -ie"TEST_LOCALE=${L}" gbp-base:${debian_tag} sh <<'EOF'
+set -euvx
+make all+net
+EOF
+ done
+}
+
+# create debian package artifacts, copy to host
+gbp_package() {
+ base_build
+ docker_build \
+ --build-arg=FROM_IMAGE=gbp-base:${debian_tag} \
+ -t gbp-package:${debian_tag} -f- ${project_dir} <<'EOF'
+arg FROM_IMAGE
+from ${FROM_IMAGE}
+run dpkg-buildpackage -j$(nproc) -sa -us -uc
+EOF
+ docker run --rm -iu0:0 \
+ --mount type=bind,source="${PWD}",target=/mnt/host-volume \
+ gbp-package:${debian_tag} sh <<EOF
+set -euvx
+find .. -maxdepth 1 -mindepth 1 -type f \
+ -exec chown -v $(id -u):$(id -g) {} + \
+ -a -exec cp -vat /mnt/host-volume {} +
+EOF
+}
+
+while getopts ":hC:t:" opt; do
+ case $opt in
+ h) usage; exit 0;;
+ C) project_dir="$(readlink -e ${OPTARG})"
+ [ -d "${project_dir}" ] || die "bad project dir ${OPTARG}";;
+ t) debian_tag="${OPTARG}";;
+ :) die "missing argument: -${OPTARG}";;
+ \?) die "bad option: -${OPTARG}";;
+ esac
+done
+
+shift $((${OPTIND} - 1))
+case "${1:-test}" in
+ 'help') usage; exit 0;;
+ 'test') gbp_test; exit ${?};;
+ 'package') gbp_package; exit ${?};;
+ \?) die "bad action: ${1}";;
+esac
diff --git a/tests/helpers/run-in-docker b/tests/helpers/run-in-docker
deleted file mode 100755
index 7d6a1232..00000000
--- a/tests/helpers/run-in-docker
+++ /dev/null
@@ -1,34 +0,0 @@
-#!/bin/sh
-
-set -eu
-
-echo $(pwd)
-cat >Dockerfile <<EOF
-FROM debian:sid
-ENV DEBIAN_FRONTEND=noninteractive
-RUN echo "deb http://ftp.de.debian.org/debian sid main" > /etc/apt/sources.list
-RUN echo "deb-src http://ftp.de.debian.org/debian sid main" >> /etc/apt/sources.list
-RUN apt-get update && apt-get dist-upgrade --yes
-RUN apt-get install -y --no-install-recommends build-essential adduser
-RUN adduser gbp --disabled-password --gecos='gbp docker test user' --shell=/bin/bash --home /git-buildpackage
-
-WORKDIR /git-buildpackage
-COPY . .
-RUN chown -R gbp: .
-
-RUN apt-get -y build-dep .
-# Run as non root so permision tests pass
-CMD su -c "make all+net" gbp
-EOF
-
-CIDFILE="$(mktemp --dry-run)"
-TAG="git-buildpackage/sid"
-echo "Building Docker image ${TAG}"
-docker build . --tag=${TAG}
-
-for L in C.UTF-8 C; do
- docker run --cidfile=${CIDFILE} -e "TEST_LOCALE=${L}" ${TAG}
- docker rm "$(cat ${CIDFILE})" >/dev/null
- rm -f ${CIDFILE}
-done
-