Skip to content

Commit

Permalink
Add docker compose based testing
Browse files Browse the repository at this point in the history
Our release process documentation recommends getting passing tox
results on as many popular linux distributions as time allows. Doing
this by hand is cumbersome, redundant, and error prone.

Add a directory with a helper script that automates the entire process
using docker compose and document its use in MAINTAINERS.rst.

Signed-off-by: Martí Bolívar <[email protected]>
Signed-off-by: Pieter De Gendt <[email protected]>
  • Loading branch information
mbolivar-ampere authored and pdgendt committed Sep 12, 2024
1 parent 59bf95a commit 7d226d4
Show file tree
Hide file tree
Showing 13 changed files with 238 additions and 7 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@ shippable/
htmlcov/
.dir-locals.el
.venv/
docker-testing/outdir
29 changes: 22 additions & 7 deletions MAINTAINERS.rst
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,35 @@ Pre-release test plan

git checkout vX.Y-branch

1. Make tox happy on the following first-party platforms:
1. Make tox happy on the following first-party non-Linux platforms:

- Windows 10
- the latest macOS
- the latest Ubuntu LTS

2. Make tox happy on other popular Linux distributions as resources allow.
Doing this in a container is fine.
Do this by hand and check for any anomalous warnings in the output.
Do not just trust CI.

2. Make tox happy on other popular Linux distributions:

- Arch
- the latest Ubuntu release (if different than the latest LTS)
- Debian stable (if its Python 3 is still supported)
- the latest Ubuntu LTS release
- the latest Ubuntu development release
- Debian stable
- Debian testing
- Fedora
- the latest Fedora release
- the latest Fedora rawhide release

Automated infrastructure for doing this in docker is in the docker-testing
directory. Start by updating the Dockerfiles and compose.yaml in that
directory if any newer distribution versions should be tested.

Then, install docker compose in your host Linux environment and run::

cd docker-testing
./run-tests.sh

Make sure to check the tox.log files mentioned in the output for any
anomalous warnings.

3. Build alpha N (N=1 to start, then N=2 if you need more commits, etc.) and
upload to pypi. See "Building and uploading the release wheels" below for
Expand Down
7 changes: 7 additions & 0 deletions docker-testing/README.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
Docker based testing
--------------------

This directory contains helper files used for running west's tests in Docker on
various Linux runtimes. It was originally developed for release testing.

Run "./run-tests.sh" in this directory to run the tests.
9 changes: 9 additions & 0 deletions docker-testing/arch/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
FROM archlinux:latest
CMD ["/west/docker-testing/in-container-test.sh"]

RUN pacman -Syu --noconfirm \
git \
python-pip \
&& pacman -Scc --noconfirm

RUN pip3 install --break-system-packages tox
88 changes: 88 additions & 0 deletions docker-testing/compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
# It would be nicer to consolidate the common user/volumes
# boilerplate, but there wasn't enough time to figure out if it was
# possible at time of writing. Improvements welcome.

services:
west-arch:
build: arch
environment:
WEST_TOX_OUT: /west/docker-testing/outdir/arch
WEST_TOX_OUT_IN_HOST: ${WEST_IN_HOST}/docker-testing/outdir/arch

user: ${MY_UID}:${MY_GID}
volumes:
- /etc/passwd:/etc/passwd:ro
- /etc/group:/etc/group:ro
- ..:/west

west-debian-stable:
build: debian-stable
environment:
WEST_TOX_OUT: /west/docker-testing/outdir/debian-stable
WEST_TOX_OUT_IN_HOST: ${WEST_IN_HOST}/docker-testing/outdir/debian-stable

user: ${MY_UID}:${MY_GID}
volumes:
- /etc/passwd:/etc/passwd:ro
- /etc/group:/etc/group:ro
- ..:/west

west-debian-testing:
build: debian-testing
environment:
WEST_TOX_OUT: /west/docker-testing/outdir/debian-testing
WEST_TOX_OUT_IN_HOST: ${WEST_IN_HOST}/docker-testing/outdir/debian-testing

user: ${MY_UID}:${MY_GID}
volumes:
- /etc/passwd:/etc/passwd:ro
- /etc/group:/etc/group:ro
- ..:/west

west-fedora-latest:
build: fedora-latest
environment:
WEST_TOX_OUT: /west/docker-testing/outdir/fedora-latest
WEST_TOX_OUT_IN_HOST: ${WEST_IN_HOST}/docker-testing/outdir/fedora-latest

user: ${MY_UID}:${MY_GID}
volumes:
- /etc/passwd:/etc/passwd:ro
- /etc/group:/etc/group:ro
- ..:/west

west-fedora-rawhide:
build: fedora-rawhide
environment:
WEST_TOX_OUT: /west/docker-testing/outdir/fedora-rawhide
WEST_TOX_OUT_IN_HOST: ${WEST_IN_HOST}/docker-testing/outdir/fedora-rawhide

user: ${MY_UID}:${MY_GID}
volumes:
- /etc/passwd:/etc/passwd:ro
- /etc/group:/etc/group:ro
- ..:/west

west-ubuntu-latest:
build: ubuntu-latest
environment:
WEST_TOX_OUT: /west/docker-testing/outdir/ubuntu-latest
WEST_TOX_OUT_IN_HOST: ${WEST_IN_HOST}/docker-testing/outdir/ubuntu-latest

user: ${MY_UID}:${MY_GID}
volumes:
- /etc/passwd:/etc/passwd:ro
- /etc/group:/etc/group:ro
- ..:/west

west-ubuntu-devel:
build: ubuntu-devel
environment:
WEST_TOX_OUT: /west/docker-testing/outdir/ubuntu-devel
WEST_TOX_OUT_IN_HOST: ${WEST_IN_HOST}/docker-testing/outdir/ubuntu-devel

user: ${MY_UID}:${MY_GID}
volumes:
- /etc/passwd:/etc/passwd:ro
- /etc/group:/etc/group:ro
- ..:/west
10 changes: 10 additions & 0 deletions docker-testing/debian-stable/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
FROM debian:stable
CMD ["/west/docker-testing/in-container-test.sh"]

RUN apt-get update \
&& apt-get install -y \
git \
python3-pip \
&& rm -rf /var/lib/apt/lists/*

RUN pip3 install --break-system-packages tox
10 changes: 10 additions & 0 deletions docker-testing/debian-testing/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
FROM debian:testing
CMD ["/west/docker-testing/in-container-test.sh"]

RUN apt-get update \
&& apt-get install -y \
git \
python3-pip \
&& rm -rf /var/lib/apt/lists/*

RUN pip3 install --break-system-packages tox
9 changes: 9 additions & 0 deletions docker-testing/fedora-latest/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
FROM fedora:latest
CMD ["/west/docker-testing/in-container-test.sh"]

RUN dnf install -y \
git \
python3-pip \
&& dnf clean dbcache

RUN pip3 install tox
9 changes: 9 additions & 0 deletions docker-testing/fedora-rawhide/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
FROM fedora:rawhide
CMD ["/west/docker-testing/in-container-test.sh"]

RUN dnf install -y \
git \
python3-pip \
&& dnf clean dbcache

RUN pip3 install tox
39 changes: 39 additions & 0 deletions docker-testing/in-container-test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
#!/bin/bash
set -e

# This is the test script that runs in the containers themselves.

WEST=/west

die() {
if [ $# -eq 0 ]; then
echo "error: $*" >&2
else
echo "error: unknown error in $0"
fi
exit 1
}

main()
{
# Verify the container environment set up meets this script's requirements.
[ -n "$WEST_TOX_OUT" ] || die "missing $WEST_TOX_OUT"
[ -n "$WEST_TOX_OUT_IN_HOST" ] || die "missing $WEST_TOX_OUT_IN_HOST"
[ -d "$WEST" ] || die "missing $WEST in the container"

TOX_LOG="$WEST_TOX_OUT/tox.log"
TOX_LOG_IN_HOST="$WEST_TOX_OUT_IN_HOST/tox.log"
WEST_TESTDIR="/tmp/west"

mkdir "$WEST_TOX_OUT"

git clone -q "$WEST" "$WEST_TESTDIR" || die "failed to clone west to $WEST_TESTDIR in container"
cd "$WEST_TESTDIR"

echo "running tox, output in $TOX_LOG_IN_HOST in host"
tox run >"$TOX_LOG" 2>&1 || die "tox failed"

cp -R htmlcov "$WEST_TOX_OUT" || die "failed to copy coverage to $WEST_TOX_OUT_IN_HOST/htmlcov in host"
}

main "$@"
14 changes: 14 additions & 0 deletions docker-testing/run-tests.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
#!/bin/bash

# This is the top-level test script that runs in the host.

HERE=$(dirname "$0")

[ -d "$HERE/outdir" ] && rm -r "$HERE/outdir"

set -e
mkdir "$HERE/outdir"
export MY_UID=$(id -u)
export MY_GID=$(id -g)
export WEST_IN_HOST=$(realpath "$HERE/..")
docker-compose up --force-recreate --build
10 changes: 10 additions & 0 deletions docker-testing/ubuntu-devel/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
FROM ubuntu:devel
CMD ["/west/docker-testing/in-container-test.sh"]

RUN apt-get update \
&& apt-get install -y \
git \
python3-pip \
&& rm -rf /var/lib/apt/lists/*

RUN pip3 install --break-system-packages tox
10 changes: 10 additions & 0 deletions docker-testing/ubuntu-latest/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
FROM ubuntu:latest
CMD ["/west/docker-testing/in-container-test.sh"]

RUN apt-get update \
&& apt-get install -y \
git \
python3-pip \
&& rm -rf /var/lib/apt/lists/*

RUN pip3 install --break-system-packages tox

0 comments on commit 7d226d4

Please sign in to comment.