From e6b30141ec1598ebbd7efec950e57e018bb2216a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Bol=C3=ADvar?= Date: Wed, 27 Sep 2023 12:51:36 -0700 Subject: [PATCH 1/2] tox.ini: generate HTML coverage output MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This makes it trivial to inspect, line by line, what got covered. That is useful when evaluating coverage for a new feature. Signed-off-by: Martí Bolívar --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 7983960c..d342a56f 100644 --- a/tox.ini +++ b/tox.ini @@ -37,6 +37,6 @@ setenv = # For instance: ./.tox/py3/tmp/ TOXTEMPDIR={envtmpdir} commands = - python -m pytest --cov=west {posargs:tests} --basetemp='{envtmpdir}/pytest with space/' + python -m pytest --cov-report=html --cov=west {posargs:tests} --basetemp='{envtmpdir}/pytest with space/' python -m flake8 --config='{toxinidir}'/tox.ini '{toxinidir}' python -m mypy --config-file='{toxinidir}'/tox.ini --package=west From 89e9dc8c958e59c160cb4c59045697669956a9ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Bol=C3=ADvar?= Date: Wed, 27 Sep 2023 12:51:15 -0700 Subject: [PATCH 2/2] Add docker compose based testing MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 Signed-off-by: Pieter De Gendt --- .gitignore | 1 + MAINTAINERS.rst | 29 ++++++++++---- docker-testing/README.rst | 7 ++++ docker-testing/arch/Dockerfile | 13 ++++++ docker-testing/compose.yaml | 62 +++++++++++++++++++++++++++++ docker-testing/debian/Dockerfile | 14 +++++++ docker-testing/fedora/Dockerfile | 13 ++++++ docker-testing/in-container-test.sh | 44 ++++++++++++++++++++ docker-testing/run-tests.sh | 16 ++++++++ 9 files changed, 192 insertions(+), 7 deletions(-) create mode 100644 docker-testing/README.rst create mode 100644 docker-testing/arch/Dockerfile create mode 100644 docker-testing/compose.yaml create mode 100644 docker-testing/debian/Dockerfile create mode 100644 docker-testing/fedora/Dockerfile create mode 100755 docker-testing/in-container-test.sh create mode 100755 docker-testing/run-tests.sh diff --git a/.gitignore b/.gitignore index 2a9df372..bd34b8f8 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,4 @@ shippable/ htmlcov/ .dir-locals.el .venv/ +docker-testing/outdir diff --git a/MAINTAINERS.rst b/MAINTAINERS.rst index b6877b3b..46a7870f 100644 --- a/MAINTAINERS.rst +++ b/MAINTAINERS.rst @@ -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 diff --git a/docker-testing/README.rst b/docker-testing/README.rst new file mode 100644 index 00000000..d2d1ec5f --- /dev/null +++ b/docker-testing/README.rst @@ -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. diff --git a/docker-testing/arch/Dockerfile b/docker-testing/arch/Dockerfile new file mode 100644 index 00000000..6839a50f --- /dev/null +++ b/docker-testing/arch/Dockerfile @@ -0,0 +1,13 @@ +ARG TARGET + +FROM ${TARGET} + +ARG TARGET +ENV WEST_TARGET=${TARGET} + +RUN pacman -Syu --noconfirm \ + git \ + python-pip \ + && pacman -Scc --noconfirm + +RUN pip3 install --break-system-packages tox diff --git a/docker-testing/compose.yaml b/docker-testing/compose.yaml new file mode 100644 index 00000000..889a5e45 --- /dev/null +++ b/docker-testing/compose.yaml @@ -0,0 +1,62 @@ +# SPDX-License-Identifier: Apache-2.0 + +x-common: &common + user: ${MY_UID}:${MY_GID} + volumes: + - /etc/passwd:/etc/passwd:ro + - /etc/group:/etc/group:ro + - ..:/west + command: /west/docker-testing/in-container-test.sh + environment: + WEST_TOX_OUT: /west/docker-testing/outdir + WEST_TOX_OUT_IN_HOST: ${WEST_IN_HOST}/docker-testing/outdir + +services: + west-archlinux-latest: + <<: *common + build: + args: + TARGET: archlinux:latest + dockerfile: arch/Dockerfile + + west-debian-stable: + <<: *common + build: + args: + TARGET: debian:stable + dockerfile: debian/Dockerfile + + west-debian-testing: + <<: *common + build: + args: + TARGET: debian:testing + dockerfile: debian/Dockerfile + + west-fedora-latest: + <<: *common + build: + args: + TARGET: fedora:latest + dockerfile: fedora/Dockerfile + + west-fedora-rawhide: + <<: *common + build: + args: + TARGET: fedora:rawhide + dockerfile: fedora/Dockerfile + + west-ubuntu-latest: + <<: *common + build: + args: + TARGET: ubuntu:latest + dockerfile: debian/Dockerfile + + west-ubuntu-devel: + <<: *common + build: + args: + TARGET: ubuntu:devel + dockerfile: debian/Dockerfile diff --git a/docker-testing/debian/Dockerfile b/docker-testing/debian/Dockerfile new file mode 100644 index 00000000..0135f33f --- /dev/null +++ b/docker-testing/debian/Dockerfile @@ -0,0 +1,14 @@ +ARG TARGET + +FROM ${TARGET} + +ARG TARGET +ENV WEST_TARGET=${TARGET} + +RUN apt-get update \ + && apt-get install -y \ + git \ + python3-pip \ + && rm -rf /var/lib/apt/lists/* + +RUN pip3 install --break-system-packages tox diff --git a/docker-testing/fedora/Dockerfile b/docker-testing/fedora/Dockerfile new file mode 100644 index 00000000..25a83fc5 --- /dev/null +++ b/docker-testing/fedora/Dockerfile @@ -0,0 +1,13 @@ +ARG TARGET + +FROM ${TARGET} + +ARG TARGET +ENV WEST_TARGET=${TARGET} + +RUN dnf install -y \ + git \ + python3-pip \ + && dnf clean dbcache + +RUN pip3 install tox diff --git a/docker-testing/in-container-test.sh b/docker-testing/in-container-test.sh new file mode 100755 index 00000000..026c43e7 --- /dev/null +++ b/docker-testing/in-container-test.sh @@ -0,0 +1,44 @@ +#!/bin/bash +set -e + +# This is the test script that runs in the containers themselves. + +WEST=/west +# Replace semicolon with dash +WEST_TARGET=${WEST_TARGET//:/-} + +WEST_TOX_OUT=$WEST_TOX_OUT/$WEST_TARGET +WEST_TOX_OUT_IN_HOST=$WEST_TOX_OUT_IN_HOST/$WEST_TARGET + +die() { + if [ $# -eq 0 ]; then + echo "error: $*" >&2 + else + echo "error: unknown error in $0" >&2 + 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, see $TOX_LOG" + + cp -R htmlcov "$WEST_TOX_OUT" || die "failed to copy coverage to $WEST_TOX_OUT_IN_HOST/htmlcov in host" +} + +main "$@" diff --git a/docker-testing/run-tests.sh b/docker-testing/run-tests.sh new file mode 100755 index 00000000..0c58f312 --- /dev/null +++ b/docker-testing/run-tests.sh @@ -0,0 +1,16 @@ +#!/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/..") +# Store the final config as reference +docker-compose config > $HERE/outdir/config.yml +docker-compose up --force-recreate --build