All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v4 0/4] Docker cross-compile targets and user build support
@ 2017-02-16 12:34 Alex Bennée
  2017-02-16 12:34 ` [Qemu-devel] [PATCH v4 1/4] tests/docker: add basic user mapping support Alex Bennée
                   ` (4 more replies)
  0 siblings, 5 replies; 15+ messages in thread
From: Alex Bennée @ 2017-02-16 12:34 UTC (permalink / raw)
  To: famz; +Cc: qemu-devel, Alex Bennée

Hi Fam,

Here is the latest iteration of the docker changes incorporating your
suggestions:

  - -u behaves safely if user already added
  - cross containers specify QEMU_CONFIGURE_OPTS
  - merged docker and build automation in MAINTAINERS

Regards,

Alex Bennée (4):
  tests/docker: add basic user mapping support
  new: debian docker targets for cross-compiling
  .shippable.yml: new CI provider
  MAINTAINERS: merge Build and test automation with Docker tests

 .shippable.yml                                     | 21 ++++++++++++++++++
 MAINTAINERS                                        | 13 ++++++-----
 tests/docker/Makefile.include                      |  6 ++++++
 tests/docker/common.rc                             |  2 +-
 tests/docker/docker.py                             | 16 ++++++++++++--
 tests/docker/dockerfiles/debian-arm64-cross.docker | 15 +++++++++++++
 tests/docker/dockerfiles/debian-armhf-cross.docker | 15 +++++++++++++
 tests/docker/dockerfiles/debian.docker             | 25 ++++++++++++++++++++++
 8 files changed, 103 insertions(+), 10 deletions(-)
 create mode 100644 .shippable.yml
 create mode 100644 tests/docker/dockerfiles/debian-arm64-cross.docker
 create mode 100644 tests/docker/dockerfiles/debian-armhf-cross.docker
 create mode 100644 tests/docker/dockerfiles/debian.docker

-- 
2.11.0

^ permalink raw reply	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH v4 1/4] tests/docker: add basic user mapping support
  2017-02-16 12:34 [Qemu-devel] [PATCH v4 0/4] Docker cross-compile targets and user build support Alex Bennée
@ 2017-02-16 12:34 ` Alex Bennée
  2017-02-16 13:15   ` Fam Zheng
  2017-02-19  5:24   ` Philippe Mathieu-Daudé
  2017-02-16 12:34 ` [Qemu-devel] [PATCH v4 2/4] new: debian docker targets for cross-compiling Alex Bennée
                   ` (3 subsequent siblings)
  4 siblings, 2 replies; 15+ messages in thread
From: Alex Bennée @ 2017-02-16 12:34 UTC (permalink / raw)
  To: famz; +Cc: qemu-devel, Alex Bennée

Currently all docker builds are done by exporting a tarball to the
docker container and running the build as the containers root user.
Other use cases are possible however and it is possible to map a part
of users file-system to the container. This is useful for example for
doing cross-builds of arbitrary source trees. For this to work
smoothly the container needs to have a user created that maps cleanly
to the host system.

This adds a -u option to the docker script so that:

  DEB_ARCH=armhf DEB_TYPE=stable ./tests/docker/docker.py build \
    -u --include-executable=arm-linux-user/qemu-arm \
    debian:armhf ./tests/docker/dockerfiles/debian-bootstrap.docker

Will build a container that can then be run like:

  docker run --rm -it -v /home/alex/lsrc/qemu/risu.git/:/src \
    --user=alex:alex -w /src/ debian:armhf \
    sh -c "make clean && ./configure -s && make"

All docker containers built will add the current user unless
explicitly disabled by specifying NOUSER when invoking the Makefile:

  make docker-image-debian-armhf-cross NOUSER=1

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Fam Zheng <famz@redhat.com>

---
v2
  - write the useradd directly
  - change long option to --add-current-user
v3
  - images -> image's
  - add r-b
  - add USER to Makefile
v4
  - s/USER/NOUSER/ and default to on
  - fix the add-user code to skip if user already setup (for chained images)
---
 tests/docker/Makefile.include |  2 ++
 tests/docker/docker.py        | 16 ++++++++++++++--
 2 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include
index 3f15d5aea8..4778b27ca8 100644
--- a/tests/docker/Makefile.include
+++ b/tests/docker/Makefile.include
@@ -50,6 +50,7 @@ docker-image-%: $(DOCKER_FILES_DIR)/%.docker
 	$(call quiet-command,\
 		$(SRC_PATH)/tests/docker/docker.py build qemu:$* $< \
 		$(if $V,,--quiet) $(if $(NOCACHE),--no-cache) \
+		$(if $(NOUSER),,--add-current-user) \
 		$(if $(EXECUTABLE),--include-executable=$(EXECUTABLE)),\
 		"BUILD","$*")
 
@@ -99,6 +100,7 @@ docker:
 	@echo '                         (default is 1)'
 	@echo '    DEBUG=1              Stop and drop to shell in the created container'
 	@echo '                         before running the command.'
+	@echo '    NOUSER=1		Disable adding current user to containers passwd.'
 	@echo '    NOCACHE=1            Ignore cache when build images.'
 	@echo '    EXECUTABLE=<path>    Include executable in image.'
 
diff --git a/tests/docker/docker.py b/tests/docker/docker.py
index 37d83199e7..d277a2268f 100755
--- a/tests/docker/docker.py
+++ b/tests/docker/docker.py
@@ -25,6 +25,7 @@ import signal
 from tarfile import TarFile, TarInfo
 from StringIO import StringIO
 from shutil import copy, rmtree
+from pwd import getpwuid
 
 
 DEVNULL = open(os.devnull, 'wb')
@@ -149,13 +150,21 @@ class Docker(object):
         labels = json.loads(resp)[0]["Config"].get("Labels", {})
         return labels.get("com.qemu.dockerfile-checksum", "")
 
-    def build_image(self, tag, docker_dir, dockerfile, quiet=True, argv=None):
+    def build_image(self, tag, docker_dir, dockerfile,
+                    quiet=True, user=False, argv=None):
         if argv == None:
             argv = []
 
         tmp_df = tempfile.NamedTemporaryFile(dir=docker_dir, suffix=".docker")
         tmp_df.write(dockerfile)
 
+        if user:
+            uid = os.getuid()
+            uname = getpwuid(uid).pw_name
+            tmp_df.write("\n")
+            tmp_df.write("RUN id %s || useradd -u %d -U %s" %
+                         (uname, uid, uname))
+
         tmp_df.write("\n")
         tmp_df.write("LABEL com.qemu.dockerfile-checksum=%s" %
                      _text_checksum(dockerfile))
@@ -225,6 +234,9 @@ class BuildCommand(SubCommand):
                             help="""Specify a binary that will be copied to the
                             container together with all its dependent
                             libraries""")
+        parser.add_argument("--add-current-user", "-u", dest="user",
+                            action="store_true",
+                            help="Add the current user to image's passwd")
         parser.add_argument("tag",
                             help="Image Tag")
         parser.add_argument("dockerfile",
@@ -261,7 +273,7 @@ class BuildCommand(SubCommand):
                                        docker_dir)
 
             dkr.build_image(tag, docker_dir, dockerfile,
-                            quiet=args.quiet, argv=argv)
+                            quiet=args.quiet, user=args.user, argv=argv)
 
             rmtree(docker_dir)
 
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH v4 2/4] new: debian docker targets for cross-compiling
  2017-02-16 12:34 [Qemu-devel] [PATCH v4 0/4] Docker cross-compile targets and user build support Alex Bennée
  2017-02-16 12:34 ` [Qemu-devel] [PATCH v4 1/4] tests/docker: add basic user mapping support Alex Bennée
@ 2017-02-16 12:34 ` Alex Bennée
  2017-02-16 13:19   ` Fam Zheng
  2017-02-19  4:34   ` Philippe Mathieu-Daudé
  2017-02-16 12:34 ` [Qemu-devel] [PATCH v4 3/4] .shippable.yml: new CI provider Alex Bennée
                   ` (2 subsequent siblings)
  4 siblings, 2 replies; 15+ messages in thread
From: Alex Bennée @ 2017-02-16 12:34 UTC (permalink / raw)
  To: famz; +Cc: qemu-devel, Alex Bennée

This provides a basic Debian install with access to the emdebian cross
compilers. The debian-armhf-cross and debian-arm64-cross targets build
on the basic Debian image to allow cross compiling to those targets.

A new environment variable (QEMU_CONFIGURE_OPTS) is set as part of the
docker container and passed to the build to specify the
--cross-prefix. The user still calls the build in the usual way, for
example:

  make docker-test-build@debian-arm64-cross \
    TARGET_LIST="aarch64-softmmu,aarch64-linux-user"

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

---
v2
  - add clang (keep shippable happy)
  - rm adduser code (done direct now)
  - add aptitude (useful for debugging package clashes)
v3
  - split into debian, debian-armhf-cross and debian-aarch64-cross
v4
  - Add QEMU_CONFIGURE_OPTS
---
 tests/docker/Makefile.include                      |  4 ++++
 tests/docker/common.rc                             |  2 +-
 tests/docker/dockerfiles/debian-arm64-cross.docker | 15 +++++++++++++
 tests/docker/dockerfiles/debian-armhf-cross.docker | 15 +++++++++++++
 tests/docker/dockerfiles/debian.docker             | 25 ++++++++++++++++++++++
 5 files changed, 60 insertions(+), 1 deletion(-)
 create mode 100644 tests/docker/dockerfiles/debian-arm64-cross.docker
 create mode 100644 tests/docker/dockerfiles/debian-armhf-cross.docker
 create mode 100644 tests/docker/dockerfiles/debian.docker

diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include
index 4778b27ca8..84bdcc944a 100644
--- a/tests/docker/Makefile.include
+++ b/tests/docker/Makefile.include
@@ -54,6 +54,10 @@ docker-image-%: $(DOCKER_FILES_DIR)/%.docker
 		$(if $(EXECUTABLE),--include-executable=$(EXECUTABLE)),\
 		"BUILD","$*")
 
+# Enforce dependancies for composite images
+docker-image-debian-armhf-cross: docker-image-debian
+docker-image-debian-arm64-cross: docker-image-debian
+
 # Expand all the pre-requistes for each docker image and test combination
 $(foreach i,$(DOCKER_IMAGES), \
 	$(foreach t,$(DOCKER_TESTS) $(DOCKER_TOOLS), \
diff --git a/tests/docker/common.rc b/tests/docker/common.rc
index 21657e87c6..6865689bb5 100755
--- a/tests/docker/common.rc
+++ b/tests/docker/common.rc
@@ -29,7 +29,7 @@ build_qemu()
     config_opts="--enable-werror \
                  ${TARGET_LIST:+--target-list=${TARGET_LIST}} \
                  --prefix=$PWD/install \
-                 $EXTRA_CONFIGURE_OPTS \
+                 $QEMU_CONFIGURE_OPTS $EXTRA_CONFIGURE_OPTS \
                  $@"
     echo "Configure options:"
     echo $config_opts
diff --git a/tests/docker/dockerfiles/debian-arm64-cross.docker b/tests/docker/dockerfiles/debian-arm64-cross.docker
new file mode 100644
index 0000000000..ce90da943f
--- /dev/null
+++ b/tests/docker/dockerfiles/debian-arm64-cross.docker
@@ -0,0 +1,15 @@
+#
+# Docker arm64 cross-compiler target
+#
+# This docker target builds on the base debian image.
+#
+FROM qemu:debian
+
+# Add the foreign architecture we want and install dependacies
+RUN dpkg --add-architecture arm64
+RUN apt update
+RUN apt install -yy crossbuild-essential-arm64
+RUN apt-get build-dep -yy -a arm64 qemu
+
+# Specify the cross prefix for this image (see tests/docker/common.rc)
+ENV QEMU_CONFIGURE_OPTS --cross-prefix=aarch64-linux-gnu-
diff --git a/tests/docker/dockerfiles/debian-armhf-cross.docker b/tests/docker/dockerfiles/debian-armhf-cross.docker
new file mode 100644
index 0000000000..e0f81a556d
--- /dev/null
+++ b/tests/docker/dockerfiles/debian-armhf-cross.docker
@@ -0,0 +1,15 @@
+#
+# Docker armhf cross-compiler target
+#
+# This docker target builds on the base debian image.
+#
+FROM qemu:debian
+
+# Add the foreign architecture we want and install dependacies
+RUN dpkg --add-architecture armhf
+RUN apt update
+RUN apt install -yy crossbuild-essential-armhf
+RUN apt-get build-dep -yy -a armhf qemu
+
+# Specify the cross prefix for this image (see tests/docker/common.rc)
+ENV QEMU_CONFIGURE_OPTS --cross-prefix=arm-linux-gnueabihf-
diff --git a/tests/docker/dockerfiles/debian.docker b/tests/docker/dockerfiles/debian.docker
new file mode 100644
index 0000000000..52bd79938e
--- /dev/null
+++ b/tests/docker/dockerfiles/debian.docker
@@ -0,0 +1,25 @@
+#
+# Docker multiarch cross-compiler target
+#
+# This docker target is builds on Debian and Emdebian's cross compiler targets
+# to build distro with a selection of cross compilers for building test binaries.
+#
+# On its own you can't build much but the docker-foo-cross targets
+# build on top of the base debian image.
+#
+FROM debian:stable-slim
+
+# Setup some basic tools we need
+RUN apt update
+RUN apt install -yy curl aptitude
+
+# Setup Emdebian
+RUN echo "deb http://emdebian.org/tools/debian/ jessie main" >> /etc/apt/sources.list
+RUN curl http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | apt-key add -
+
+# Duplicate deb line as deb-src
+RUN cat /etc/apt/sources.list | sed "s/deb/deb-src/" >> /etc/apt/sources.list
+
+# Install common build utilities
+RUN apt update
+RUN apt install -yy build-essential clang
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH v4 3/4] .shippable.yml: new CI provider
  2017-02-16 12:34 [Qemu-devel] [PATCH v4 0/4] Docker cross-compile targets and user build support Alex Bennée
  2017-02-16 12:34 ` [Qemu-devel] [PATCH v4 1/4] tests/docker: add basic user mapping support Alex Bennée
  2017-02-16 12:34 ` [Qemu-devel] [PATCH v4 2/4] new: debian docker targets for cross-compiling Alex Bennée
@ 2017-02-16 12:34 ` Alex Bennée
  2017-02-16 13:31   ` Fam Zheng
  2017-02-16 12:34 ` [Qemu-devel] [PATCH v4 4/4] MAINTAINERS: merge Build and test automation with Docker tests Alex Bennée
  2017-02-16 13:36 ` [Qemu-devel] [PATCH v4 0/4] Docker cross-compile targets and user build support Fam Zheng
  4 siblings, 1 reply; 15+ messages in thread
From: Alex Bennée @ 2017-02-16 12:34 UTC (permalink / raw)
  To: famz; +Cc: qemu-devel, Alex Bennée

Ostensibly Shippable offers a similar set of services as Travis.
However they are focused on Docker container based work-flows so we
can use our existing containers to run a few extra builds - in this
case a bunch of cross-compiled targets on a Debian multiarch system.

Signed-off-by: Alex Bennée <alex.bennee@linaro.org>

---
v3
  - reduce matrix to armhf/arm64 which currently work
  - use the make docker-image-* build stanzas
  - add TARGET_LIST to each build
---
 .shippable.yml | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)
 create mode 100644 .shippable.yml

diff --git a/.shippable.yml b/.shippable.yml
new file mode 100644
index 0000000000..4de8daf341
--- /dev/null
+++ b/.shippable.yml
@@ -0,0 +1,21 @@
+language: c
+env:
+  matrix:
+    - IMAGE=debian-armhf-cross
+      TARGET_LIST=arm-softmmu,arm-linux-user
+    - IMAGE=debian-arm64-cross
+      TARGET_LIST=aarch64-softmmu,aarch64-linux-user
+    - IMAGE=centos6
+      TARGET_LIST=i386-softmmu,x86_64-softmmu
+build:
+  pre_ci:
+    - make docker-image-${IMAGE}
+  pre_ci_boot:
+    image_name: qemu
+    image_tag: ${IMAGE}
+    pull: false
+    options: "-e HOME=/root"
+  ci:
+    - unset CC
+    - ./configure ${QEMU_CONFIGURE_OPTS} --target-list=${TARGET_LIST}
+    - make -j2
-- 
2.11.0

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [Qemu-devel] [PATCH v4 4/4] MAINTAINERS: merge Build and test automation with Docker tests
  2017-02-16 12:34 [Qemu-devel] [PATCH v4 0/4] Docker cross-compile targets and user build support Alex Bennée
                   ` (2 preceding siblings ...)
  2017-02-16 12:34 ` [Qemu-devel] [PATCH v4 3/4] .shippable.yml: new CI provider Alex Bennée
@ 2017-02-16 12:34 ` Alex Bennée
  2017-02-16 13:23   ` Fam Zheng
  2017-02-16 13:36 ` [Qemu-devel] [PATCH v4 0/4] Docker cross-compile targets and user build support Fam Zheng
  4 siblings, 1 reply; 15+ messages in thread
From: Alex Bennée @ 2017-02-16 12:34 UTC (permalink / raw)
  To: famz; +Cc: qemu-devel, Alex Bennée

The docker framework is really just another piece in the build
automation puzzle so lets merge it together. For added bonus I've also
included the Travis and Patchew status links. The Shippable links will
be added later once mainline tests have been configured and setup.

Suggested-by: Fam Zheng <famz@redhat.com>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
 MAINTAINERS | 13 ++++++-------
 1 file changed, 6 insertions(+), 7 deletions(-)

diff --git a/MAINTAINERS b/MAINTAINERS
index 7afbadaa15..4e4a3fb83c 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -1802,9 +1802,14 @@ F: docs/block-replication.txt
 Build and test automation
 -------------------------
 M: Alex Bennée <alex.bennee@linaro.org>
+M: Fam Zheng <famz@redhat.com>
 L: qemu-devel@nongnu.org
-S: Supported
+S: Maintained
 F: .travis.yml
+F: .shippable.yml
+F: tests/docker/
+W: https://travis-ci.org/qemu/qemu
+W: http://patchew.org/QEMU/
 
 Documentation
 -------------
@@ -1813,9 +1818,3 @@ 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.11.0

^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH v4 1/4] tests/docker: add basic user mapping support
  2017-02-16 12:34 ` [Qemu-devel] [PATCH v4 1/4] tests/docker: add basic user mapping support Alex Bennée
@ 2017-02-16 13:15   ` Fam Zheng
  2017-02-19  5:24   ` Philippe Mathieu-Daudé
  1 sibling, 0 replies; 15+ messages in thread
From: Fam Zheng @ 2017-02-16 13:15 UTC (permalink / raw)
  To: Alex Bennée; +Cc: qemu-devel

On Thu, 02/16 12:34, Alex Bennée wrote:
> Currently all docker builds are done by exporting a tarball to the
> docker container and running the build as the containers root user.
> Other use cases are possible however and it is possible to map a part
> of users file-system to the container. This is useful for example for
> doing cross-builds of arbitrary source trees. For this to work
> smoothly the container needs to have a user created that maps cleanly
> to the host system.
> 
> This adds a -u option to the docker script so that:
> 
>   DEB_ARCH=armhf DEB_TYPE=stable ./tests/docker/docker.py build \
>     -u --include-executable=arm-linux-user/qemu-arm \
>     debian:armhf ./tests/docker/dockerfiles/debian-bootstrap.docker
> 
> Will build a container that can then be run like:
> 
>   docker run --rm -it -v /home/alex/lsrc/qemu/risu.git/:/src \
>     --user=alex:alex -w /src/ debian:armhf \
>     sh -c "make clean && ./configure -s && make"
> 
> All docker containers built will add the current user unless
> explicitly disabled by specifying NOUSER when invoking the Makefile:
> 
>   make docker-image-debian-armhf-cross NOUSER=1
> 
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> Reviewed-by: Fam Zheng <famz@redhat.com>
> 
> ---
> v2
>   - write the useradd directly
>   - change long option to --add-current-user
> v3
>   - images -> image's
>   - add r-b
>   - add USER to Makefile
> v4
>   - s/USER/NOUSER/ and default to on
>   - fix the add-user code to skip if user already setup (for chained images)
> ---
>  tests/docker/Makefile.include |  2 ++
>  tests/docker/docker.py        | 16 ++++++++++++++--
>  2 files changed, 16 insertions(+), 2 deletions(-)
> 
> diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include
> index 3f15d5aea8..4778b27ca8 100644
> --- a/tests/docker/Makefile.include
> +++ b/tests/docker/Makefile.include
> @@ -50,6 +50,7 @@ docker-image-%: $(DOCKER_FILES_DIR)/%.docker
>  	$(call quiet-command,\
>  		$(SRC_PATH)/tests/docker/docker.py build qemu:$* $< \
>  		$(if $V,,--quiet) $(if $(NOCACHE),--no-cache) \
> +		$(if $(NOUSER),,--add-current-user) \
>  		$(if $(EXECUTABLE),--include-executable=$(EXECUTABLE)),\
>  		"BUILD","$*")
>  
> @@ -99,6 +100,7 @@ docker:
>  	@echo '                         (default is 1)'
>  	@echo '    DEBUG=1              Stop and drop to shell in the created container'
>  	@echo '                         before running the command.'
> +	@echo '    NOUSER=1		Disable adding current user to containers passwd.'

Please expand tabs in the middle into whitespaces.

>  	@echo '    NOCACHE=1            Ignore cache when build images.'
>  	@echo '    EXECUTABLE=<path>    Include executable in image.'
>  
> diff --git a/tests/docker/docker.py b/tests/docker/docker.py
> index 37d83199e7..d277a2268f 100755
> --- a/tests/docker/docker.py
> +++ b/tests/docker/docker.py
> @@ -25,6 +25,7 @@ import signal
>  from tarfile import TarFile, TarInfo
>  from StringIO import StringIO
>  from shutil import copy, rmtree
> +from pwd import getpwuid
>  
>  
>  DEVNULL = open(os.devnull, 'wb')
> @@ -149,13 +150,21 @@ class Docker(object):
>          labels = json.loads(resp)[0]["Config"].get("Labels", {})
>          return labels.get("com.qemu.dockerfile-checksum", "")
>  
> -    def build_image(self, tag, docker_dir, dockerfile, quiet=True, argv=None):
> +    def build_image(self, tag, docker_dir, dockerfile,
> +                    quiet=True, user=False, argv=None):
>          if argv == None:
>              argv = []
>  
>          tmp_df = tempfile.NamedTemporaryFile(dir=docker_dir, suffix=".docker")
>          tmp_df.write(dockerfile)
>  
> +        if user:
> +            uid = os.getuid()
> +            uname = getpwuid(uid).pw_name
> +            tmp_df.write("\n")
> +            tmp_df.write("RUN id %s || useradd -u %d -U %s" %
> +                         (uname, uid, uname))

Please "2>/dev/null" the id command.

> +
>          tmp_df.write("\n")
>          tmp_df.write("LABEL com.qemu.dockerfile-checksum=%s" %
>                       _text_checksum(dockerfile))
> @@ -225,6 +234,9 @@ class BuildCommand(SubCommand):
>                              help="""Specify a binary that will be copied to the
>                              container together with all its dependent
>                              libraries""")
> +        parser.add_argument("--add-current-user", "-u", dest="user",
> +                            action="store_true",
> +                            help="Add the current user to image's passwd")
>          parser.add_argument("tag",
>                              help="Image Tag")
>          parser.add_argument("dockerfile",
> @@ -261,7 +273,7 @@ class BuildCommand(SubCommand):
>                                         docker_dir)
>  
>              dkr.build_image(tag, docker_dir, dockerfile,
> -                            quiet=args.quiet, argv=argv)
> +                            quiet=args.quiet, user=args.user, argv=argv)
>  
>              rmtree(docker_dir)
>  
> -- 
> 2.11.0
> 

Fam

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH v4 2/4] new: debian docker targets for cross-compiling
  2017-02-16 12:34 ` [Qemu-devel] [PATCH v4 2/4] new: debian docker targets for cross-compiling Alex Bennée
@ 2017-02-16 13:19   ` Fam Zheng
  2017-02-19  4:34   ` Philippe Mathieu-Daudé
  1 sibling, 0 replies; 15+ messages in thread
From: Fam Zheng @ 2017-02-16 13:19 UTC (permalink / raw)
  To: Alex Bennée; +Cc: qemu-devel

On Thu, 02/16 12:34, Alex Bennée wrote:
> diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include
> index 4778b27ca8..84bdcc944a 100644
> --- a/tests/docker/Makefile.include
> +++ b/tests/docker/Makefile.include
> @@ -54,6 +54,10 @@ docker-image-%: $(DOCKER_FILES_DIR)/%.docker
>  		$(if $(EXECUTABLE),--include-executable=$(EXECUTABLE)),\
>  		"BUILD","$*")
>  
> +# Enforce dependancies for composite images
> +docker-image-debian-armhf-cross: docker-image-debian
> +docker-image-debian-arm64-cross: docker-image-debian
> +

This is an interesting way to reuse parts, thanks!

Reviewed-by: Fam Zheng <famz@redhat.com>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH v4 4/4] MAINTAINERS: merge Build and test automation with Docker tests
  2017-02-16 12:34 ` [Qemu-devel] [PATCH v4 4/4] MAINTAINERS: merge Build and test automation with Docker tests Alex Bennée
@ 2017-02-16 13:23   ` Fam Zheng
  0 siblings, 0 replies; 15+ messages in thread
From: Fam Zheng @ 2017-02-16 13:23 UTC (permalink / raw)
  To: Alex Bennée; +Cc: qemu-devel

On Thu, 02/16 12:34, Alex Bennée wrote:
> The docker framework is really just another piece in the build
> automation puzzle so lets merge it together. For added bonus I've also
> included the Travis and Patchew status links. The Shippable links will
> be added later once mainline tests have been configured and setup.
> 
> Suggested-by: Fam Zheng <famz@redhat.com>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> ---
>  MAINTAINERS | 13 ++++++-------
>  1 file changed, 6 insertions(+), 7 deletions(-)
> 
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 7afbadaa15..4e4a3fb83c 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -1802,9 +1802,14 @@ F: docs/block-replication.txt
>  Build and test automation
>  -------------------------
>  M: Alex Bennée <alex.bennee@linaro.org>
> +M: Fam Zheng <famz@redhat.com>
>  L: qemu-devel@nongnu.org
> -S: Supported
> +S: Maintained

Yes:

> Supported:	Someone is actually paid to look after this.
> Maintained:	Someone actually looks after it.

While I'm paid to work on QEMU upstream, docker testing is not stricly my job
responsibility. So as for patchew. That's probably why I put 'maintained'
before.

>  F: .travis.yml
> +F: .shippable.yml

This line could be pulled into patch 3.

> +F: tests/docker/
> +W: https://travis-ci.org/qemu/qemu
> +W: http://patchew.org/QEMU/

Thanks for the link!

If you move the 'shippable.yml' line:

Reviewed-by: Fam Zheng <famz@redhat.com>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH v4 3/4] .shippable.yml: new CI provider
  2017-02-16 12:34 ` [Qemu-devel] [PATCH v4 3/4] .shippable.yml: new CI provider Alex Bennée
@ 2017-02-16 13:31   ` Fam Zheng
  2017-02-16 19:40     ` Alex Bennée
  0 siblings, 1 reply; 15+ messages in thread
From: Fam Zheng @ 2017-02-16 13:31 UTC (permalink / raw)
  To: Alex Bennée; +Cc: qemu-devel

On Thu, 02/16 12:34, Alex Bennée wrote:
> Ostensibly Shippable offers a similar set of services as Travis.
> However they are focused on Docker container based work-flows so we
> can use our existing containers to run a few extra builds - in this
> case a bunch of cross-compiled targets on a Debian multiarch system.

Out of curiosity, what are the forms of build report from shippable service?

> 
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> 
> ---
> v3
>   - reduce matrix to armhf/arm64 which currently work
>   - use the make docker-image-* build stanzas
>   - add TARGET_LIST to each build
> ---
>  .shippable.yml | 21 +++++++++++++++++++++
>  1 file changed, 21 insertions(+)
>  create mode 100644 .shippable.yml
> 
> diff --git a/.shippable.yml b/.shippable.yml
> new file mode 100644
> index 0000000000..4de8daf341
> --- /dev/null
> +++ b/.shippable.yml
> @@ -0,0 +1,21 @@
> +language: c
> +env:
> +  matrix:
> +    - IMAGE=debian-armhf-cross
> +      TARGET_LIST=arm-softmmu,arm-linux-user
> +    - IMAGE=debian-arm64-cross
> +      TARGET_LIST=aarch64-softmmu,aarch64-linux-user
> +    - IMAGE=centos6
> +      TARGET_LIST=i386-softmmu,x86_64-softmmu
> +build:
> +  pre_ci:
> +    - make docker-image-${IMAGE}
> +  pre_ci_boot:
> +    image_name: qemu
> +    image_tag: ${IMAGE}
> +    pull: false
> +    options: "-e HOME=/root"
> +  ci:
> +    - unset CC
> +    - ./configure ${QEMU_CONFIGURE_OPTS} --target-list=${TARGET_LIST}
> +    - make -j2

It's a good surprise that our docker infrastructure fits in the shippable
framework pretty nicely. :)

Looks good to me without cross checking the shippable API:

Reviewed-by: Fam Zheng <famz@redhat.com>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH v4 0/4] Docker cross-compile targets and user build support
  2017-02-16 12:34 [Qemu-devel] [PATCH v4 0/4] Docker cross-compile targets and user build support Alex Bennée
                   ` (3 preceding siblings ...)
  2017-02-16 12:34 ` [Qemu-devel] [PATCH v4 4/4] MAINTAINERS: merge Build and test automation with Docker tests Alex Bennée
@ 2017-02-16 13:36 ` Fam Zheng
  4 siblings, 0 replies; 15+ messages in thread
From: Fam Zheng @ 2017-02-16 13:36 UTC (permalink / raw)
  To: Alex Bennée; +Cc: qemu-devel

On Thu, 02/16 12:34, Alex Bennée wrote:
> Hi Fam,
> 
> Here is the latest iteration of the docker changes incorporating your
> suggestions:
> 
>   - -u behaves safely if user already added
>   - cross containers specify QEMU_CONFIGURE_OPTS
>   - merged docker and build automation in MAINTAINERS

Thanks for iterating.  I suggested a few minor changes, after which I think it's
time to merge!

Fam

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH v4 3/4] .shippable.yml: new CI provider
  2017-02-16 13:31   ` Fam Zheng
@ 2017-02-16 19:40     ` Alex Bennée
  0 siblings, 0 replies; 15+ messages in thread
From: Alex Bennée @ 2017-02-16 19:40 UTC (permalink / raw)
  To: Fam Zheng; +Cc: qemu-devel


Fam Zheng <famz@redhat.com> writes:

> On Thu, 02/16 12:34, Alex Bennée wrote:
>> Ostensibly Shippable offers a similar set of services as Travis.
>> However they are focused on Docker container based work-flows so we
>> can use our existing containers to run a few extra builds - in this
>> case a bunch of cross-compiled targets on a Debian multiarch system.
>
> Out of curiosity, what are the forms of build report from shippable
> service?

It sends out emails and there is the web status page:

https://app.shippable.com/runs/58a596c4266ed80f003a9385/summary

There is also support for build badges a.la Travis.

>
>>
>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>>
>> ---
>> v3
>>   - reduce matrix to armhf/arm64 which currently work
>>   - use the make docker-image-* build stanzas
>>   - add TARGET_LIST to each build
>> ---
>>  .shippable.yml | 21 +++++++++++++++++++++
>>  1 file changed, 21 insertions(+)
>>  create mode 100644 .shippable.yml
>>
>> diff --git a/.shippable.yml b/.shippable.yml
>> new file mode 100644
>> index 0000000000..4de8daf341
>> --- /dev/null
>> +++ b/.shippable.yml
>> @@ -0,0 +1,21 @@
>> +language: c
>> +env:
>> +  matrix:
>> +    - IMAGE=debian-armhf-cross
>> +      TARGET_LIST=arm-softmmu,arm-linux-user
>> +    - IMAGE=debian-arm64-cross
>> +      TARGET_LIST=aarch64-softmmu,aarch64-linux-user
>> +    - IMAGE=centos6
>> +      TARGET_LIST=i386-softmmu,x86_64-softmmu
>> +build:
>> +  pre_ci:
>> +    - make docker-image-${IMAGE}
>> +  pre_ci_boot:
>> +    image_name: qemu
>> +    image_tag: ${IMAGE}
>> +    pull: false
>> +    options: "-e HOME=/root"
>> +  ci:
>> +    - unset CC
>> +    - ./configure ${QEMU_CONFIGURE_OPTS} --target-list=${TARGET_LIST}
>> +    - make -j2
>
> It's a good surprise that our docker infrastructure fits in the shippable
> framework pretty nicely. :)
>
> Looks good to me without cross checking the shippable API:
>
> Reviewed-by: Fam Zheng <famz@redhat.com>


--
Alex Bennée

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH v4 2/4] new: debian docker targets for cross-compiling
  2017-02-16 12:34 ` [Qemu-devel] [PATCH v4 2/4] new: debian docker targets for cross-compiling Alex Bennée
  2017-02-16 13:19   ` Fam Zheng
@ 2017-02-19  4:34   ` Philippe Mathieu-Daudé
  2017-02-20  9:02     ` Alex Bennée
  1 sibling, 1 reply; 15+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-02-19  4:34 UTC (permalink / raw)
  To: Alex Bennée; +Cc: famz, qemu-devel

On 02/16/2017 09:34 AM, Alex Bennée wrote:
> This provides a basic Debian install with access to the emdebian cross
> compilers. The debian-armhf-cross and debian-arm64-cross targets build
> on the basic Debian image to allow cross compiling to those targets.
>
> A new environment variable (QEMU_CONFIGURE_OPTS) is set as part of the
> docker container and passed to the build to specify the
> --cross-prefix. The user still calls the build in the usual way, for
> example:
>
>   make docker-test-build@debian-arm64-cross \
>     TARGET_LIST="aarch64-softmmu,aarch64-linux-user"
>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>
> ---
> v2
>   - add clang (keep shippable happy)
>   - rm adduser code (done direct now)
>   - add aptitude (useful for debugging package clashes)
> v3
>   - split into debian, debian-armhf-cross and debian-aarch64-cross
> v4
>   - Add QEMU_CONFIGURE_OPTS
> ---
>  tests/docker/Makefile.include                      |  4 ++++
>  tests/docker/common.rc                             |  2 +-
>  tests/docker/dockerfiles/debian-arm64-cross.docker | 15 +++++++++++++
>  tests/docker/dockerfiles/debian-armhf-cross.docker | 15 +++++++++++++
>  tests/docker/dockerfiles/debian.docker             | 25 ++++++++++++++++++++++
>  5 files changed, 60 insertions(+), 1 deletion(-)
>  create mode 100644 tests/docker/dockerfiles/debian-arm64-cross.docker
>  create mode 100644 tests/docker/dockerfiles/debian-armhf-cross.docker
>  create mode 100644 tests/docker/dockerfiles/debian.docker
>
> diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include
> index 4778b27ca8..84bdcc944a 100644
> --- a/tests/docker/Makefile.include
> +++ b/tests/docker/Makefile.include
> @@ -54,6 +54,10 @@ docker-image-%: $(DOCKER_FILES_DIR)/%.docker
>  		$(if $(EXECUTABLE),--include-executable=$(EXECUTABLE)),\
>  		"BUILD","$*")
>
> +# Enforce dependancies for composite images
> +docker-image-debian-armhf-cross: docker-image-debian
> +docker-image-debian-arm64-cross: docker-image-debian
> +
>  # Expand all the pre-requistes for each docker image and test combination
>  $(foreach i,$(DOCKER_IMAGES), \
>  	$(foreach t,$(DOCKER_TESTS) $(DOCKER_TOOLS), \
> diff --git a/tests/docker/common.rc b/tests/docker/common.rc
> index 21657e87c6..6865689bb5 100755
> --- a/tests/docker/common.rc
> +++ b/tests/docker/common.rc
> @@ -29,7 +29,7 @@ build_qemu()
>      config_opts="--enable-werror \
>                   ${TARGET_LIST:+--target-list=${TARGET_LIST}} \
>                   --prefix=$PWD/install \
> -                 $EXTRA_CONFIGURE_OPTS \
> +                 $QEMU_CONFIGURE_OPTS $EXTRA_CONFIGURE_OPTS \
>                   $@"
>      echo "Configure options:"
>      echo $config_opts
> diff --git a/tests/docker/dockerfiles/debian-arm64-cross.docker b/tests/docker/dockerfiles/debian-arm64-cross.docker
> new file mode 100644
> index 0000000000..ce90da943f
> --- /dev/null
> +++ b/tests/docker/dockerfiles/debian-arm64-cross.docker
> @@ -0,0 +1,15 @@
> +#
> +# Docker arm64 cross-compiler target
> +#
> +# This docker target builds on the base debian image.
> +#
> +FROM qemu:debian
> +
> +# Add the foreign architecture we want and install dependacies

typo "dependencies"

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

> +RUN dpkg --add-architecture arm64
> +RUN apt update
> +RUN apt install -yy crossbuild-essential-arm64
> +RUN apt-get build-dep -yy -a arm64 qemu
> +
> +# Specify the cross prefix for this image (see tests/docker/common.rc)
> +ENV QEMU_CONFIGURE_OPTS --cross-prefix=aarch64-linux-gnu-
> diff --git a/tests/docker/dockerfiles/debian-armhf-cross.docker b/tests/docker/dockerfiles/debian-armhf-cross.docker
> new file mode 100644
> index 0000000000..e0f81a556d
> --- /dev/null
> +++ b/tests/docker/dockerfiles/debian-armhf-cross.docker
> @@ -0,0 +1,15 @@
> +#
> +# Docker armhf cross-compiler target
> +#
> +# This docker target builds on the base debian image.
> +#
> +FROM qemu:debian
> +
> +# Add the foreign architecture we want and install dependacies
> +RUN dpkg --add-architecture armhf
> +RUN apt update
> +RUN apt install -yy crossbuild-essential-armhf
> +RUN apt-get build-dep -yy -a armhf qemu
> +
> +# Specify the cross prefix for this image (see tests/docker/common.rc)
> +ENV QEMU_CONFIGURE_OPTS --cross-prefix=arm-linux-gnueabihf-
> diff --git a/tests/docker/dockerfiles/debian.docker b/tests/docker/dockerfiles/debian.docker
> new file mode 100644
> index 0000000000..52bd79938e
> --- /dev/null
> +++ b/tests/docker/dockerfiles/debian.docker
> @@ -0,0 +1,25 @@
> +#
> +# Docker multiarch cross-compiler target
> +#
> +# This docker target is builds on Debian and Emdebian's cross compiler targets
> +# to build distro with a selection of cross compilers for building test binaries.
> +#
> +# On its own you can't build much but the docker-foo-cross targets
> +# build on top of the base debian image.
> +#
> +FROM debian:stable-slim
> +
> +# Setup some basic tools we need
> +RUN apt update
> +RUN apt install -yy curl aptitude
> +
> +# Setup Emdebian
> +RUN echo "deb http://emdebian.org/tools/debian/ jessie main" >> /etc/apt/sources.list
> +RUN curl http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | apt-key add -
> +
> +# Duplicate deb line as deb-src
> +RUN cat /etc/apt/sources.list | sed "s/deb/deb-src/" >> /etc/apt/sources.list
> +
> +# Install common build utilities
> +RUN apt update
> +RUN apt install -yy build-essential clang
>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH v4 1/4] tests/docker: add basic user mapping support
  2017-02-16 12:34 ` [Qemu-devel] [PATCH v4 1/4] tests/docker: add basic user mapping support Alex Bennée
  2017-02-16 13:15   ` Fam Zheng
@ 2017-02-19  5:24   ` Philippe Mathieu-Daudé
  2017-02-20  9:01     ` Alex Bennée
  1 sibling, 1 reply; 15+ messages in thread
From: Philippe Mathieu-Daudé @ 2017-02-19  5:24 UTC (permalink / raw)
  To: Alex Bennée; +Cc: famz, qemu-devel

Hi Alex,

I first tried "make docker-image-debian-armhf-cross NOUSER=1 V=1" which 
worked fine, then "make docker-image-debian-armhf-cross NOUSER=0" but 
got a "Image is up to date." I thought I should have to remove the image 
manually so I typed "docker rmi qemu:debian-armhf-cross" and tried again 
but still no change in my 
tests/docker/dockerfiles/debian-armhf-cross.docker adding my username, 
then I reviewed your change in the Makefile and got it, setting NOUSER 
to '0' has the same behavior, it's just set. To build the image with my 
user I had to _not_ use the flag or use it unset "NOUSER=" and it worked 
like charm.


On 02/16/2017 09:34 AM, Alex Bennée wrote:
> Currently all docker builds are done by exporting a tarball to the
> docker container and running the build as the containers root user.
> Other use cases are possible however and it is possible to map a part
> of users file-system to the container. This is useful for example for
> doing cross-builds of arbitrary source trees. For this to work
> smoothly the container needs to have a user created that maps cleanly
> to the host system.
>
> This adds a -u option to the docker script so that:
>
>   DEB_ARCH=armhf DEB_TYPE=stable ./tests/docker/docker.py build \
>     -u --include-executable=arm-linux-user/qemu-arm \
>     debian:armhf ./tests/docker/dockerfiles/debian-bootstrap.docker
>
> Will build a container that can then be run like:
>
>   docker run --rm -it -v /home/alex/lsrc/qemu/risu.git/:/src \
>     --user=alex:alex -w /src/ debian:armhf \
>     sh -c "make clean && ./configure -s && make"
>
> All docker containers built will add the current user unless
> explicitly disabled by specifying NOUSER when invoking the Makefile:
>
>   make docker-image-debian-armhf-cross NOUSER=1
>
> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
> Reviewed-by: Fam Zheng <famz@redhat.com>

Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

> ---
> v2
>   - write the useradd directly
>   - change long option to --add-current-user
> v3
>   - images -> image's
>   - add r-b
>   - add USER to Makefile
> v4
>   - s/USER/NOUSER/ and default to on
>   - fix the add-user code to skip if user already setup (for chained images)
> ---
>  tests/docker/Makefile.include |  2 ++
>  tests/docker/docker.py        | 16 ++++++++++++++--
>  2 files changed, 16 insertions(+), 2 deletions(-)
>
> diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include
> index 3f15d5aea8..4778b27ca8 100644
> --- a/tests/docker/Makefile.include
> +++ b/tests/docker/Makefile.include
> @@ -50,6 +50,7 @@ docker-image-%: $(DOCKER_FILES_DIR)/%.docker
>  	$(call quiet-command,\
>  		$(SRC_PATH)/tests/docker/docker.py build qemu:$* $< \
>  		$(if $V,,--quiet) $(if $(NOCACHE),--no-cache) \
> +		$(if $(NOUSER),,--add-current-user) \
>  		$(if $(EXECUTABLE),--include-executable=$(EXECUTABLE)),\
>  		"BUILD","$*")
>
> @@ -99,6 +100,7 @@ docker:
>  	@echo '                         (default is 1)'
>  	@echo '    DEBUG=1              Stop and drop to shell in the created container'
>  	@echo '                         before running the command.'
> +	@echo '    NOUSER=1		Disable adding current user to containers passwd.'
>  	@echo '    NOCACHE=1            Ignore cache when build images.'
>  	@echo '    EXECUTABLE=<path>    Include executable in image.'
>
> diff --git a/tests/docker/docker.py b/tests/docker/docker.py
> index 37d83199e7..d277a2268f 100755
> --- a/tests/docker/docker.py
> +++ b/tests/docker/docker.py
> @@ -25,6 +25,7 @@ import signal
>  from tarfile import TarFile, TarInfo
>  from StringIO import StringIO
>  from shutil import copy, rmtree
> +from pwd import getpwuid
>
>
>  DEVNULL = open(os.devnull, 'wb')
> @@ -149,13 +150,21 @@ class Docker(object):
>          labels = json.loads(resp)[0]["Config"].get("Labels", {})
>          return labels.get("com.qemu.dockerfile-checksum", "")
>
> -    def build_image(self, tag, docker_dir, dockerfile, quiet=True, argv=None):
> +    def build_image(self, tag, docker_dir, dockerfile,
> +                    quiet=True, user=False, argv=None):
>          if argv == None:
>              argv = []
>
>          tmp_df = tempfile.NamedTemporaryFile(dir=docker_dir, suffix=".docker")
>          tmp_df.write(dockerfile)
>
> +        if user:
> +            uid = os.getuid()
> +            uname = getpwuid(uid).pw_name
> +            tmp_df.write("\n")
> +            tmp_df.write("RUN id %s || useradd -u %d -U %s" %
> +                         (uname, uid, uname))
> +
>          tmp_df.write("\n")
>          tmp_df.write("LABEL com.qemu.dockerfile-checksum=%s" %
>                       _text_checksum(dockerfile))
> @@ -225,6 +234,9 @@ class BuildCommand(SubCommand):
>                              help="""Specify a binary that will be copied to the
>                              container together with all its dependent
>                              libraries""")
> +        parser.add_argument("--add-current-user", "-u", dest="user",
> +                            action="store_true",
> +                            help="Add the current user to image's passwd")
>          parser.add_argument("tag",
>                              help="Image Tag")
>          parser.add_argument("dockerfile",
> @@ -261,7 +273,7 @@ class BuildCommand(SubCommand):
>                                         docker_dir)
>
>              dkr.build_image(tag, docker_dir, dockerfile,
> -                            quiet=args.quiet, argv=argv)
> +                            quiet=args.quiet, user=args.user, argv=argv)
>
>              rmtree(docker_dir)
>
>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH v4 1/4] tests/docker: add basic user mapping support
  2017-02-19  5:24   ` Philippe Mathieu-Daudé
@ 2017-02-20  9:01     ` Alex Bennée
  0 siblings, 0 replies; 15+ messages in thread
From: Alex Bennée @ 2017-02-20  9:01 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: famz, qemu-devel


Philippe Mathieu-Daudé <f4bug@amsat.org> writes:

> Hi Alex,
>
> I first tried "make docker-image-debian-armhf-cross NOUSER=1 V=1"
> which worked fine, then "make docker-image-debian-armhf-cross
> NOUSER=0" but got a "Image is up to date." I thought I should have to
> remove the image manually so I typed "docker rmi
> qemu:debian-armhf-cross" and tried again but still no change in my
> tests/docker/dockerfiles/debian-armhf-cross.docker adding my username,
> then I reviewed your change in the Makefile and got it, setting NOUSER
> to '0' has the same behavior, it's just set. To build the image with
> my user I had to _not_ use the flag or use it unset "NOUSER=" and it
> worked like charm.

Ahh yes. I followed the same pattern as NOCACHE which does the same
thing. I've made it clearer:

	@echo '    NOUSER               Define to disable adding current user to containers passwd.'

>
>
> On 02/16/2017 09:34 AM, Alex Bennée wrote:
>> Currently all docker builds are done by exporting a tarball to the
>> docker container and running the build as the containers root user.
>> Other use cases are possible however and it is possible to map a part
>> of users file-system to the container. This is useful for example for
>> doing cross-builds of arbitrary source trees. For this to work
>> smoothly the container needs to have a user created that maps cleanly
>> to the host system.
>>
>> This adds a -u option to the docker script so that:
>>
>>   DEB_ARCH=armhf DEB_TYPE=stable ./tests/docker/docker.py build \
>>     -u --include-executable=arm-linux-user/qemu-arm \
>>     debian:armhf ./tests/docker/dockerfiles/debian-bootstrap.docker
>>
>> Will build a container that can then be run like:
>>
>>   docker run --rm -it -v /home/alex/lsrc/qemu/risu.git/:/src \
>>     --user=alex:alex -w /src/ debian:armhf \
>>     sh -c "make clean && ./configure -s && make"
>>
>> All docker containers built will add the current user unless
>> explicitly disabled by specifying NOUSER when invoking the Makefile:
>>
>>   make docker-image-debian-armhf-cross NOUSER=1
>>
>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>> Reviewed-by: Fam Zheng <famz@redhat.com>
>
> Tested-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>

Thanks

>
>> ---
>> v2
>>   - write the useradd directly
>>   - change long option to --add-current-user
>> v3
>>   - images -> image's
>>   - add r-b
>>   - add USER to Makefile
>> v4
>>   - s/USER/NOUSER/ and default to on
>>   - fix the add-user code to skip if user already setup (for chained images)
>> ---
>>  tests/docker/Makefile.include |  2 ++
>>  tests/docker/docker.py        | 16 ++++++++++++++--
>>  2 files changed, 16 insertions(+), 2 deletions(-)
>>
>> diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include
>> index 3f15d5aea8..4778b27ca8 100644
>> --- a/tests/docker/Makefile.include
>> +++ b/tests/docker/Makefile.include
>> @@ -50,6 +50,7 @@ docker-image-%: $(DOCKER_FILES_DIR)/%.docker
>>  	$(call quiet-command,\
>>  		$(SRC_PATH)/tests/docker/docker.py build qemu:$* $< \
>>  		$(if $V,,--quiet) $(if $(NOCACHE),--no-cache) \
>> +		$(if $(NOUSER),,--add-current-user) \
>>  		$(if $(EXECUTABLE),--include-executable=$(EXECUTABLE)),\
>>  		"BUILD","$*")
>>
>> @@ -99,6 +100,7 @@ docker:
>>  	@echo '                         (default is 1)'
>>  	@echo '    DEBUG=1              Stop and drop to shell in the created container'
>>  	@echo '                         before running the command.'
>> +	@echo '    NOUSER=1		Disable adding current user to containers passwd.'
>>  	@echo '    NOCACHE=1            Ignore cache when build images.'
>>  	@echo '    EXECUTABLE=<path>    Include executable in image.'
>>
>> diff --git a/tests/docker/docker.py b/tests/docker/docker.py
>> index 37d83199e7..d277a2268f 100755
>> --- a/tests/docker/docker.py
>> +++ b/tests/docker/docker.py
>> @@ -25,6 +25,7 @@ import signal
>>  from tarfile import TarFile, TarInfo
>>  from StringIO import StringIO
>>  from shutil import copy, rmtree
>> +from pwd import getpwuid
>>
>>
>>  DEVNULL = open(os.devnull, 'wb')
>> @@ -149,13 +150,21 @@ class Docker(object):
>>          labels = json.loads(resp)[0]["Config"].get("Labels", {})
>>          return labels.get("com.qemu.dockerfile-checksum", "")
>>
>> -    def build_image(self, tag, docker_dir, dockerfile, quiet=True, argv=None):
>> +    def build_image(self, tag, docker_dir, dockerfile,
>> +                    quiet=True, user=False, argv=None):
>>          if argv == None:
>>              argv = []
>>
>>          tmp_df = tempfile.NamedTemporaryFile(dir=docker_dir, suffix=".docker")
>>          tmp_df.write(dockerfile)
>>
>> +        if user:
>> +            uid = os.getuid()
>> +            uname = getpwuid(uid).pw_name
>> +            tmp_df.write("\n")
>> +            tmp_df.write("RUN id %s || useradd -u %d -U %s" %
>> +                         (uname, uid, uname))
>> +
>>          tmp_df.write("\n")
>>          tmp_df.write("LABEL com.qemu.dockerfile-checksum=%s" %
>>                       _text_checksum(dockerfile))
>> @@ -225,6 +234,9 @@ class BuildCommand(SubCommand):
>>                              help="""Specify a binary that will be copied to the
>>                              container together with all its dependent
>>                              libraries""")
>> +        parser.add_argument("--add-current-user", "-u", dest="user",
>> +                            action="store_true",
>> +                            help="Add the current user to image's passwd")
>>          parser.add_argument("tag",
>>                              help="Image Tag")
>>          parser.add_argument("dockerfile",
>> @@ -261,7 +273,7 @@ class BuildCommand(SubCommand):
>>                                         docker_dir)
>>
>>              dkr.build_image(tag, docker_dir, dockerfile,
>> -                            quiet=args.quiet, argv=argv)
>> +                            quiet=args.quiet, user=args.user, argv=argv)
>>
>>              rmtree(docker_dir)
>>
>>


-- 
Alex Bennée

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [Qemu-devel] [PATCH v4 2/4] new: debian docker targets for cross-compiling
  2017-02-19  4:34   ` Philippe Mathieu-Daudé
@ 2017-02-20  9:02     ` Alex Bennée
  0 siblings, 0 replies; 15+ messages in thread
From: Alex Bennée @ 2017-02-20  9:02 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé; +Cc: famz, qemu-devel


Philippe Mathieu-Daudé <f4bug@amsat.org> writes:

> On 02/16/2017 09:34 AM, Alex Bennée wrote:
>> This provides a basic Debian install with access to the emdebian cross
>> compilers. The debian-armhf-cross and debian-arm64-cross targets build
>> on the basic Debian image to allow cross compiling to those targets.
>>
>> A new environment variable (QEMU_CONFIGURE_OPTS) is set as part of the
>> docker container and passed to the build to specify the
>> --cross-prefix. The user still calls the build in the usual way, for
>> example:
>>
>>   make docker-test-build@debian-arm64-cross \
>>     TARGET_LIST="aarch64-softmmu,aarch64-linux-user"
>>
>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>>
>> ---
>> v2
>>   - add clang (keep shippable happy)
>>   - rm adduser code (done direct now)
>>   - add aptitude (useful for debugging package clashes)
>> v3
>>   - split into debian, debian-armhf-cross and debian-aarch64-cross
>> v4
>>   - Add QEMU_CONFIGURE_OPTS
>> ---
>>  tests/docker/Makefile.include                      |  4 ++++
>>  tests/docker/common.rc                             |  2 +-
>>  tests/docker/dockerfiles/debian-arm64-cross.docker | 15 +++++++++++++
>>  tests/docker/dockerfiles/debian-armhf-cross.docker | 15 +++++++++++++
>>  tests/docker/dockerfiles/debian.docker             | 25 ++++++++++++++++++++++
>>  5 files changed, 60 insertions(+), 1 deletion(-)
>>  create mode 100644 tests/docker/dockerfiles/debian-arm64-cross.docker
>>  create mode 100644 tests/docker/dockerfiles/debian-armhf-cross.docker
>>  create mode 100644 tests/docker/dockerfiles/debian.docker
>>
>> diff --git a/tests/docker/Makefile.include b/tests/docker/Makefile.include
>> index 4778b27ca8..84bdcc944a 100644
>> --- a/tests/docker/Makefile.include
>> +++ b/tests/docker/Makefile.include
>> @@ -54,6 +54,10 @@ docker-image-%: $(DOCKER_FILES_DIR)/%.docker
>>  		$(if $(EXECUTABLE),--include-executable=$(EXECUTABLE)),\
>>  		"BUILD","$*")
>>
>> +# Enforce dependancies for composite images
>> +docker-image-debian-armhf-cross: docker-image-debian
>> +docker-image-debian-arm64-cross: docker-image-debian
>> +
>>  # Expand all the pre-requistes for each docker image and test combination
>>  $(foreach i,$(DOCKER_IMAGES), \
>>  	$(foreach t,$(DOCKER_TESTS) $(DOCKER_TOOLS), \
>> diff --git a/tests/docker/common.rc b/tests/docker/common.rc
>> index 21657e87c6..6865689bb5 100755
>> --- a/tests/docker/common.rc
>> +++ b/tests/docker/common.rc
>> @@ -29,7 +29,7 @@ build_qemu()
>>      config_opts="--enable-werror \
>>                   ${TARGET_LIST:+--target-list=${TARGET_LIST}} \
>>                   --prefix=$PWD/install \
>> -                 $EXTRA_CONFIGURE_OPTS \
>> +                 $QEMU_CONFIGURE_OPTS $EXTRA_CONFIGURE_OPTS \
>>                   $@"
>>      echo "Configure options:"
>>      echo $config_opts
>> diff --git a/tests/docker/dockerfiles/debian-arm64-cross.docker b/tests/docker/dockerfiles/debian-arm64-cross.docker
>> new file mode 100644
>> index 0000000000..ce90da943f
>> --- /dev/null
>> +++ b/tests/docker/dockerfiles/debian-arm64-cross.docker
>> @@ -0,0 +1,15 @@
>> +#
>> +# Docker arm64 cross-compiler target
>> +#
>> +# This docker target builds on the base debian image.
>> +#
>> +FROM qemu:debian
>> +
>> +# Add the foreign architecture we want and install dependacies
>
> typo "dependencies"

Fixed, thanks.

>
> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>
>> +RUN dpkg --add-architecture arm64
>> +RUN apt update
>> +RUN apt install -yy crossbuild-essential-arm64
>> +RUN apt-get build-dep -yy -a arm64 qemu
>> +
>> +# Specify the cross prefix for this image (see tests/docker/common.rc)
>> +ENV QEMU_CONFIGURE_OPTS --cross-prefix=aarch64-linux-gnu-
>> diff --git a/tests/docker/dockerfiles/debian-armhf-cross.docker b/tests/docker/dockerfiles/debian-armhf-cross.docker
>> new file mode 100644
>> index 0000000000..e0f81a556d
>> --- /dev/null
>> +++ b/tests/docker/dockerfiles/debian-armhf-cross.docker
>> @@ -0,0 +1,15 @@
>> +#
>> +# Docker armhf cross-compiler target
>> +#
>> +# This docker target builds on the base debian image.
>> +#
>> +FROM qemu:debian
>> +
>> +# Add the foreign architecture we want and install dependacies
>> +RUN dpkg --add-architecture armhf
>> +RUN apt update
>> +RUN apt install -yy crossbuild-essential-armhf
>> +RUN apt-get build-dep -yy -a armhf qemu
>> +
>> +# Specify the cross prefix for this image (see tests/docker/common.rc)
>> +ENV QEMU_CONFIGURE_OPTS --cross-prefix=arm-linux-gnueabihf-
>> diff --git a/tests/docker/dockerfiles/debian.docker b/tests/docker/dockerfiles/debian.docker
>> new file mode 100644
>> index 0000000000..52bd79938e
>> --- /dev/null
>> +++ b/tests/docker/dockerfiles/debian.docker
>> @@ -0,0 +1,25 @@
>> +#
>> +# Docker multiarch cross-compiler target
>> +#
>> +# This docker target is builds on Debian and Emdebian's cross compiler targets
>> +# to build distro with a selection of cross compilers for building test binaries.
>> +#
>> +# On its own you can't build much but the docker-foo-cross targets
>> +# build on top of the base debian image.
>> +#
>> +FROM debian:stable-slim
>> +
>> +# Setup some basic tools we need
>> +RUN apt update
>> +RUN apt install -yy curl aptitude
>> +
>> +# Setup Emdebian
>> +RUN echo "deb http://emdebian.org/tools/debian/ jessie main" >> /etc/apt/sources.list
>> +RUN curl http://emdebian.org/tools/debian/emdebian-toolchain-archive.key | apt-key add -
>> +
>> +# Duplicate deb line as deb-src
>> +RUN cat /etc/apt/sources.list | sed "s/deb/deb-src/" >> /etc/apt/sources.list
>> +
>> +# Install common build utilities
>> +RUN apt update
>> +RUN apt install -yy build-essential clang
>>


-- 
Alex Bennée

^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2017-02-20  9:02 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-02-16 12:34 [Qemu-devel] [PATCH v4 0/4] Docker cross-compile targets and user build support Alex Bennée
2017-02-16 12:34 ` [Qemu-devel] [PATCH v4 1/4] tests/docker: add basic user mapping support Alex Bennée
2017-02-16 13:15   ` Fam Zheng
2017-02-19  5:24   ` Philippe Mathieu-Daudé
2017-02-20  9:01     ` Alex Bennée
2017-02-16 12:34 ` [Qemu-devel] [PATCH v4 2/4] new: debian docker targets for cross-compiling Alex Bennée
2017-02-16 13:19   ` Fam Zheng
2017-02-19  4:34   ` Philippe Mathieu-Daudé
2017-02-20  9:02     ` Alex Bennée
2017-02-16 12:34 ` [Qemu-devel] [PATCH v4 3/4] .shippable.yml: new CI provider Alex Bennée
2017-02-16 13:31   ` Fam Zheng
2017-02-16 19:40     ` Alex Bennée
2017-02-16 12:34 ` [Qemu-devel] [PATCH v4 4/4] MAINTAINERS: merge Build and test automation with Docker tests Alex Bennée
2017-02-16 13:23   ` Fam Zheng
2017-02-16 13:36 ` [Qemu-devel] [PATCH v4 0/4] Docker cross-compile targets and user build support Fam Zheng

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.