* [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests
@ 2016-03-17 6:34 Fam Zheng
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 01/13] tests: Add utilities for docker testing Fam Zheng
` (14 more replies)
0 siblings, 15 replies; 25+ messages in thread
From: Fam Zheng @ 2016-03-17 6:34 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, jsnow, stefanha, sw, Paolo Bonzini,
Alex Bennée, david
v4: Dropped the .gitignore patch in favor of tempfile [Alex];
Added one EXTRA_CONFIGURE_OPTS patch [Alex];
01: Fix commit message, and improve help text;
Fix pylint warnings, mostly long lines and some refactoring;
"--verbose" is now replaced with the shared args "--quiet";
02: Update commit message;
Use "--quiet", drop "--verbose";
Fix typo;
05: Mention "build_qemu" in commit message;
Add Alex's rev-by;
10: Fix stale commit message;
Add Alex's rev-by to v3 except above.
This series adds a new "docker" make target family to run tests in created
docker containers.
To begin with, this can be a place to store standard env/command combinations to
build and test QEMU.
Secondly, CI usually provides "docker" capability, where we specify
standard/repeatable test environments, and run tests in them. However, what
tests to cover is better maintained in-tree, in order to keep in sync with the
code development.
Lastly, this makes it very simple for developers to replicate such tests
themselves.
Fam Zheng (13):
tests: Add utilities for docker testing
Makefile: Rules for docker testing
docker: Add images
docker: Add test runner
docker: Add common.rc
docker: Add quick test
docker: Add full test
docker: Add clang test
docker: Add mingw test
docker: Add travis tool
docs: Add text for tests/docker in build-system.txt
docker: Add EXTRA_CONFIGURE_OPTS
MAINTAINERS: Add tests/docker
MAINTAINERS | 7 ++
Makefile | 4 +-
docs/build-system.txt | 5 +
tests/docker/Makefile.include | 124 +++++++++++++++++++++
tests/docker/common.rc | 32 ++++++
tests/docker/docker.py | 191 ++++++++++++++++++++++++++++++++
tests/docker/dockerfiles/centos6.docker | 6 +
tests/docker/dockerfiles/fedora.docker | 7 ++
tests/docker/dockerfiles/ubuntu.docker | 11 ++
tests/docker/run | 58 ++++++++++
tests/docker/test-clang | 25 +++++
tests/docker/test-full | 17 +++
tests/docker/test-mingw | 34 ++++++
tests/docker/test-quick | 19 ++++
tests/docker/travis | 21 ++++
tests/docker/travis.py | 48 ++++++++
16 files changed, 608 insertions(+), 1 deletion(-)
create mode 100644 tests/docker/Makefile.include
create mode 100755 tests/docker/common.rc
create mode 100755 tests/docker/docker.py
create mode 100644 tests/docker/dockerfiles/centos6.docker
create mode 100644 tests/docker/dockerfiles/fedora.docker
create mode 100644 tests/docker/dockerfiles/ubuntu.docker
create mode 100755 tests/docker/run
create mode 100755 tests/docker/test-clang
create mode 100755 tests/docker/test-full
create mode 100755 tests/docker/test-mingw
create mode 100755 tests/docker/test-quick
create mode 100755 tests/docker/travis
create mode 100755 tests/docker/travis.py
--
2.4.3
^ permalink raw reply [flat|nested] 25+ messages in thread
* [Qemu-devel] [PATCH v4 01/13] tests: Add utilities for docker testing
2016-03-17 6:34 [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
@ 2016-03-17 6:34 ` Fam Zheng
2016-03-31 9:47 ` Alex Bennée
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 02/13] Makefile: Rules " Fam Zheng
` (13 subsequent siblings)
14 siblings, 1 reply; 25+ messages in thread
From: Fam Zheng @ 2016-03-17 6:34 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, jsnow, stefanha, sw, Paolo Bonzini,
Alex Bennée, david
docker.py is added with a number of useful subcommands to manager docker
images and instances for QEMU docker testing. Subcommands are:
run: A wrapper of "docker run" (or "sudo -n docker run" if necessary),
which takes care of killing and removing the running container at
SIGINT.
clean: Tear down all the containers including inactive ones that are
started by docker_run.
build: Compare an image from given dockerfile and rebuild it if they're
different.
Signed-off-by: Fam Zheng <famz@redhat.com>
---
tests/docker/docker.py | 191 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 191 insertions(+)
create mode 100755 tests/docker/docker.py
diff --git a/tests/docker/docker.py b/tests/docker/docker.py
new file mode 100755
index 0000000..fe73de7
--- /dev/null
+++ b/tests/docker/docker.py
@@ -0,0 +1,191 @@
+#!/usr/bin/env python2
+#
+# Docker controlling module
+#
+# Copyright (c) 2016 Red Hat Inc.
+#
+# Authors:
+# Fam Zheng <famz@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2
+# or (at your option) any later version. See the COPYING file in
+# the top-level directory.
+
+import os
+import sys
+import subprocess
+import json
+import hashlib
+import atexit
+import uuid
+import argparse
+import tempfile
+
+def _text_checksum(text):
+ """Calculate a digest string unique to the text content"""
+ return hashlib.sha1(text).hexdigest()
+
+def _guess_docker_command():
+ """ Guess a working docker command or raise exception if not found"""
+ commands = [["docker"], ["sudo", "-n", "docker"]]
+ for cmd in commands:
+ if subprocess.call(cmd + ["images"],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE) == 0:
+ return cmd
+ commands_txt = "\n".join([" " + " ".join(x) for x in commands])
+ raise Exception("Cannot find working docker command. Tried:\n%s" % \
+ commands_txt)
+
+class Docker(object):
+ """ Running Docker commands """
+ def __init__(self):
+ self._command = _guess_docker_command()
+ self._instances = []
+ atexit.register(self._kill_instances)
+
+ def _do(self, cmd, quiet=True, **kwargs):
+ if quiet:
+ kwargs["stdout"] = subprocess.PIPE
+ return subprocess.call(self._command + cmd, **kwargs)
+
+ def _do_kill_instances(self, only_known, only_active=True):
+ cmd = ["ps", "-q"]
+ if not only_active:
+ cmd.append("-a")
+ for i in self._output(cmd).split():
+ resp = self._output(["inspect", i])
+ labels = json.loads(resp)[0]["Config"]["Labels"]
+ active = json.loads(resp)[0]["State"]["Running"]
+ if not labels:
+ continue
+ instance_uuid = labels.get("com.qemu.instance.uuid", None)
+ if not instance_uuid:
+ continue
+ if only_known and instance_uuid not in self._instances:
+ continue
+ print "Terminating", i
+ if active:
+ self._do(["kill", i])
+ self._do(["rm", i])
+
+ def clean(self):
+ self._do_kill_instances(False, False)
+ return 0
+
+ def _kill_instances(self):
+ return self._do_kill_instances(True)
+
+ def _output(self, cmd, **kwargs):
+ return subprocess.check_output(self._command + cmd,
+ stderr=subprocess.STDOUT,
+ **kwargs)
+
+ def get_image_dockerfile_checksum(self, tag):
+ resp = self._output(["inspect", tag])
+ labels = json.loads(resp)[0]["Config"].get("Labels", {})
+ return labels.get("com.qemu.dockerfile-checksum", "")
+
+ def build_image(self, tag, dockerfile, df_path, quiet=True, argv=None):
+ if argv == None:
+ argv = []
+ tmp = dockerfile + "\n" + \
+ "LABEL com.qemu.dockerfile-checksum=%s" % \
+ _text_checksum(dockerfile)
+ dirname = os.path.dirname(df_path)
+ tmp_df = tempfile.NamedTemporaryFile(dir=dirname)
+ tmp_df.write(tmp)
+ tmp_df.flush()
+ self._do(["build", "-t", tag, "-f", tmp_df.name] + argv + \
+ [dirname],
+ quiet=quiet)
+
+ def image_matches_dockerfile(self, tag, dockerfile):
+ try:
+ checksum = self.get_image_dockerfile_checksum(tag)
+ except Exception:
+ return False
+ return checksum == _text_checksum(dockerfile)
+
+ def run(self, cmd, keep, quiet):
+ label = uuid.uuid1().hex
+ if not keep:
+ self._instances.append(label)
+ ret = self._do(["run", "--label",
+ "com.qemu.instance.uuid=" + label] + cmd,
+ quiet=quiet)
+ if not keep:
+ self._instances.remove(label)
+ return ret
+
+class SubCommand(object):
+ """A SubCommand template base class"""
+ name = None # Subcommand name
+ def shared_args(self, parser):
+ parser.add_argument("--quiet", action="store_true",
+ help="Run quietly unless an error occured")
+
+ def args(self, parser):
+ """Setup argument parser"""
+ pass
+ def run(self, args, argv):
+ """Run command.
+ args: parsed argument by argument parser.
+ argv: remaining arguments from sys.argv.
+ """
+ pass
+
+class RunCommand(SubCommand):
+ """Invoke docker run and take care of cleaning up"""
+ name = "run"
+ def args(self, parser):
+ parser.add_argument("--keep", action="store_true",
+ help="Don't remove image when command completes")
+ def run(self, args, argv):
+ return Docker().run(argv, args.keep, quiet=args.quiet)
+
+class BuildCommand(SubCommand):
+ """ Build docker image out of a dockerfile. Arguments: <tag> <dockerfile>"""
+ name = "build"
+ def args(self, parser):
+ parser.add_argument("tag",
+ help="Image Tag")
+ parser.add_argument("dockerfile",
+ help="Dockerfile name")
+
+ def run(self, args, argv):
+ dockerfile = open(args.dockerfile, "rb").read()
+ tag = args.tag
+
+ dkr = Docker()
+ if dkr.image_matches_dockerfile(tag, dockerfile):
+ if not args.quiet:
+ print "Image is up to date."
+ return 0
+
+ dkr.build_image(tag, dockerfile, args.dockerfile,
+ quiet=args.quiet, argv=argv)
+ return 0
+
+class CleanCommand(SubCommand):
+ """Clean up docker instances"""
+ name = "clean"
+ def run(self, args, argv):
+ Docker().clean()
+ return 0
+
+def main():
+ parser = argparse.ArgumentParser(description="A Docker helper",
+ usage="%s <subcommand> ..." % os.path.basename(sys.argv[0]))
+ subparsers = parser.add_subparsers(title="subcommands", help=None)
+ for cls in SubCommand.__subclasses__():
+ cmd = cls()
+ subp = subparsers.add_parser(cmd.name, help=cmd.__doc__)
+ cmd.shared_args(subp)
+ cmd.args(subp)
+ subp.set_defaults(cmdobj=cmd)
+ args, argv = parser.parse_known_args()
+ return args.cmdobj.run(args, argv)
+
+if __name__ == "__main__":
+ sys.exit(main())
--
2.4.3
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [PATCH v4 02/13] Makefile: Rules for docker testing
2016-03-17 6:34 [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 01/13] tests: Add utilities for docker testing Fam Zheng
@ 2016-03-17 6:34 ` Fam Zheng
2016-03-31 9:52 ` Alex Bennée
2016-03-31 10:32 ` Alex Bennée
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 03/13] docker: Add images Fam Zheng
` (12 subsequent siblings)
14 siblings, 2 replies; 25+ messages in thread
From: Fam Zheng @ 2016-03-17 6:34 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, jsnow, stefanha, sw, Paolo Bonzini,
Alex Bennée, david
This adds a group of make targets to run docker tests, all are available
in source tree without running ./configure.
The usage is shown with "make docker".
Besides the fixed ones, dynamic targets for building each image and
running each test in each image are generated automatically by make,
scanning $(SRC_PATH)/tests/docker/ files with specific patterns.
Alternative to manually list particular targets (docker-TEST@IMAGE)
set, you can control which tests/images to run by filtering variables,
TESTS= and IMAGES=, which are expressed in Makefile pattern syntax,
"foo% %bar ...". For example:
$ make docker-test IMAGES="ubuntu fedora"
Unfortunately, it's impossible to propagate "-j $JOBS" into make in
containers, however since each combination is made a first class target
in the top Makefile, "make -j$N docker-test" still parallels the tests
coarsely.
Still, $J is made a magic variable to let all make invocations in
containers to use -j$J.
Instead of providing a live version of the source tree to the docker
container we snapshot it with git-archive. This ensures the tree is in a
pristine state for whatever operations the container is going to run on
them.
Uncommitted changes known to files known by the git index will be
included in the snapshot if there are any.
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
Makefile | 4 +-
tests/docker/Makefile.include | 121 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 124 insertions(+), 1 deletion(-)
create mode 100644 tests/docker/Makefile.include
diff --git a/Makefile b/Makefile
index 1d076a9..554a3b1 100644
--- a/Makefile
+++ b/Makefile
@@ -6,7 +6,7 @@ BUILD_DIR=$(CURDIR)
# Before including a proper config-host.mak, assume we are in the source tree
SRC_PATH=.
-UNCHECKED_GOALS := %clean TAGS cscope ctags
+UNCHECKED_GOALS := %clean TAGS cscope ctags docker docker-%
# All following code might depend on configuration variables
ifneq ($(wildcard config-host.mak),)
@@ -651,3 +651,5 @@ endif
# Include automatically generated dependency files
# Dependencies in Makefile.objs files come from our recursive subdir rules
-include $(wildcard *.d tests/*.d)
+
+include $(SRC_PATH)/tests/docker/Makefile.include
diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include
new file mode 100644
index 0000000..033809a
--- /dev/null
+++ b/tests/docker/Makefile.include
@@ -0,0 +1,121 @@
+# Makefile for Docker tests
+
+$(if $(quiet-command),,$(eval include $(SRC_PATH)/rules.mak))
+
+.PHONY: docker docker-test docker-clean docker-image docker-qemu-src
+
+DOCKER_SUFFIX := .docker
+DOCKER_FILES_DIR := $(SRC_PATH)/tests/docker/dockerfiles
+DOCKER_IMAGES := $(notdir $(basename $(wildcard $(DOCKER_FILES_DIR)/*.docker)))
+DOCKER_TARGETS := $(patsubst %,docker-image-%,$(DOCKER_IMAGES))
+# Use a global constant ccache directory to speed up repetitive builds
+DOCKER_CCACHE_DIR := /var/tmp/qemu-docker-ccache
+
+DOCKER_TESTS := $(notdir $(shell \
+ find $(SRC_PATH)/tests/docker/ -name 'test-*' -type f -executable))
+
+DOCKER_TOOLS := travis
+
+TESTS ?= %
+IMAGES ?= %
+SRC_COPY := $(shell mktemp -u /tmp/qemu-src.XXXXX)
+
+# Make archive from git repo $1 to tar.gz $2
+make-archive-maybe = $(if $(wildcard $1/*), \
+ $(call quiet-command, \
+ (cd $1; if git diff-index --quiet HEAD -- &>/dev/null; then \
+ git archive -1 HEAD --format=tar.gz -o $2; \
+ else \
+ git archive -1 $$(git stash create) --format=tar.gz -o $2; \
+ fi), \
+ " ARCHIVE $(notdir $2)"))
+
+$(SRC_COPY):
+ @mkdir -p $@
+ $(call make-archive-maybe, $(SRC_PATH), $(SRC_COPY)/qemu.tgz)
+ $(call make-archive-maybe, $(SRC_PATH)/dtc, $(SRC_COPY)/dtc.tgz)
+ $(call make-archive-maybe, $(SRC_PATH)/pixman, $(SRC_COPY)/pixman.tgz)
+ $(call quiet-command, cp "$(SRC_PATH)/tests/docker/run" "$(SRC_COPY)/run", \
+ " COPY RUNNER")
+
+docker-qemu-src: $(SRC_COPY)
+
+docker-image: ${DOCKER_TARGETS}
+
+# General rule for building docker images
+docker-image-%: $(DOCKER_FILES_DIR)/%.docker
+ $(call quiet-command,\
+ $(SRC_PATH)/tests/docker/docker.py build qemu:$* $< \
+ $(if $V,,--quiet) $(if $(NOCACHE),--no-cache),\
+ " BUILD $*")
+
+# Expand all the pre-requistes for each docker image and test combination
+$(foreach i,$(DOCKER_IMAGES), \
+ $(foreach t,$(DOCKER_TESTS) $(DOCKER_TOOLS), \
+ $(eval .PHONY: docker-$t@$i) \
+ $(eval docker-$t@$i: docker-image-$i docker-run-$t@$i) \
+ ) \
+ $(foreach t,$(DOCKER_TESTS), \
+ $(eval docker-test: docker-$t@$i) \
+ ) \
+)
+
+docker:
+ @echo 'Build QEMU and run tests inside Docker containers'
+ @echo
+ @echo 'Available targets:'
+ @echo
+ @echo ' docker: Print this help.'
+ @echo ' docker-test: Run all image/test combinations.'
+ @echo ' docker-clean: Kill and remove residual docker testing containers.'
+ @echo ' docker-TEST@IMAGE: Run "TEST" in container "IMAGE".'
+ @echo ' Note: "TEST" is one of the listed test name,'
+ @echo ' or a script name under $$QEMU_SRC/tests/docker/;'
+ @echo ' "IMAGE" is one of the listed container name."'
+ @echo ' docker-image: Build all images.'
+ @echo ' docker-image-IMAGE: Build image "IMAGE".'
+ @echo
+ @echo 'Available container images:'
+ @echo ' $(DOCKER_IMAGES)'
+ @echo
+ @echo 'Available tests:'
+ @echo ' $(DOCKER_TESTS)'
+ @echo
+ @echo 'Available tools:'
+ @echo ' $(DOCKER_TOOLS)'
+ @echo
+ @echo 'Special variables:'
+ @echo ' TARGET_LIST=a,b,c Override target list in builds.'
+ @echo ' IMAGES="a b c ..": Filters which images to build or run.'
+ @echo ' TESTS="x y z .." Filters which tests to run (for docker-test).'
+ @echo ' J=[0..9]* Overrides the -jN parameter for make commands'
+ @echo ' (default is 1)'
+ @echo ' DEBUG=1 Stop and drop to shell in the created container'
+ @echo ' before running the command.'
+ @echo ' NOCACHE=1 Ignore cache when build images.'
+
+docker-run-%: CMD = $(shell echo '$@' | sed -e 's/docker-run-\([^@]*\)@\(.*\)/\1/')
+docker-run-%: IMAGE = $(shell echo '$@' | sed -e 's/docker-run-\([^@]*\)@\(.*\)/\2/')
+docker-run-%: docker-qemu-src
+ @if test -z "$(IMAGE)" || test -z "$(CMD)"; \
+ then echo "Invalid target"; exit 1; \
+ fi
+ $(if $(filter $(TESTS),$(CMD)),$(if $(filter $(IMAGES),$(IMAGE)), \
+ $(call quiet-command,\
+ $(SRC_PATH)/tests/docker/docker.py run $(if $V,,--rm) \
+ --privileged -t \
+ $(if $(DEBUG),-i,--net=none) \
+ -e TARGET_LIST=$(TARGET_LIST) \
+ -e V=$V -e J=$J -e DEBUG=$(DEBUG)\
+ -e CCACHE_DIR=/var/tmp/ccache \
+ -v $$(realpath $(SRC_COPY)):/var/tmp/qemu:ro \
+ -v $(DOCKER_CCACHE_DIR):/var/tmp/ccache \
+ -w /var/tmp/qemu \
+ qemu:$(IMAGE) \
+ $(if $V,/bin/bash -x ,) \
+ ./run \
+ $(CMD); \
+ , " RUN $(CMD) in $(IMAGE)")))
+
+docker-clean:
+ $(call quiet-command, $(SRC_PATH)/tests/docker/docker.py clean)
--
2.4.3
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [PATCH v4 03/13] docker: Add images
2016-03-17 6:34 [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 01/13] tests: Add utilities for docker testing Fam Zheng
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 02/13] Makefile: Rules " Fam Zheng
@ 2016-03-17 6:34 ` Fam Zheng
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 04/13] docker: Add test runner Fam Zheng
` (11 subsequent siblings)
14 siblings, 0 replies; 25+ messages in thread
From: Fam Zheng @ 2016-03-17 6:34 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, jsnow, stefanha, sw, Paolo Bonzini,
Alex Bennée, david
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Fam Zheng <famz@redhat.com>
---
tests/docker/dockerfiles/centos6.docker | 6 ++++++
tests/docker/dockerfiles/fedora.docker | 7 +++++++
tests/docker/dockerfiles/ubuntu.docker | 11 +++++++++++
3 files changed, 24 insertions(+)
create mode 100644 tests/docker/dockerfiles/centos6.docker
create mode 100644 tests/docker/dockerfiles/fedora.docker
create mode 100644 tests/docker/dockerfiles/ubuntu.docker
diff --git a/tests/docker/dockerfiles/centos6.docker b/tests/docker/dockerfiles/centos6.docker
new file mode 100644
index 0000000..8f4fe46
--- /dev/null
+++ b/tests/docker/dockerfiles/centos6.docker
@@ -0,0 +1,6 @@
+FROM centos:6
+RUN yum install -y \
+ tar git make gcc g++ \
+ zlib-devel glib2-devel SDL-devel pixman-devel \
+ epel-release
+RUN yum install -y libfdt-devel ccache
diff --git a/tests/docker/dockerfiles/fedora.docker b/tests/docker/dockerfiles/fedora.docker
new file mode 100644
index 0000000..6251e45
--- /dev/null
+++ b/tests/docker/dockerfiles/fedora.docker
@@ -0,0 +1,7 @@
+FROM fedora:23
+RUN dnf install -y \
+ ccache git tar \
+ glib2-devel pixman-devel zlib-devel SDL-devel libfdt-devel \
+ gcc gcc-c++ clang make perl which bc findutils \
+ mingw{32,64}-{pixman,glib2,gmp,SDL,pkg-config,gtk2,gtk3,gnutls,nettle,libtasn1,libjpeg-turbo,libpng,curl,libssh2,bzip2}
+ENV FEATURES mingw clang
diff --git a/tests/docker/dockerfiles/ubuntu.docker b/tests/docker/dockerfiles/ubuntu.docker
new file mode 100644
index 0000000..725a7ca
--- /dev/null
+++ b/tests/docker/dockerfiles/ubuntu.docker
@@ -0,0 +1,11 @@
+FROM ubuntu:14.04
+RUN echo "deb http://archive.ubuntu.com/ubuntu/ trusty universe multiverse" >> \
+ /etc/apt/sources.list
+RUN apt-get update
+RUN apt-get -y install \
+ libusb-1.0-0-dev libiscsi-dev librados-dev libncurses5-dev \
+ libseccomp-dev libgnutls-dev libssh2-1-dev libspice-server-dev \
+ libspice-protocol-dev libnss3-dev libfdt-dev \
+ libgtk-3-dev libvte-2.90-dev libsdl1.2-dev libpng12-dev libpixman-1-dev \
+ git make ccache python-yaml gcc clang sparse
+ENV FEATURES clang ccache pyyaml
--
2.4.3
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [PATCH v4 04/13] docker: Add test runner
2016-03-17 6:34 [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
` (2 preceding siblings ...)
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 03/13] docker: Add images Fam Zheng
@ 2016-03-17 6:34 ` Fam Zheng
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 05/13] docker: Add common.rc Fam Zheng
` (10 subsequent siblings)
14 siblings, 0 replies; 25+ messages in thread
From: Fam Zheng @ 2016-03-17 6:34 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, jsnow, stefanha, sw, Paolo Bonzini,
Alex Bennée, david
It's better to have a launcher for all tests, to make it easier to
initialize and manage the environment.
If "DEBUG=1" a shell prompt will show up before the test runs.
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Fam Zheng <famz@redhat.com>
---
tests/docker/run | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 58 insertions(+)
create mode 100755 tests/docker/run
diff --git a/tests/docker/run b/tests/docker/run
new file mode 100755
index 0000000..ec3d119
--- /dev/null
+++ b/tests/docker/run
@@ -0,0 +1,58 @@
+#!/bin/bash -e
+#
+# Docker test runner
+#
+# Copyright (c) 2016 Red Hat Inc.
+#
+# Authors:
+# Fam Zheng <famz@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2
+# or (at your option) any later version. See the COPYING file in
+# the top-level directory.
+
+# Prepare the environment
+. /etc/profile || true
+export PATH=/usr/lib/ccache:$PATH
+
+if test -n "$J"; then
+ export MAKEFLAGS="$MAKEFLAGS -j$J"
+fi
+
+# We are in the container so the whole file system belong to us
+export TEST_DIR=/tmp/qemu-test
+mkdir -p $TEST_DIR/{src,build,install}
+
+# Extract the source tarballs
+tar -C $TEST_DIR/src -xzf qemu.tgz
+for p in dtc pixman; do
+ if test -f $p.tgz; then
+ tar -C $TEST_DIR/src/$p -xzf $p.tgz
+ export FEATURES="$FEATURES $p"
+ fi
+done
+
+export QEMU_SRC="$TEST_DIR/src"
+
+cd "$QEMU_SRC/tests/docker"
+
+CMD="$QEMU_SRC/tests/docker/$@"
+
+if test -n "$DEBUG"; then
+ echo "* Prepared to run command:"
+ echo " $CMD"
+ echo "* Hit Ctrl-D to continue, or type 'exit 1' to abort"
+ echo
+ $SHELL
+fi
+
+if "$CMD"; then
+ exit 0
+elif test -n "$DEBUG"; then
+ echo "* Command failed:"
+ echo " $CMD"
+ echo "* Hit Ctrl-D to exit"
+ echo
+ # Force error after shell exits
+ $SHELL && exit 1
+fi
--
2.4.3
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [PATCH v4 05/13] docker: Add common.rc
2016-03-17 6:34 [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
` (3 preceding siblings ...)
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 04/13] docker: Add test runner Fam Zheng
@ 2016-03-17 6:34 ` Fam Zheng
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 06/13] docker: Add quick test Fam Zheng
` (9 subsequent siblings)
14 siblings, 0 replies; 25+ messages in thread
From: Fam Zheng @ 2016-03-17 6:34 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, jsnow, stefanha, sw, Paolo Bonzini,
Alex Bennée, david
"requires" checks the "FEATURE" environment for specified prerequisits,
and skip the execution of test if not found.
"build_qemu" is the central routine to compile QEMU for tests to call.
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Fam Zheng <famz@redhat.com>
---
tests/docker/common.rc | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
create mode 100755 tests/docker/common.rc
diff --git a/tests/docker/common.rc b/tests/docker/common.rc
new file mode 100755
index 0000000..74b89d6
--- /dev/null
+++ b/tests/docker/common.rc
@@ -0,0 +1,31 @@
+#!/bin/sh
+#
+# Common routines for docker test scripts.
+#
+# Copyright (c) 2016 Red Hat Inc.
+#
+# Authors:
+# Fam Zheng <famz@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2
+# or (at your option) any later version. See the COPYING file in
+# the top-level directory.
+
+requires()
+{
+ for c in $@; do
+ if ! echo "$FEATURES" | grep -wq -e "$c"; then
+ echo "Prerequisite '$c' not present, skip"
+ exit 0
+ fi
+ done
+}
+
+build_qemu()
+{
+ $QEMU_SRC/configure \
+ --target-list="${TARGET_LIST}" \
+ --prefix="$PWD/install" \
+ "$@"
+ make $MAKEFLAGS
+}
--
2.4.3
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [PATCH v4 06/13] docker: Add quick test
2016-03-17 6:34 [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
` (4 preceding siblings ...)
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 05/13] docker: Add common.rc Fam Zheng
@ 2016-03-17 6:34 ` Fam Zheng
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 07/13] docker: Add full test Fam Zheng
` (8 subsequent siblings)
14 siblings, 0 replies; 25+ messages in thread
From: Fam Zheng @ 2016-03-17 6:34 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, jsnow, stefanha, sw, Paolo Bonzini,
Alex Bennée, david
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Fam Zheng <famz@redhat.com>
---
tests/docker/test-quick | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)
create mode 100755 tests/docker/test-quick
diff --git a/tests/docker/test-quick b/tests/docker/test-quick
new file mode 100755
index 0000000..07cdc59
--- /dev/null
+++ b/tests/docker/test-quick
@@ -0,0 +1,19 @@
+#!/bin/bash -e
+#
+# Quick compiling test that everyone already does. But why not automate it?
+#
+# Copyright (c) 2016 Red Hat Inc.
+#
+# Authors:
+# Fam Zheng <famz@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2
+# or (at your option) any later version. See the COPYING file in
+# the top-level directory.
+
+. common.rc
+
+DEF_TARGET_LIST="$(echo {x86_64,aarch64}-softmmu)"
+TARGET_LIST=${TARGET_LIST:-$DEF_TARGET_LIST} \
+build_qemu
+make check $MAKEFLAGS
--
2.4.3
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [PATCH v4 07/13] docker: Add full test
2016-03-17 6:34 [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
` (5 preceding siblings ...)
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 06/13] docker: Add quick test Fam Zheng
@ 2016-03-17 6:34 ` Fam Zheng
2016-03-31 13:26 ` Alex Bennée
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 08/13] docker: Add clang test Fam Zheng
` (7 subsequent siblings)
14 siblings, 1 reply; 25+ messages in thread
From: Fam Zheng @ 2016-03-17 6:34 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, jsnow, stefanha, sw, Paolo Bonzini,
Alex Bennée, david
This builds all available targets.
Signed-off-by: Fam Zheng <famz@redhat.com>
---
tests/docker/test-full | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
create mode 100755 tests/docker/test-full
diff --git a/tests/docker/test-full b/tests/docker/test-full
new file mode 100755
index 0000000..fd9b798
--- /dev/null
+++ b/tests/docker/test-full
@@ -0,0 +1,17 @@
+#!/bin/bash -e
+#
+# Compile all the targets.
+#
+# Copyright (c) 2016 Red Hat Inc.
+#
+# Authors:
+# Fam Zheng <famz@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2
+# or (at your option) any later version. See the COPYING file in
+# the top-level directory.
+
+. common.rc
+
+build_qemu
+make check $MAKEFLAGS
--
2.4.3
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [PATCH v4 08/13] docker: Add clang test
2016-03-17 6:34 [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
` (6 preceding siblings ...)
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 07/13] docker: Add full test Fam Zheng
@ 2016-03-17 6:35 ` Fam Zheng
2016-03-31 13:29 ` Alex Bennée
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 09/13] docker: Add mingw test Fam Zheng
` (6 subsequent siblings)
14 siblings, 1 reply; 25+ messages in thread
From: Fam Zheng @ 2016-03-17 6:35 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, jsnow, stefanha, sw, Paolo Bonzini,
Alex Bennée, david
The (currently partially commented out) configure options are suggested
by John Snow <jsnow@redhat.com>.
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Fam Zheng <famz@redhat.com>
---
tests/docker/test-clang | 25 +++++++++++++++++++++++++
1 file changed, 25 insertions(+)
create mode 100755 tests/docker/test-clang
diff --git a/tests/docker/test-clang b/tests/docker/test-clang
new file mode 100755
index 0000000..7b5e65e
--- /dev/null
+++ b/tests/docker/test-clang
@@ -0,0 +1,25 @@
+#!/bin/bash -e
+#
+# Compile and check with clang.
+#
+# Copyright (c) 2016 Red Hat Inc.
+#
+# Authors:
+# Fam Zheng <famz@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2
+# or (at your option) any later version. See the COPYING file in
+# the top-level directory.
+
+. common.rc
+
+requires clang
+
+OPTS="--enable-debug --cxx=clang++ --cc=clang --host-cc=clang"
+# -fsanitize=undefined is broken on Fedora 23, skip it for now
+# See also: https://bugzilla.redhat.com/show_bug.cgi?id=1263834
+#OPTS="$OPTS --extra-cflags=-fsanitize=undefined \
+ #--extra-cflags=-fno-sanitize=float-divide-by-zero"
+TARGET_LIST=x86_64-softmmu,aarch64-softmmu
+build_qemu $OPTS
+make $MAKEFLAGS check
--
2.4.3
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [PATCH v4 09/13] docker: Add mingw test
2016-03-17 6:34 [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
` (7 preceding siblings ...)
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 08/13] docker: Add clang test Fam Zheng
@ 2016-03-17 6:35 ` Fam Zheng
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 10/13] docker: Add travis tool Fam Zheng
` (5 subsequent siblings)
14 siblings, 0 replies; 25+ messages in thread
From: Fam Zheng @ 2016-03-17 6:35 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, jsnow, stefanha, sw, Paolo Bonzini,
Alex Bennée, david
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Fam Zheng <famz@redhat.com>
---
tests/docker/test-mingw | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
create mode 100755 tests/docker/test-mingw
diff --git a/tests/docker/test-mingw b/tests/docker/test-mingw
new file mode 100755
index 0000000..c03757a
--- /dev/null
+++ b/tests/docker/test-mingw
@@ -0,0 +1,34 @@
+#!/bin/bash -e
+#
+# Cross compile QEMU with mingw toolchain on Linux.
+#
+# Copyright (c) 2016 Red Hat Inc.
+#
+# Authors:
+# Fam Zheng <famz@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2
+# or (at your option) any later version. See the COPYING file in
+# the top-level directory.
+
+. common.rc
+
+requires mingw dtc
+
+for prefix in x86_64-w64-mingw32- i686-w64-mingw32-; do
+ TARGET_LIST=x86_64-softmmu,aarch64-softmmu \
+ build_qemu --cross-prefix=$prefix \
+ --enable-trace-backends=simple \
+ --enable-debug \
+ --enable-gnutls \
+ --enable-nettle \
+ --enable-curl \
+ --enable-vnc \
+ --enable-bzip2 \
+ --enable-guest-agent \
+ --with-sdlabi=1.2 \
+ --with-gtkabi=2.0
+ make clean
+
+done
+
--
2.4.3
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [PATCH v4 10/13] docker: Add travis tool
2016-03-17 6:34 [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
` (8 preceding siblings ...)
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 09/13] docker: Add mingw test Fam Zheng
@ 2016-03-17 6:35 ` Fam Zheng
2016-03-31 13:14 ` Alex Bennée
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 11/13] docs: Add text for tests/docker in build-system.txt Fam Zheng
` (4 subsequent siblings)
14 siblings, 1 reply; 25+ messages in thread
From: Fam Zheng @ 2016-03-17 6:35 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, jsnow, stefanha, sw, Paolo Bonzini,
Alex Bennée, david
The script is not prefixed with test- so it won't run with "make docker-test",
because it can take too long.
Run it with "make docker-travis@ubuntu".
Signed-off-by: Fam Zheng <famz@redhat.com>
---
tests/docker/travis | 21 +++++++++++++++++++++
tests/docker/travis.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 69 insertions(+)
create mode 100755 tests/docker/travis
create mode 100755 tests/docker/travis.py
diff --git a/tests/docker/travis b/tests/docker/travis
new file mode 100755
index 0000000..d345393
--- /dev/null
+++ b/tests/docker/travis
@@ -0,0 +1,21 @@
+#!/bin/bash -e
+#
+# Mimic a travis testing matrix
+#
+# Copyright (c) 2016 Red Hat Inc.
+#
+# Authors:
+# Fam Zheng <famz@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2
+# or (at your option) any later version. See the COPYING file in
+# the top-level directory.
+
+. common.rc
+
+requires pyyaml
+cmdfile=/tmp/travis_cmd_list.sh
+$QEMU_SRC/tests/docker/travis.py $QEMU_SRC/.travis.yml > $cmdfile
+chmod +x $cmdfile
+cd "$QEMU_SRC"
+$cmdfile
diff --git a/tests/docker/travis.py b/tests/docker/travis.py
new file mode 100755
index 0000000..8dcc964
--- /dev/null
+++ b/tests/docker/travis.py
@@ -0,0 +1,48 @@
+#!/usr/bin/env python
+#
+# Travis YAML config parser
+#
+# Copyright (c) 2016 Red Hat Inc.
+#
+# Authors:
+# Fam Zheng <famz@redhat.com>
+#
+# This work is licensed under the terms of the GNU GPL, version 2
+# or (at your option) any later version. See the COPYING file in
+# the top-level directory.
+
+import sys
+import yaml
+import itertools
+
+def load_yaml(fname):
+ return yaml.load(open(fname, "r").read())
+
+def conf_iter(conf):
+ def env_to_list(env):
+ return env if isinstance(env, list) else [env]
+ global_env = conf["env"]["global"]
+ for entry in conf["matrix"]["include"]:
+ yield {"env": global_env + env_to_list(entry["env"]),
+ "compiler": entry["compiler"]}
+ for entry in itertools.product(conf["compiler"],
+ conf["env"]["matrix"]):
+ yield {"env": global_env + env_to_list(entry[1]),
+ "compiler": entry[0]}
+
+def main():
+ if len(sys.argv) < 2:
+ sys.stderr.write("Usage: %s <travis-file>\n" % sys.argv[0])
+ return 1
+ conf = load_yaml(sys.argv[1])
+ for config in conf_iter(conf):
+ print "("
+ print "\n".join(config["env"])
+ print "alias cc=" + config["compiler"]
+ print "\n".join(conf["before_script"])
+ print "\n".join(conf["script"])
+ print ")"
+ return 0
+
+if __name__ == "__main__":
+ sys.exit(main())
--
2.4.3
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [PATCH v4 11/13] docs: Add text for tests/docker in build-system.txt
2016-03-17 6:34 [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
` (9 preceding siblings ...)
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 10/13] docker: Add travis tool Fam Zheng
@ 2016-03-17 6:35 ` Fam Zheng
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 12/13] docker: Add EXTRA_CONFIGURE_OPTS Fam Zheng
` (3 subsequent siblings)
14 siblings, 0 replies; 25+ messages in thread
From: Fam Zheng @ 2016-03-17 6:35 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, jsnow, stefanha, sw, Paolo Bonzini,
Alex Bennée, david
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Fam Zheng <famz@redhat.com>
---
docs/build-system.txt | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/docs/build-system.txt b/docs/build-system.txt
index 5ddddea..2af1e66 100644
--- a/docs/build-system.txt
+++ b/docs/build-system.txt
@@ -438,6 +438,11 @@ top level Makefile, so anything defined in this file will influence the
entire build system. Care needs to be taken when writing rules for tests
to ensure they only apply to the unit test execution / build.
+- tests/docker/Makefile.include
+
+Rules for Docker tests. Like tests/Makefile, this file is included
+directly by the top level Makefile, anything defined in this file will
+influence the entire build system.
- po/Makefile
--
2.4.3
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [PATCH v4 12/13] docker: Add EXTRA_CONFIGURE_OPTS
2016-03-17 6:34 [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
` (10 preceding siblings ...)
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 11/13] docs: Add text for tests/docker in build-system.txt Fam Zheng
@ 2016-03-17 6:35 ` Fam Zheng
2016-03-31 13:20 ` Alex Bennée
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 13/13] MAINTAINERS: Add tests/docker Fam Zheng
` (2 subsequent siblings)
14 siblings, 1 reply; 25+ messages in thread
From: Fam Zheng @ 2016-03-17 6:35 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, jsnow, stefanha, sw, Paolo Bonzini,
Alex Bennée, david
Whatever passed in this variable will be appended to all
configure commands.
Signed-off-by: Fam Zheng <famz@redhat.com>
---
tests/docker/Makefile.include | 3 +++
tests/docker/common.rc | 1 +
2 files changed, 4 insertions(+)
diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include
index 033809a..4270a44 100644
--- a/tests/docker/Makefile.include
+++ b/tests/docker/Makefile.include
@@ -86,6 +86,8 @@ docker:
@echo
@echo 'Special variables:'
@echo ' TARGET_LIST=a,b,c Override target list in builds.'
+ @echo ' EXTRA_CONFIGURE_OPTS="..."'
+ @echo ' Extra configure options.'
@echo ' IMAGES="a b c ..": Filters which images to build or run.'
@echo ' TESTS="x y z .." Filters which tests to run (for docker-test).'
@echo ' J=[0..9]* Overrides the -jN parameter for make commands'
@@ -106,6 +108,7 @@ docker-run-%: docker-qemu-src
--privileged -t \
$(if $(DEBUG),-i,--net=none) \
-e TARGET_LIST=$(TARGET_LIST) \
+ -e EXTRA_CONFIGURE_OPTS=$(EXTRA_CONFIGURE_OPTS) \
-e V=$V -e J=$J -e DEBUG=$(DEBUG)\
-e CCACHE_DIR=/var/tmp/ccache \
-v $$(realpath $(SRC_COPY)):/var/tmp/qemu:ro \
diff --git a/tests/docker/common.rc b/tests/docker/common.rc
index 74b89d6..c493eeb 100755
--- a/tests/docker/common.rc
+++ b/tests/docker/common.rc
@@ -26,6 +26,7 @@ build_qemu()
$QEMU_SRC/configure \
--target-list="${TARGET_LIST}" \
--prefix="$PWD/install" \
+ $EXTRA_CONFIGURE_OPTS \
"$@"
make $MAKEFLAGS
}
--
2.4.3
^ permalink raw reply related [flat|nested] 25+ messages in thread
* [Qemu-devel] [PATCH v4 13/13] MAINTAINERS: Add tests/docker
2016-03-17 6:34 [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
` (11 preceding siblings ...)
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 12/13] docker: Add EXTRA_CONFIGURE_OPTS Fam Zheng
@ 2016-03-17 6:35 ` Fam Zheng
2016-03-28 2:37 ` [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
2016-05-03 8:20 ` Alex Bennée
14 siblings, 0 replies; 25+ messages in thread
From: Fam Zheng @ 2016-03-17 6:35 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, jsnow, stefanha, sw, Paolo Bonzini,
Alex Bennée, david
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Fam Zheng <famz@redhat.com>
---
MAINTAINERS | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/MAINTAINERS b/MAINTAINERS
index 87ddace..bf19027 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1617,3 +1617,10 @@ Build system architecture
M: Daniel P. Berrange <berrange@redhat.com>
S: Odd Fixes
F: docs/build-system.txt
+
+Docker testing
+--------------
+Docker based testing framework and cases
+M: Fam Zheng <famz@redhat.com>
+S: Maintained
+F: tests/docker/
--
2.4.3
^ permalink raw reply related [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests
2016-03-17 6:34 [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
` (12 preceding siblings ...)
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 13/13] MAINTAINERS: Add tests/docker Fam Zheng
@ 2016-03-28 2:37 ` Fam Zheng
2016-03-28 11:50 ` Alex Bennée
2016-05-03 8:20 ` Alex Bennée
14 siblings, 1 reply; 25+ messages in thread
From: Fam Zheng @ 2016-03-28 2:37 UTC (permalink / raw)
To: qemu-devel
Cc: kwolf, peter.maydell, sw, Alex Bennée, stefanha,
Paolo Bonzini, jsnow, david
Ping?
On Thu, 03/17 14:34, Fam Zheng wrote:
> v4: Dropped the .gitignore patch in favor of tempfile [Alex];
> Added one EXTRA_CONFIGURE_OPTS patch [Alex];
>
> 01: Fix commit message, and improve help text;
> Fix pylint warnings, mostly long lines and some refactoring;
> "--verbose" is now replaced with the shared args "--quiet";
> 02: Update commit message;
> Use "--quiet", drop "--verbose";
> Fix typo;
> 05: Mention "build_qemu" in commit message;
> Add Alex's rev-by;
> 10: Fix stale commit message;
>
> Add Alex's rev-by to v3 except above.
>
> This series adds a new "docker" make target family to run tests in created
> docker containers.
>
> To begin with, this can be a place to store standard env/command combinations to
> build and test QEMU.
>
> Secondly, CI usually provides "docker" capability, where we specify
> standard/repeatable test environments, and run tests in them. However, what
> tests to cover is better maintained in-tree, in order to keep in sync with the
> code development.
>
> Lastly, this makes it very simple for developers to replicate such tests
> themselves.
>
>
> Fam Zheng (13):
> tests: Add utilities for docker testing
> Makefile: Rules for docker testing
> docker: Add images
> docker: Add test runner
> docker: Add common.rc
> docker: Add quick test
> docker: Add full test
> docker: Add clang test
> docker: Add mingw test
> docker: Add travis tool
> docs: Add text for tests/docker in build-system.txt
> docker: Add EXTRA_CONFIGURE_OPTS
> MAINTAINERS: Add tests/docker
>
> MAINTAINERS | 7 ++
> Makefile | 4 +-
> docs/build-system.txt | 5 +
> tests/docker/Makefile.include | 124 +++++++++++++++++++++
> tests/docker/common.rc | 32 ++++++
> tests/docker/docker.py | 191 ++++++++++++++++++++++++++++++++
> tests/docker/dockerfiles/centos6.docker | 6 +
> tests/docker/dockerfiles/fedora.docker | 7 ++
> tests/docker/dockerfiles/ubuntu.docker | 11 ++
> tests/docker/run | 58 ++++++++++
> tests/docker/test-clang | 25 +++++
> tests/docker/test-full | 17 +++
> tests/docker/test-mingw | 34 ++++++
> tests/docker/test-quick | 19 ++++
> tests/docker/travis | 21 ++++
> tests/docker/travis.py | 48 ++++++++
> 16 files changed, 608 insertions(+), 1 deletion(-)
> create mode 100644 tests/docker/Makefile.include
> create mode 100755 tests/docker/common.rc
> create mode 100755 tests/docker/docker.py
> create mode 100644 tests/docker/dockerfiles/centos6.docker
> create mode 100644 tests/docker/dockerfiles/fedora.docker
> create mode 100644 tests/docker/dockerfiles/ubuntu.docker
> create mode 100755 tests/docker/run
> create mode 100755 tests/docker/test-clang
> create mode 100755 tests/docker/test-full
> create mode 100755 tests/docker/test-mingw
> create mode 100755 tests/docker/test-quick
> create mode 100755 tests/docker/travis
> create mode 100755 tests/docker/travis.py
>
> --
> 2.4.3
>
>
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests
2016-03-28 2:37 ` [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
@ 2016-03-28 11:50 ` Alex Bennée
0 siblings, 0 replies; 25+ messages in thread
From: Alex Bennée @ 2016-03-28 11:50 UTC (permalink / raw)
To: Fam Zheng
Cc: kwolf, peter.maydell, sw, qemu-devel, stefanha, Paolo Bonzini,
jsnow, david
Fam Zheng <famz@redhat.com> writes:
> Ping?
I'll do a sweep through this week, probably tomorrow.
>
> On Thu, 03/17 14:34, Fam Zheng wrote:
>> v4: Dropped the .gitignore patch in favor of tempfile [Alex];
>> Added one EXTRA_CONFIGURE_OPTS patch [Alex];
>>
>> 01: Fix commit message, and improve help text;
>> Fix pylint warnings, mostly long lines and some refactoring;
>> "--verbose" is now replaced with the shared args "--quiet";
>> 02: Update commit message;
>> Use "--quiet", drop "--verbose";
>> Fix typo;
>> 05: Mention "build_qemu" in commit message;
>> Add Alex's rev-by;
>> 10: Fix stale commit message;
>>
>> Add Alex's rev-by to v3 except above.
>>
>> This series adds a new "docker" make target family to run tests in created
>> docker containers.
>>
>> To begin with, this can be a place to store standard env/command combinations to
>> build and test QEMU.
>>
>> Secondly, CI usually provides "docker" capability, where we specify
>> standard/repeatable test environments, and run tests in them. However, what
>> tests to cover is better maintained in-tree, in order to keep in sync with the
>> code development.
>>
>> Lastly, this makes it very simple for developers to replicate such tests
>> themselves.
>>
>>
>> Fam Zheng (13):
>> tests: Add utilities for docker testing
>> Makefile: Rules for docker testing
>> docker: Add images
>> docker: Add test runner
>> docker: Add common.rc
>> docker: Add quick test
>> docker: Add full test
>> docker: Add clang test
>> docker: Add mingw test
>> docker: Add travis tool
>> docs: Add text for tests/docker in build-system.txt
>> docker: Add EXTRA_CONFIGURE_OPTS
>> MAINTAINERS: Add tests/docker
>>
>> MAINTAINERS | 7 ++
>> Makefile | 4 +-
>> docs/build-system.txt | 5 +
>> tests/docker/Makefile.include | 124 +++++++++++++++++++++
>> tests/docker/common.rc | 32 ++++++
>> tests/docker/docker.py | 191 ++++++++++++++++++++++++++++++++
>> tests/docker/dockerfiles/centos6.docker | 6 +
>> tests/docker/dockerfiles/fedora.docker | 7 ++
>> tests/docker/dockerfiles/ubuntu.docker | 11 ++
>> tests/docker/run | 58 ++++++++++
>> tests/docker/test-clang | 25 +++++
>> tests/docker/test-full | 17 +++
>> tests/docker/test-mingw | 34 ++++++
>> tests/docker/test-quick | 19 ++++
>> tests/docker/travis | 21 ++++
>> tests/docker/travis.py | 48 ++++++++
>> 16 files changed, 608 insertions(+), 1 deletion(-)
>> create mode 100644 tests/docker/Makefile.include
>> create mode 100755 tests/docker/common.rc
>> create mode 100755 tests/docker/docker.py
>> create mode 100644 tests/docker/dockerfiles/centos6.docker
>> create mode 100644 tests/docker/dockerfiles/fedora.docker
>> create mode 100644 tests/docker/dockerfiles/ubuntu.docker
>> create mode 100755 tests/docker/run
>> create mode 100755 tests/docker/test-clang
>> create mode 100755 tests/docker/test-full
>> create mode 100755 tests/docker/test-mingw
>> create mode 100755 tests/docker/test-quick
>> create mode 100755 tests/docker/travis
>> create mode 100755 tests/docker/travis.py
>>
>> --
>> 2.4.3
>>
>>
--
Alex Bennée
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [PATCH v4 01/13] tests: Add utilities for docker testing
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 01/13] tests: Add utilities for docker testing Fam Zheng
@ 2016-03-31 9:47 ` Alex Bennée
0 siblings, 0 replies; 25+ messages in thread
From: Alex Bennée @ 2016-03-31 9:47 UTC (permalink / raw)
To: Fam Zheng
Cc: kwolf, peter.maydell, sw, qemu-devel, stefanha, Paolo Bonzini,
jsnow, david
Fam Zheng <famz@redhat.com> writes:
> docker.py is added with a number of useful subcommands to manager docker
> images and instances for QEMU docker testing. Subcommands are:
>
> run: A wrapper of "docker run" (or "sudo -n docker run" if necessary),
> which takes care of killing and removing the running container at
> SIGINT.
>
> clean: Tear down all the containers including inactive ones that are
> started by docker_run.
I wonder if at some point we need a delete/remove sub-command to remove
all traces of the images? I dropped to plain docker and did:
docker rmi -f qemu:fedora
while debugging.
Anyway:
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
>
> build: Compare an image from given dockerfile and rebuild it if they're
> different.
>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
> tests/docker/docker.py | 191 +++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 191 insertions(+)
> create mode 100755 tests/docker/docker.py
>
> diff --git a/tests/docker/docker.py b/tests/docker/docker.py
> new file mode 100755
> index 0000000..fe73de7
> --- /dev/null
> +++ b/tests/docker/docker.py
> @@ -0,0 +1,191 @@
> +#!/usr/bin/env python2
> +#
> +# Docker controlling module
> +#
> +# Copyright (c) 2016 Red Hat Inc.
> +#
> +# Authors:
> +# Fam Zheng <famz@redhat.com>
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2
> +# or (at your option) any later version. See the COPYING file in
> +# the top-level directory.
> +
> +import os
> +import sys
> +import subprocess
> +import json
> +import hashlib
> +import atexit
> +import uuid
> +import argparse
> +import tempfile
> +
> +def _text_checksum(text):
> + """Calculate a digest string unique to the text content"""
> + return hashlib.sha1(text).hexdigest()
> +
> +def _guess_docker_command():
> + """ Guess a working docker command or raise exception if not found"""
> + commands = [["docker"], ["sudo", "-n", "docker"]]
> + for cmd in commands:
> + if subprocess.call(cmd + ["images"],
> + stdout=subprocess.PIPE,
> + stderr=subprocess.PIPE) == 0:
> + return cmd
> + commands_txt = "\n".join([" " + " ".join(x) for x in commands])
> + raise Exception("Cannot find working docker command. Tried:\n%s" % \
> + commands_txt)
> +
> +class Docker(object):
> + """ Running Docker commands """
> + def __init__(self):
> + self._command = _guess_docker_command()
> + self._instances = []
> + atexit.register(self._kill_instances)
> +
> + def _do(self, cmd, quiet=True, **kwargs):
> + if quiet:
> + kwargs["stdout"] = subprocess.PIPE
> + return subprocess.call(self._command + cmd, **kwargs)
> +
> + def _do_kill_instances(self, only_known, only_active=True):
> + cmd = ["ps", "-q"]
> + if not only_active:
> + cmd.append("-a")
> + for i in self._output(cmd).split():
> + resp = self._output(["inspect", i])
> + labels = json.loads(resp)[0]["Config"]["Labels"]
> + active = json.loads(resp)[0]["State"]["Running"]
> + if not labels:
> + continue
> + instance_uuid = labels.get("com.qemu.instance.uuid", None)
> + if not instance_uuid:
> + continue
> + if only_known and instance_uuid not in self._instances:
> + continue
> + print "Terminating", i
> + if active:
> + self._do(["kill", i])
> + self._do(["rm", i])
> +
> + def clean(self):
> + self._do_kill_instances(False, False)
> + return 0
> +
> + def _kill_instances(self):
> + return self._do_kill_instances(True)
> +
> + def _output(self, cmd, **kwargs):
> + return subprocess.check_output(self._command + cmd,
> + stderr=subprocess.STDOUT,
> + **kwargs)
> +
> + def get_image_dockerfile_checksum(self, tag):
> + resp = self._output(["inspect", tag])
> + labels = json.loads(resp)[0]["Config"].get("Labels", {})
> + return labels.get("com.qemu.dockerfile-checksum", "")
> +
> + def build_image(self, tag, dockerfile, df_path, quiet=True, argv=None):
> + if argv == None:
> + argv = []
> + tmp = dockerfile + "\n" + \
> + "LABEL com.qemu.dockerfile-checksum=%s" % \
> + _text_checksum(dockerfile)
> + dirname = os.path.dirname(df_path)
> + tmp_df = tempfile.NamedTemporaryFile(dir=dirname)
> + tmp_df.write(tmp)
> + tmp_df.flush()
> + self._do(["build", "-t", tag, "-f", tmp_df.name] + argv + \
> + [dirname],
> + quiet=quiet)
> +
> + def image_matches_dockerfile(self, tag, dockerfile):
> + try:
> + checksum = self.get_image_dockerfile_checksum(tag)
> + except Exception:
> + return False
> + return checksum == _text_checksum(dockerfile)
> +
> + def run(self, cmd, keep, quiet):
> + label = uuid.uuid1().hex
> + if not keep:
> + self._instances.append(label)
> + ret = self._do(["run", "--label",
> + "com.qemu.instance.uuid=" + label] + cmd,
> + quiet=quiet)
> + if not keep:
> + self._instances.remove(label)
> + return ret
> +
> +class SubCommand(object):
> + """A SubCommand template base class"""
> + name = None # Subcommand name
> + def shared_args(self, parser):
> + parser.add_argument("--quiet", action="store_true",
> + help="Run quietly unless an error occured")
> +
> + def args(self, parser):
> + """Setup argument parser"""
> + pass
> + def run(self, args, argv):
> + """Run command.
> + args: parsed argument by argument parser.
> + argv: remaining arguments from sys.argv.
> + """
> + pass
> +
> +class RunCommand(SubCommand):
> + """Invoke docker run and take care of cleaning up"""
> + name = "run"
> + def args(self, parser):
> + parser.add_argument("--keep", action="store_true",
> + help="Don't remove image when command completes")
> + def run(self, args, argv):
> + return Docker().run(argv, args.keep, quiet=args.quiet)
> +
> +class BuildCommand(SubCommand):
> + """ Build docker image out of a dockerfile. Arguments: <tag> <dockerfile>"""
> + name = "build"
> + def args(self, parser):
> + parser.add_argument("tag",
> + help="Image Tag")
> + parser.add_argument("dockerfile",
> + help="Dockerfile name")
> +
> + def run(self, args, argv):
> + dockerfile = open(args.dockerfile, "rb").read()
> + tag = args.tag
> +
> + dkr = Docker()
> + if dkr.image_matches_dockerfile(tag, dockerfile):
> + if not args.quiet:
> + print "Image is up to date."
> + return 0
> +
> + dkr.build_image(tag, dockerfile, args.dockerfile,
> + quiet=args.quiet, argv=argv)
> + return 0
> +
> +class CleanCommand(SubCommand):
> + """Clean up docker instances"""
> + name = "clean"
> + def run(self, args, argv):
> + Docker().clean()
> + return 0
> +
> +def main():
> + parser = argparse.ArgumentParser(description="A Docker helper",
> + usage="%s <subcommand> ..." % os.path.basename(sys.argv[0]))
> + subparsers = parser.add_subparsers(title="subcommands", help=None)
> + for cls in SubCommand.__subclasses__():
> + cmd = cls()
> + subp = subparsers.add_parser(cmd.name, help=cmd.__doc__)
> + cmd.shared_args(subp)
> + cmd.args(subp)
> + subp.set_defaults(cmdobj=cmd)
> + args, argv = parser.parse_known_args()
> + return args.cmdobj.run(args, argv)
> +
> +if __name__ == "__main__":
> + sys.exit(main())
--
Alex Bennée
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [PATCH v4 02/13] Makefile: Rules for docker testing
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 02/13] Makefile: Rules " Fam Zheng
@ 2016-03-31 9:52 ` Alex Bennée
2016-03-31 10:32 ` Alex Bennée
1 sibling, 0 replies; 25+ messages in thread
From: Alex Bennée @ 2016-03-31 9:52 UTC (permalink / raw)
To: Fam Zheng
Cc: kwolf, peter.maydell, sw, qemu-devel, stefanha, Paolo Bonzini,
jsnow, david
Fam Zheng <famz@redhat.com> writes:
> This adds a group of make targets to run docker tests, all are available
> in source tree without running ./configure.
>
> The usage is shown with "make docker".
>
> Besides the fixed ones, dynamic targets for building each image and
> running each test in each image are generated automatically by make,
> scanning $(SRC_PATH)/tests/docker/ files with specific patterns.
>
> Alternative to manually list particular targets (docker-TEST@IMAGE)
> set, you can control which tests/images to run by filtering variables,
> TESTS= and IMAGES=, which are expressed in Makefile pattern syntax,
> "foo% %bar ...". For example:
>
> $ make docker-test IMAGES="ubuntu fedora"
$ [qemu.git/review/docker-v4] >make docker-test IMAGES="fedora" DEBUG=1
V=1
/home/alex/lsrc/qemu/qemu.git/rules.mak:178: warning: overriding recipe for target 'clean-timestamp'
/home/alex/lsrc/qemu/qemu.git/rules.mak:178: warning: ignoring old recipe for target 'clean-timestamp'
/home/alex/lsrc/qemu/qemu.git/tests/docker/docker.py build qemu:fedora /home/alex/lsrc/qemu/qemu.git/tests/docker/dockerfiles/fedora.docker
Image is up to date.
(cd /home/alex/lsrc/qemu/qemu.git; if git diff-index --quiet HEAD --
&>/dev/null; then git archive -1 HEAD --format=tar.gz -o
/tmp/qemu-src.opTOn/qemu.tgz; else git archive -1 $(git stash create)
--format=tar.gz -o /tmp/qemu-src.opTOn/qemu.tgz; fi)
cp "/home/alex/lsrc/qemu/qemu.git/tests/docker/run"
"/tmp/qemu-src.opTOn/run"
/home/alex/lsrc/qemu/qemu.git/tests/docker/docker.py run --privileged
-t -i -e TARGET_LIST= -e EXTRA_CONFIGURE_OPTS= -e V=1 -e J= -e DEBUG=1
-e CCACHE_DIR=/var/tmp/ccache -v $(realpath
/tmp/qemu-src.opTOn):/var/tmp/qemu:ro -v
/var/tmp/qemu-docker-ccache:/var/tmp/ccache -w /var/tmp/qemu qemu:fedora
/bin/bash -x ./run test-clang;
docker: Error response from daemon: Container command not found or does not exist..
/home/alex/lsrc/qemu/qemu.git/tests/docker/Makefile.include:102: recipe for target 'docker-run-test-clang@fedora' failed
make: *** [docker-run-test-clang@fedora] Error 127
I can't get a test shell on the container, but I suspect that means
./run isn't in the path somewhere?
>
> Unfortunately, it's impossible to propagate "-j $JOBS" into make in
> containers, however since each combination is made a first class target
> in the top Makefile, "make -j$N docker-test" still parallels the tests
> coarsely.
>
> Still, $J is made a magic variable to let all make invocations in
> containers to use -j$J.
>
> Instead of providing a live version of the source tree to the docker
> container we snapshot it with git-archive. This ensures the tree is in a
> pristine state for whatever operations the container is going to run on
> them.
>
> Uncommitted changes known to files known by the git index will be
> included in the snapshot if there are any.
>
> Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
> Makefile | 4 +-
> tests/docker/Makefile.include | 121 ++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 124 insertions(+), 1 deletion(-)
> create mode 100644 tests/docker/Makefile.include
>
> diff --git a/Makefile b/Makefile
> index 1d076a9..554a3b1 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -6,7 +6,7 @@ BUILD_DIR=$(CURDIR)
> # Before including a proper config-host.mak, assume we are in the source tree
> SRC_PATH=.
>
> -UNCHECKED_GOALS := %clean TAGS cscope ctags
> +UNCHECKED_GOALS := %clean TAGS cscope ctags docker docker-%
>
> # All following code might depend on configuration variables
> ifneq ($(wildcard config-host.mak),)
> @@ -651,3 +651,5 @@ endif
> # Include automatically generated dependency files
> # Dependencies in Makefile.objs files come from our recursive subdir rules
> -include $(wildcard *.d tests/*.d)
> +
> +include $(SRC_PATH)/tests/docker/Makefile.include
> diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include
> new file mode 100644
> index 0000000..033809a
> --- /dev/null
> +++ b/tests/docker/Makefile.include
> @@ -0,0 +1,121 @@
> +# Makefile for Docker tests
> +
> +$(if $(quiet-command),,$(eval include $(SRC_PATH)/rules.mak))
> +
> +.PHONY: docker docker-test docker-clean docker-image docker-qemu-src
> +
> +DOCKER_SUFFIX := .docker
> +DOCKER_FILES_DIR := $(SRC_PATH)/tests/docker/dockerfiles
> +DOCKER_IMAGES := $(notdir $(basename $(wildcard $(DOCKER_FILES_DIR)/*.docker)))
> +DOCKER_TARGETS := $(patsubst %,docker-image-%,$(DOCKER_IMAGES))
> +# Use a global constant ccache directory to speed up repetitive builds
> +DOCKER_CCACHE_DIR := /var/tmp/qemu-docker-ccache
> +
> +DOCKER_TESTS := $(notdir $(shell \
> + find $(SRC_PATH)/tests/docker/ -name 'test-*' -type f -executable))
> +
> +DOCKER_TOOLS := travis
> +
> +TESTS ?= %
> +IMAGES ?= %
> +SRC_COPY := $(shell mktemp -u /tmp/qemu-src.XXXXX)
> +
> +# Make archive from git repo $1 to tar.gz $2
> +make-archive-maybe = $(if $(wildcard $1/*), \
> + $(call quiet-command, \
> + (cd $1; if git diff-index --quiet HEAD -- &>/dev/null; then \
> + git archive -1 HEAD --format=tar.gz -o $2; \
> + else \
> + git archive -1 $$(git stash create) --format=tar.gz -o $2; \
> + fi), \
> + " ARCHIVE $(notdir $2)"))
> +
> +$(SRC_COPY):
> + @mkdir -p $@
> + $(call make-archive-maybe, $(SRC_PATH), $(SRC_COPY)/qemu.tgz)
> + $(call make-archive-maybe, $(SRC_PATH)/dtc, $(SRC_COPY)/dtc.tgz)
> + $(call make-archive-maybe, $(SRC_PATH)/pixman, $(SRC_COPY)/pixman.tgz)
> + $(call quiet-command, cp "$(SRC_PATH)/tests/docker/run" "$(SRC_COPY)/run", \
> + " COPY RUNNER")
> +
> +docker-qemu-src: $(SRC_COPY)
> +
> +docker-image: ${DOCKER_TARGETS}
> +
> +# General rule for building docker images
> +docker-image-%: $(DOCKER_FILES_DIR)/%.docker
> + $(call quiet-command,\
> + $(SRC_PATH)/tests/docker/docker.py build qemu:$* $< \
> + $(if $V,,--quiet) $(if $(NOCACHE),--no-cache),\
> + " BUILD $*")
> +
> +# Expand all the pre-requistes for each docker image and test combination
> +$(foreach i,$(DOCKER_IMAGES), \
> + $(foreach t,$(DOCKER_TESTS) $(DOCKER_TOOLS), \
> + $(eval .PHONY: docker-$t@$i) \
> + $(eval docker-$t@$i: docker-image-$i docker-run-$t@$i) \
> + ) \
> + $(foreach t,$(DOCKER_TESTS), \
> + $(eval docker-test: docker-$t@$i) \
> + ) \
> +)
> +
> +docker:
> + @echo 'Build QEMU and run tests inside Docker containers'
> + @echo
> + @echo 'Available targets:'
> + @echo
> + @echo ' docker: Print this help.'
> + @echo ' docker-test: Run all image/test combinations.'
> + @echo ' docker-clean: Kill and remove residual docker testing containers.'
> + @echo ' docker-TEST@IMAGE: Run "TEST" in container "IMAGE".'
> + @echo ' Note: "TEST" is one of the listed test name,'
> + @echo ' or a script name under $$QEMU_SRC/tests/docker/;'
> + @echo ' "IMAGE" is one of the listed container name."'
> + @echo ' docker-image: Build all images.'
> + @echo ' docker-image-IMAGE: Build image "IMAGE".'
> + @echo
> + @echo 'Available container images:'
> + @echo ' $(DOCKER_IMAGES)'
> + @echo
> + @echo 'Available tests:'
> + @echo ' $(DOCKER_TESTS)'
> + @echo
> + @echo 'Available tools:'
> + @echo ' $(DOCKER_TOOLS)'
> + @echo
> + @echo 'Special variables:'
> + @echo ' TARGET_LIST=a,b,c Override target list in builds.'
> + @echo ' IMAGES="a b c ..": Filters which images to build or run.'
> + @echo ' TESTS="x y z .." Filters which tests to run (for docker-test).'
> + @echo ' J=[0..9]* Overrides the -jN parameter for make commands'
> + @echo ' (default is 1)'
> + @echo ' DEBUG=1 Stop and drop to shell in the created container'
> + @echo ' before running the command.'
> + @echo ' NOCACHE=1 Ignore cache when build images.'
> +
> +docker-run-%: CMD = $(shell echo '$@' | sed -e 's/docker-run-\([^@]*\)@\(.*\)/\1/')
> +docker-run-%: IMAGE = $(shell echo '$@' | sed -e 's/docker-run-\([^@]*\)@\(.*\)/\2/')
> +docker-run-%: docker-qemu-src
> + @if test -z "$(IMAGE)" || test -z "$(CMD)"; \
> + then echo "Invalid target"; exit 1; \
> + fi
> + $(if $(filter $(TESTS),$(CMD)),$(if $(filter $(IMAGES),$(IMAGE)), \
> + $(call quiet-command,\
> + $(SRC_PATH)/tests/docker/docker.py run $(if $V,,--rm) \
> + --privileged -t \
> + $(if $(DEBUG),-i,--net=none) \
> + -e TARGET_LIST=$(TARGET_LIST) \
> + -e V=$V -e J=$J -e DEBUG=$(DEBUG)\
> + -e CCACHE_DIR=/var/tmp/ccache \
> + -v $$(realpath $(SRC_COPY)):/var/tmp/qemu:ro \
> + -v $(DOCKER_CCACHE_DIR):/var/tmp/ccache \
> + -w /var/tmp/qemu \
> + qemu:$(IMAGE) \
> + $(if $V,/bin/bash -x ,) \
> + ./run \
> + $(CMD); \
> + , " RUN $(CMD) in $(IMAGE)")))
> +
> +docker-clean:
> + $(call quiet-command, $(SRC_PATH)/tests/docker/docker.py clean)
--
Alex Bennée
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [PATCH v4 02/13] Makefile: Rules for docker testing
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 02/13] Makefile: Rules " Fam Zheng
2016-03-31 9:52 ` Alex Bennée
@ 2016-03-31 10:32 ` Alex Bennée
1 sibling, 0 replies; 25+ messages in thread
From: Alex Bennée @ 2016-03-31 10:32 UTC (permalink / raw)
To: Fam Zheng
Cc: kwolf, peter.maydell, sw, qemu-devel, stefanha, Paolo Bonzini,
jsnow, david
Fam Zheng <famz@redhat.com> writes:
> This adds a group of make targets to run docker tests, all are available
> in source tree without running ./configure.
>
> The usage is shown with "make docker".
>
> Besides the fixed ones, dynamic targets for building each image and
> running each test in each image are generated automatically by make,
> scanning $(SRC_PATH)/tests/docker/ files with specific patterns.
>
> Alternative to manually list particular targets (docker-TEST@IMAGE)
> set, you can control which tests/images to run by filtering variables,
> TESTS= and IMAGES=, which are expressed in Makefile pattern syntax,
> "foo% %bar ...". For example:
>
> $ make docker-test IMAGES="ubuntu fedora"
>
> Unfortunately, it's impossible to propagate "-j $JOBS" into make in
> containers, however since each combination is made a first class target
> in the top Makefile, "make -j$N docker-test" still parallels the tests
> coarsely.
>
> Still, $J is made a magic variable to let all make invocations in
> containers to use -j$J.
>
> Instead of providing a live version of the source tree to the docker
> container we snapshot it with git-archive. This ensures the tree is in a
> pristine state for whatever operations the container is going to run on
> them.
>
> Uncommitted changes known to files known by the git index will be
> included in the snapshot if there are any.
>
> Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
> Makefile | 4 +-
> tests/docker/Makefile.include | 121 ++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 124 insertions(+), 1 deletion(-)
> create mode 100644 tests/docker/Makefile.include
>
<snip>
> diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include
> new file mode 100644
> index 0000000..033809a
> --- /dev/null
> +++ b/tests/docker/Makefile.include
> @@ -0,0 +1,121 @@
> +# Makefile for Docker tests
<snip>
> +docker-run-%: CMD = $(shell echo '$@' | sed -e 's/docker-run-\([^@]*\)@\(.*\)/\1/')
> +docker-run-%: IMAGE = $(shell echo '$@' | sed -e 's/docker-run-\([^@]*\)@\(.*\)/\2/')
> +docker-run-%: docker-qemu-src
> + @if test -z "$(IMAGE)" || test -z "$(CMD)"; \
> + then echo "Invalid target"; exit 1; \
> + fi
> + $(if $(filter $(TESTS),$(CMD)),$(if $(filter $(IMAGES),$(IMAGE)), \
> + $(call quiet-command,\
> + $(SRC_PATH)/tests/docker/docker.py run $(if $V,,--rm) \
> + --privileged -t \
I had to drop --privileged to get it to work.
> + $(if $(DEBUG),-i,--net=none) \
> + -e TARGET_LIST=$(TARGET_LIST) \
> + -e V=$V -e J=$J -e DEBUG=$(DEBUG)\
> + -e CCACHE_DIR=/var/tmp/ccache \
> + -v $$(realpath $(SRC_COPY)):/var/tmp/qemu:ro \
> + -v $(DOCKER_CCACHE_DIR):/var/tmp/ccache \
> + -w /var/tmp/qemu \
> + qemu:$(IMAGE) \
> + $(if $V,/bin/bash -x ,) \
> + ./run \
> + $(CMD); \
> + , " RUN $(CMD) in $(IMAGE)")))
> +
> +docker-clean:
> + $(call quiet-command, $(SRC_PATH)/tests/docker/docker.py clean)
--
Alex Bennée
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [PATCH v4 10/13] docker: Add travis tool
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 10/13] docker: Add travis tool Fam Zheng
@ 2016-03-31 13:14 ` Alex Bennée
0 siblings, 0 replies; 25+ messages in thread
From: Alex Bennée @ 2016-03-31 13:14 UTC (permalink / raw)
To: Fam Zheng
Cc: kwolf, peter.maydell, sw, qemu-devel, stefanha, Paolo Bonzini,
jsnow, david
Fam Zheng <famz@redhat.com> writes:
> The script is not prefixed with test- so it won't run with "make docker-test",
> because it can take too long.
>
> Run it with "make docker-travis@ubuntu".
Currently we can only really use this with ubuntu anyway. How would you
expand the matrix on other platforms? Tweak the docker files for
dependencies or feed it via travis somehow?
Anyway:
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
> tests/docker/travis | 21 +++++++++++++++++++++
> tests/docker/travis.py | 48 ++++++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 69 insertions(+)
> create mode 100755 tests/docker/travis
> create mode 100755 tests/docker/travis.py
>
> diff --git a/tests/docker/travis b/tests/docker/travis
> new file mode 100755
> index 0000000..d345393
> --- /dev/null
> +++ b/tests/docker/travis
> @@ -0,0 +1,21 @@
> +#!/bin/bash -e
> +#
> +# Mimic a travis testing matrix
> +#
> +# Copyright (c) 2016 Red Hat Inc.
> +#
> +# Authors:
> +# Fam Zheng <famz@redhat.com>
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2
> +# or (at your option) any later version. See the COPYING file in
> +# the top-level directory.
> +
> +. common.rc
> +
> +requires pyyaml
> +cmdfile=/tmp/travis_cmd_list.sh
> +$QEMU_SRC/tests/docker/travis.py $QEMU_SRC/.travis.yml > $cmdfile
> +chmod +x $cmdfile
> +cd "$QEMU_SRC"
> +$cmdfile
> diff --git a/tests/docker/travis.py b/tests/docker/travis.py
> new file mode 100755
> index 0000000..8dcc964
> --- /dev/null
> +++ b/tests/docker/travis.py
> @@ -0,0 +1,48 @@
> +#!/usr/bin/env python
> +#
> +# Travis YAML config parser
> +#
> +# Copyright (c) 2016 Red Hat Inc.
> +#
> +# Authors:
> +# Fam Zheng <famz@redhat.com>
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2
> +# or (at your option) any later version. See the COPYING file in
> +# the top-level directory.
> +
> +import sys
> +import yaml
> +import itertools
> +
> +def load_yaml(fname):
> + return yaml.load(open(fname, "r").read())
> +
> +def conf_iter(conf):
> + def env_to_list(env):
> + return env if isinstance(env, list) else [env]
> + global_env = conf["env"]["global"]
> + for entry in conf["matrix"]["include"]:
> + yield {"env": global_env + env_to_list(entry["env"]),
> + "compiler": entry["compiler"]}
> + for entry in itertools.product(conf["compiler"],
> + conf["env"]["matrix"]):
> + yield {"env": global_env + env_to_list(entry[1]),
> + "compiler": entry[0]}
> +
> +def main():
> + if len(sys.argv) < 2:
> + sys.stderr.write("Usage: %s <travis-file>\n" % sys.argv[0])
> + return 1
> + conf = load_yaml(sys.argv[1])
> + for config in conf_iter(conf):
> + print "("
> + print "\n".join(config["env"])
> + print "alias cc=" + config["compiler"]
> + print "\n".join(conf["before_script"])
> + print "\n".join(conf["script"])
> + print ")"
> + return 0
> +
> +if __name__ == "__main__":
> + sys.exit(main())
--
Alex Bennée
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [PATCH v4 12/13] docker: Add EXTRA_CONFIGURE_OPTS
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 12/13] docker: Add EXTRA_CONFIGURE_OPTS Fam Zheng
@ 2016-03-31 13:20 ` Alex Bennée
0 siblings, 0 replies; 25+ messages in thread
From: Alex Bennée @ 2016-03-31 13:20 UTC (permalink / raw)
To: Fam Zheng
Cc: kwolf, peter.maydell, sw, qemu-devel, stefanha, Paolo Bonzini,
jsnow, david
Fam Zheng <famz@redhat.com> writes:
> Whatever passed in this variable will be appended to all
> configure commands.
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
> tests/docker/Makefile.include | 3 +++
> tests/docker/common.rc | 1 +
> 2 files changed, 4 insertions(+)
>
> diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include
> index 033809a..4270a44 100644
> --- a/tests/docker/Makefile.include
> +++ b/tests/docker/Makefile.include
> @@ -86,6 +86,8 @@ docker:
> @echo
> @echo 'Special variables:'
> @echo ' TARGET_LIST=a,b,c Override target list in builds.'
> + @echo ' EXTRA_CONFIGURE_OPTS="..."'
> + @echo ' Extra configure options.'
> @echo ' IMAGES="a b c ..": Filters which images to build or run.'
> @echo ' TESTS="x y z .." Filters which tests to run (for docker-test).'
> @echo ' J=[0..9]* Overrides the -jN parameter for make commands'
> @@ -106,6 +108,7 @@ docker-run-%: docker-qemu-src
> --privileged -t \
> $(if $(DEBUG),-i,--net=none) \
> -e TARGET_LIST=$(TARGET_LIST) \
> + -e EXTRA_CONFIGURE_OPTS=$(EXTRA_CONFIGURE_OPTS) \
> -e V=$V -e J=$J -e DEBUG=$(DEBUG)\
> -e CCACHE_DIR=/var/tmp/ccache \
> -v $$(realpath $(SRC_COPY)):/var/tmp/qemu:ro \
> diff --git a/tests/docker/common.rc b/tests/docker/common.rc
> index 74b89d6..c493eeb 100755
> --- a/tests/docker/common.rc
> +++ b/tests/docker/common.rc
> @@ -26,6 +26,7 @@ build_qemu()
> $QEMU_SRC/configure \
> --target-list="${TARGET_LIST}" \
> --prefix="$PWD/install" \
> + $EXTRA_CONFIGURE_OPTS \
> "$@"
> make $MAKEFLAGS
> }
--
Alex Bennée
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [PATCH v4 07/13] docker: Add full test
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 07/13] docker: Add full test Fam Zheng
@ 2016-03-31 13:26 ` Alex Bennée
0 siblings, 0 replies; 25+ messages in thread
From: Alex Bennée @ 2016-03-31 13:26 UTC (permalink / raw)
To: Fam Zheng
Cc: kwolf, peter.maydell, sw, qemu-devel, stefanha, Paolo Bonzini,
jsnow, david
Fam Zheng <famz@redhat.com> writes:
> This builds all available targets.
I'm not sure what this adds over the quick test that couldn't be
achieved with the configure defaulting to an empty target list. I'm easy
either way but I'm thinking test-quick and test-full could be merged
into test-simple and default to all targets, default configure.
It can then be tweaked for specific subsets and extra configure options
with the extra parameters.
>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
> tests/docker/test-full | 17 +++++++++++++++++
> 1 file changed, 17 insertions(+)
> create mode 100755 tests/docker/test-full
>
> diff --git a/tests/docker/test-full b/tests/docker/test-full
> new file mode 100755
> index 0000000..fd9b798
> --- /dev/null
> +++ b/tests/docker/test-full
> @@ -0,0 +1,17 @@
> +#!/bin/bash -e
> +#
> +# Compile all the targets.
> +#
> +# Copyright (c) 2016 Red Hat Inc.
> +#
> +# Authors:
> +# Fam Zheng <famz@redhat.com>
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2
> +# or (at your option) any later version. See the COPYING file in
> +# the top-level directory.
> +
> +. common.rc
> +
> +build_qemu
> +make check $MAKEFLAGS
--
Alex Bennée
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [PATCH v4 08/13] docker: Add clang test
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 08/13] docker: Add clang test Fam Zheng
@ 2016-03-31 13:29 ` Alex Bennée
0 siblings, 0 replies; 25+ messages in thread
From: Alex Bennée @ 2016-03-31 13:29 UTC (permalink / raw)
To: Fam Zheng
Cc: kwolf, peter.maydell, sw, qemu-devel, stefanha, Paolo Bonzini,
jsnow, david
Fam Zheng <famz@redhat.com> writes:
> The (currently partially commented out) configure options are suggested
> by John Snow <jsnow@redhat.com>.
>
> Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> ---
> tests/docker/test-clang | 25 +++++++++++++++++++++++++
> 1 file changed, 25 insertions(+)
> create mode 100755 tests/docker/test-clang
>
> diff --git a/tests/docker/test-clang b/tests/docker/test-clang
> new file mode 100755
> index 0000000..7b5e65e
> --- /dev/null
> +++ b/tests/docker/test-clang
> @@ -0,0 +1,25 @@
> +#!/bin/bash -e
> +#
> +# Compile and check with clang.
> +#
> +# Copyright (c) 2016 Red Hat Inc.
> +#
> +# Authors:
> +# Fam Zheng <famz@redhat.com>
> +#
> +# This work is licensed under the terms of the GNU GPL, version 2
> +# or (at your option) any later version. See the COPYING file in
> +# the top-level directory.
> +
> +. common.rc
> +
> +requires clang
> +
> +OPTS="--enable-debug --cxx=clang++ --cc=clang --host-cc=clang"
> +# -fsanitize=undefined is broken on Fedora 23, skip it for now
> +# See also: https://bugzilla.redhat.com/show_bug.cgi?id=1263834
> +#OPTS="$OPTS --extra-cflags=-fsanitize=undefined \
> + #--extra-cflags=-fno-sanitize=float-divide-by-zero"
> +TARGET_LIST=x86_64-softmmu,aarch64-softmmu
We should be able to override the TARGET_LIST the same way as the quick
test. In fact it is basically the same as test-quick with:
- a requires
- a specific default set of configure input
> +build_qemu $OPTS
> +make $MAKEFLAGS check
--
Alex Bennée
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests
2016-03-17 6:34 [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
` (13 preceding siblings ...)
2016-03-28 2:37 ` [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
@ 2016-05-03 8:20 ` Alex Bennée
2016-05-03 9:36 ` Fam Zheng
14 siblings, 1 reply; 25+ messages in thread
From: Alex Bennée @ 2016-05-03 8:20 UTC (permalink / raw)
To: Fam Zheng
Cc: qemu-devel, Paolo Bonzini, kwolf, peter.maydell, stefanha, david,
jsnow, berrange, sw, eblake
Fam Zheng <famz@redhat.com> writes:
> v4: Dropped the .gitignore patch in favor of tempfile [Alex];
> Added one EXTRA_CONFIGURE_OPTS patch [Alex];
>
> 01: Fix commit message, and improve help text;
> Fix pylint warnings, mostly long lines and some refactoring;
> "--verbose" is now replaced with the shared args "--quiet";
> 02: Update commit message;
> Use "--quiet", drop "--verbose";
> Fix typo;
> 05: Mention "build_qemu" in commit message;
> Add Alex's rev-by;
> 10: Fix stale commit message;
>
> Add Alex's rev-by to v3 except above.
>
> This series adds a new "docker" make target family to run tests in created
> docker containers.
>
> To begin with, this can be a place to store standard env/command combinations to
> build and test QEMU.
>
> Secondly, CI usually provides "docker" capability, where we specify
> standard/repeatable test environments, and run tests in them. However, what
> tests to cover is better maintained in-tree, in order to keep in sync with the
> code development.
>
> Lastly, this makes it very simple for developers to replicate such tests
> themselves.
What's the state of this series? Are we just waiting for the tree to
open for 2.7?
>
>
> Fam Zheng (13):
> tests: Add utilities for docker testing
> Makefile: Rules for docker testing
> docker: Add images
> docker: Add test runner
> docker: Add common.rc
> docker: Add quick test
> docker: Add full test
> docker: Add clang test
> docker: Add mingw test
> docker: Add travis tool
> docs: Add text for tests/docker in build-system.txt
> docker: Add EXTRA_CONFIGURE_OPTS
> MAINTAINERS: Add tests/docker
>
> MAINTAINERS | 7 ++
> Makefile | 4 +-
> docs/build-system.txt | 5 +
> tests/docker/Makefile.include | 124 +++++++++++++++++++++
> tests/docker/common.rc | 32 ++++++
> tests/docker/docker.py | 191 ++++++++++++++++++++++++++++++++
> tests/docker/dockerfiles/centos6.docker | 6 +
> tests/docker/dockerfiles/fedora.docker | 7 ++
> tests/docker/dockerfiles/ubuntu.docker | 11 ++
> tests/docker/run | 58 ++++++++++
> tests/docker/test-clang | 25 +++++
> tests/docker/test-full | 17 +++
> tests/docker/test-mingw | 34 ++++++
> tests/docker/test-quick | 19 ++++
> tests/docker/travis | 21 ++++
> tests/docker/travis.py | 48 ++++++++
> 16 files changed, 608 insertions(+), 1 deletion(-)
> create mode 100644 tests/docker/Makefile.include
> create mode 100755 tests/docker/common.rc
> create mode 100755 tests/docker/docker.py
> create mode 100644 tests/docker/dockerfiles/centos6.docker
> create mode 100644 tests/docker/dockerfiles/fedora.docker
> create mode 100644 tests/docker/dockerfiles/ubuntu.docker
> create mode 100755 tests/docker/run
> create mode 100755 tests/docker/test-clang
> create mode 100755 tests/docker/test-full
> create mode 100755 tests/docker/test-mingw
> create mode 100755 tests/docker/test-quick
> create mode 100755 tests/docker/travis
> create mode 100755 tests/docker/travis.py
--
Alex Bennée
^ permalink raw reply [flat|nested] 25+ messages in thread
* Re: [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests
2016-05-03 8:20 ` Alex Bennée
@ 2016-05-03 9:36 ` Fam Zheng
0 siblings, 0 replies; 25+ messages in thread
From: Fam Zheng @ 2016-05-03 9:36 UTC (permalink / raw)
To: Alex Bennée
Cc: qemu-devel, Paolo Bonzini, kwolf, peter.maydell, stefanha, david,
jsnow, berrange, sw, eblake
On Tue, 05/03 09:20, Alex Bennée wrote:
>
> What's the state of this series? Are we just waiting for the tree to
> open for 2.7?
Hi Alex,
I couldn't allocate any time for this being busy with 2.6 things, this week
I'll take a look at the points you have commented on and update it.
Fam
^ permalink raw reply [flat|nested] 25+ messages in thread
end of thread, other threads:[~2016-05-03 9:37 UTC | newest]
Thread overview: 25+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-03-17 6:34 [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 01/13] tests: Add utilities for docker testing Fam Zheng
2016-03-31 9:47 ` Alex Bennée
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 02/13] Makefile: Rules " Fam Zheng
2016-03-31 9:52 ` Alex Bennée
2016-03-31 10:32 ` Alex Bennée
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 03/13] docker: Add images Fam Zheng
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 04/13] docker: Add test runner Fam Zheng
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 05/13] docker: Add common.rc Fam Zheng
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 06/13] docker: Add quick test Fam Zheng
2016-03-17 6:34 ` [Qemu-devel] [PATCH v4 07/13] docker: Add full test Fam Zheng
2016-03-31 13:26 ` Alex Bennée
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 08/13] docker: Add clang test Fam Zheng
2016-03-31 13:29 ` Alex Bennée
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 09/13] docker: Add mingw test Fam Zheng
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 10/13] docker: Add travis tool Fam Zheng
2016-03-31 13:14 ` Alex Bennée
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 11/13] docs: Add text for tests/docker in build-system.txt Fam Zheng
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 12/13] docker: Add EXTRA_CONFIGURE_OPTS Fam Zheng
2016-03-31 13:20 ` Alex Bennée
2016-03-17 6:35 ` [Qemu-devel] [PATCH v4 13/13] MAINTAINERS: Add tests/docker Fam Zheng
2016-03-28 2:37 ` [Qemu-devel] [PATCH v4 00/13] tests: Introducing docker tests Fam Zheng
2016-03-28 11:50 ` Alex Bennée
2016-05-03 8:20 ` Alex Bennée
2016-05-03 9:36 ` Fam Zheng
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).