diff options
author | Otto Kekäläinen <otto@debian.org> | 2024-01-10 22:38:48 +0800 |
---|---|---|
committer | Otto Kekäläinen <otto@debian.org> | 2024-01-13 23:11:28 -0800 |
commit | 13f52052db1263667703423ff806bda975367efe (patch) | |
tree | ca7c9d3e0f5f490fd1caf5f1f4f7cfa70bba715e | |
parent | 42c3e15fb4b48458b29b7e63e43f7dcc3f456a96 (diff) |
tests: Implement 'run-in-docker -c docker'
Typically developers have either Docker or Podman on their laptops for
running containers. As Podman follows nearly identical syntax as Docker,
add new option '-c' that allows to specify Podman or Docker as the
container command, with Podman being default if nothing is defined as
the main developer is using Podman.
Also ignore log files both in .gitignore and resulting .dockerignore so
that tests runs can be logged with 'tee x.log' without triggering
rebuilds of the container via polluting the 'COPY . .' step.
-rw-r--r-- | .gitignore | 1 | ||||
-rwxr-xr-x | packaging/run-in-docker | 43 |
2 files changed, 29 insertions, 15 deletions
@@ -12,6 +12,7 @@ nosetests.xml *.sw? \#*# .#* +*.log docs/*.1 docs/*.5 diff --git a/packaging/run-in-docker b/packaging/run-in-docker index 9fdaf2fc..9a3a2ef4 100755 --- a/packaging/run-in-docker +++ b/packaging/run-in-docker @@ -10,13 +10,14 @@ debian_tag="${DEBIAN_TAG:-sid}" usage() { cat << EOF -Usage: $(basename ${this}) [OPTION]... [ACTION] -Run tests or create package in a docker container +Usage: $(basename "${this}") [OPTION]... [ACTION] +Run tests or create package in a podman (or 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}) + -c CONTAINER_CMD container runner command (default: podman) Actions: help print this usage and exit @@ -31,10 +32,11 @@ 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} \ +# shellcheck disable=SC2068 # re-splitting command arguments intentional +container_build() { + ${container_cmd} build \ + --force-rm="${DOCKER_BUILD_FORCE_RM:-false}" \ + --no-cache="${DOCKER_BUILD_NO_CACHE:-false}" \ ${@} } @@ -55,7 +57,7 @@ ${this##${PWD}/} .git* EOF ) >${project_dir}/.dockerignore - docker_build \ + container_build \ --pull=${DOCKER_BUILD_PULL:-false} \ --build-arg=FROM_IMAGE=debian:${debian_tag} \ -t gbp-base:${debian_tag} -f- ${project_dir} <<'EOF' @@ -80,7 +82,8 @@ EOF 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' + ${container_cmd} run --rm -ie"TEST_LOCALE=${L}" \ + "gbp-base:${debian_tag}" sh <<'EOF' set -euvx make all+net make -C docs @@ -91,16 +94,16 @@ EOF # 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' + container_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 + ${container_cmd} 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) {} + \ @@ -108,17 +111,27 @@ find .. -maxdepth 1 -mindepth 1 -type f \ EOF } -while getopts ":hC:t:" opt; do +while getopts ":hC:t:c:" 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}";; + c) container_cmd="${OPTARG}";; :) die "missing argument: -${OPTARG}";; \?) die "bad option: -${OPTARG}";; esac done +# Set default container command +container_cmd="${container_cmd:-podman}" + +# Set default container command value if none set +case "${container_cmd}" in + docker|podman) ;; + *) die "container command is expected to be one of 'docker' or 'podman'" ;; +esac + shift $((${OPTIND} - 1)) case "${1:-test}" in 'help') usage; exit 0;; |