aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOtto Kekäläinen <otto@debian.org>2024-01-10 22:38:48 +0800
committerOtto Kekäläinen <otto@debian.org>2024-01-13 23:11:28 -0800
commit13f52052db1263667703423ff806bda975367efe (patch)
treeca7c9d3e0f5f490fd1caf5f1f4f7cfa70bba715e
parent42c3e15fb4b48458b29b7e63e43f7dcc3f456a96 (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--.gitignore1
-rwxr-xr-xpackaging/run-in-docker43
2 files changed, 29 insertions, 15 deletions
diff --git a/.gitignore b/.gitignore
index dcf6b220..924d020b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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;;