diff options
author | rubicks <naroza@gmail.com> | 2017-12-30 18:17:06 +0000 |
---|---|---|
committer | Guido Günther <agx@sigxcpu.org> | 2018-01-12 13:15:48 +0100 |
commit | f1694df5c8948fbe3866fdfb92c947a2d380e640 (patch) | |
tree | 914a00e7fa34e1f6dcd4a7f41e875b7dc44c0ac4 | |
parent | e36592d4b8c37756100dddbe0d6a1332bf31d57f (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.yml | 2 | ||||
-rw-r--r-- | HACKING | 5 | ||||
-rwxr-xr-x | packaging/run-in-docker | 127 | ||||
-rwxr-xr-x | tests/helpers/run-in-docker | 34 |
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 @@ -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 - |