Hello community, here is the log from the commit of package docker for openSUSE:Factory checked in at 2019-03-26 22:28:10 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/docker (Old) and /work/SRC/openSUSE:Factory/.docker.new.25356 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "docker" Tue Mar 26 22:28:10 2019 rev:88 rq:688119 version:18.09.3_ce Changes: -------- --- /work/SRC/openSUSE:Factory/docker/docker.changes 2019-02-27 21:11:42.579196565 +0100 +++ /work/SRC/openSUSE:Factory/.docker.new.25356/docker.changes 2019-03-26 22:28:11.693766999 +0100 @@ -1,0 +2,15 @@ +Fri Mar 22 09:19:28 UTC 2019 - Sascha Grunert <[email protected]> + +- Update to Docker 18.09.3-ce. See upstream changelog in the packaged + /usr/share/doc/packages/docker/CHANGELOG.md. + +------------------------------------------------------------------- +Sun Mar 10 21:12:09 UTC 2019 - Aleksa Sarai <[email protected]> + +- docker-test: improvements to test packaging (we don't need to ship around the + entire source tree, and we also need to build the born-again integration/ + tests which contain a suite-per-directory). We also need a new patch which + fixes the handling of *-test images. bsc#1128746 + + bsc1128746-0001-integration-cli-don-t-build-test-images-if-they-alre.patch + +------------------------------------------------------------------- Old: ---- docker-18.09.1_ce.4c52b901c6cb.tar.xz New: ---- bsc1128746-0001-integration-cli-don-t-build-test-images-if-they-alre.patch docker-18.09.3_ce.774a1f4eee66.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ docker.spec ++++++ --- /var/tmp/diff_new_pack.ydKF6e/_old 2019-03-26 22:28:12.665766764 +0100 +++ /var/tmp/diff_new_pack.ydKF6e/_new 2019-03-26 22:28:12.673766762 +0100 @@ -42,17 +42,17 @@ # helpfully injects into our build environment from the changelog). If you want # to generate a new git_commit_epoch, use this: # $ date --date="$(git show --format=fuller --date=iso $COMMIT_ID | grep -oP '(?<=^CommitDate: ).*')" '+%s' -%define git_version 4c52b901c6cb -%define git_commit_epoch 1547060456 +%define git_version 774a1f4eee66 +%define git_commit_epoch 1551333049 # These are the git commits required. We verify them against the source to make # sure we didn't miss anything important when doing upgrades. -%define required_containerd 9754871865f7fe2f4e74d43e2fc7ccd237edcbce -%define required_dockerrunc 96ec2177ae841256168fcf76954f7177af9446eb +%define required_containerd e6b3f5632f50dbc4e9cb6288d911bf4f5e95b18e +%define required_dockerrunc 6635b4f0c6af3810594d2770f662f34ddc15b40d %define required_libnetwork 2cfbf9b1f98162a55829a21cc603c76072a75382 Name: %{realname}%{name_suffix} -Version: 18.09.1_ce +Version: 18.09.3_ce Release: 0 Summary: The Linux container runtime License: Apache-2.0 @@ -90,11 +90,13 @@ # SUSE-FEATURE: Add support to mirror inofficial/private registries # (https://github.com/docker/docker/pull/34319) Patch500: private-registry-0001-Add-private-registry-mirror-support.patch +# SUSE-BACKPORT: Backport of test-only patch https://github.com/moby/moby/pull/38853. bsc1128746 +Patch900: bsc1128746-0001-integration-cli-don-t-build-test-images-if-they-alre.patch BuildRequires: audit BuildRequires: bash-completion BuildRequires: ca-certificates BuildRequires: device-mapper-devel >= 1.2.68 -BuildRequires: glibc-devel-static +BuildRequires: fdupes BuildRequires: libapparmor-devel BuildRequires: libbtrfs-devel >= 3.8 BuildRequires: libseccomp-devel >= 2.2 @@ -217,17 +219,13 @@ %package test %global __requires_exclude ^libgo.so.*$ Summary: Test package for docker +# Needed for test-suite. Group: System/Management -BuildRequires: fdupes -Requires: apparmor-parser -Requires: bash-completion -Requires: device-mapper-devel >= 1.2.68 -Requires: glibc-devel-static -Requires: libapparmor-devel -Requires: libbtrfs-devel >= 3.8 -Requires: procps -Requires: sqlite3-devel -Requires: golang(API) = 1.8 +Requires: curl +Requires: go +Requires: iputils +Requires: jq +Requires: net-tools-deprecated # KUBIC-SPECIFIC: This was required when upgrading from the original kubic # packaging, when everything was renamed to -kubic. It also is # used to ensure that nothing complains too much when using @@ -279,9 +277,10 @@ # PATCH-SUSE: Mirror patch. %patch500 -p1 %endif +# bsc#1128746 +%patch900 -p1 cp %{SOURCE7} . -cp %{SOURCE9} . %build BUILDTAGS="exclude_graphdriver_aufs apparmor selinux seccomp pkcs11" @@ -317,19 +316,32 @@ ln -s $(pwd)/components/cli $(pwd)/src/github.com/docker/cli export GOPATH=$GOPATH:$(pwd) -# DOCKER ENGINE +################### +## DOCKER ENGINE ## +################### + pushd components/engine/ -# ignore the warning that we compile outside a Docker container +# Ignore the warning that we compile outside a Docker container. ./hack/make.sh dynbinary -# build the tests binary -GOPATH=$(pwd)/vendor:$(pwd)/.gopath/ go test \ + +# Build test binaries (integration-cli and integration/*). They are all stored +# within the testdir -- we will only end up installing these test files for +# docker-test. +for testdir in {integration-cli,integration/*/} +do + ( find "$testdir" -name '*_test.go' | grep -q '.' ) || continue + GOPATH=$(pwd)/vendor:$(pwd)/.gopath/ go test \ -buildmode=pie \ -tags "$DOCKER_BUILDTAGS daemon autogen" \ - -c github.com/docker/docker/integration-cli -o tests.main + -c "github.com/docker/docker/$testdir" -o "$testdir/tests.main" +done popd -# DOCKER CLIENT -pushd components/cli +################### +## DOCKER CLIENT ## +################### + +pushd components/cli/ ./scripts/build/dynbinary mkdir -p ./man/man1 @@ -354,7 +366,6 @@ grep 'LIBNETWORK_COMMIT=%{required_libnetwork}' hack/dockerfile/install/proxy.installer %install -install -d %{buildroot}%{go_contribdir} install -d %{buildroot}%{_bindir} install -D -m755 components/cli/build/docker %{buildroot}/%{_bindir}/docker install -D -m755 components/engine/bundles/latest/dynbinary-daemon/dockerd %{buildroot}/%{_bindir}/dockerd @@ -365,10 +376,6 @@ install -D -m0644 components/cli/contrib/completion/bash/docker "%{buildroot}%{_sysconfdir}/bash_completion.d/%{realname}" install -D -m0644 components/cli/contrib/completion/zsh/_docker "%{buildroot}%{_sysconfdir}/zsh_completion.d/%{realname}" -# copy all for the test package -install -d %{buildroot}%{_prefix}/src/docker/ -cp -a components/engine/. %{buildroot}%{_prefix}/src/docker/engine -cp -a components/cli/. %{buildroot}%{_prefix}/src/docker/cli # # systemd service @@ -402,6 +409,18 @@ install -d %{buildroot}%{_mandir}/man8 install -p -m 644 components/cli/man/man8/*.8 %{buildroot}%{_mandir}/man8 +# install docker-test files -- we want to avoid installing the entire source tree. +install -d %{buildroot}%{_prefix}/src/docker/ +install -D -m0755 %{SOURCE9} %{buildroot}%{_prefix}/src/docker/tests.sh +# We need hack/, contrib/, profiles/, and the integration*/ trees. +cp -a components/engine/{hack,contrib,profiles,integration{,-cli}} %{buildroot}%{_prefix}/src/docker/ +echo "%{version}" > %{buildroot}%{_prefix}/src/docker/VERSION +# And now we can remove all *_test.go files -- since we already have test +# binaries. Due to a lot of hacks within the Docker integration tests, we can't +# really do a bigger cleanup than this. +find %{buildroot}%{_prefix}/src/docker \ + -type f -name '*_test.go' -delete + %if "%flavour" == "kubic" # place kubelet.env in fillupdir (for kubeadm-criconfig) install -D -m 0644 %{SOURCE5} %{buildroot}%{_fillupdir}/sysconfig.kubelet @@ -473,14 +492,6 @@ %files test %defattr(-,root,root) %{_prefix}/src/docker/ -# exclude binaries -%exclude %{_prefix}/src/docker/engine/bundles/ -%exclude %{_prefix}/src/docker/cli/build/ -# exclude init configurations other than systemd -%exclude %{_prefix}/src/docker/engine/contrib/init/openrc -%exclude %{_prefix}/src/docker/engine/contrib/init/sysvinit-debian -%exclude %{_prefix}/src/docker/engine/contrib/init/sysvinit-redhat -%exclude %{_prefix}/src/docker/engine/contrib/init/upstart %if "%flavour" == "kubic" %files kubeadm-criconfig ++++++ _service ++++++ --- /var/tmp/diff_new_pack.ydKF6e/_old 2019-03-26 22:28:12.733766747 +0100 +++ /var/tmp/diff_new_pack.ydKF6e/_new 2019-03-26 22:28:12.733766747 +0100 @@ -3,8 +3,8 @@ <param name="url">https://github.com/docker/docker-ce.git</param> <param name="scm">git</param> <param name="exclude">.git</param> - <param name="versionformat">18.09.1_ce.%h</param> - <param name="revision">v18.09.1</param> + <param name="versionformat">18.09.3_ce.%h</param> + <param name="revision">v18.09.3</param> <param name="filename">docker</param> </service> <service name="recompress" mode="disabled"> ++++++ bsc1128746-0001-integration-cli-don-t-build-test-images-if-they-alre.patch ++++++ >From 87416bfab7420bb5d0b18269909eb71dcb8632c6 Mon Sep 17 00:00:00 2001 From: Aleksa Sarai <[email protected]> Date: Tue, 12 Mar 2019 18:37:31 +1100 Subject: [PATCH] integration-cli: don't build -test images if they already exist There's no need to try to re-build the test images if they already exist. This change makes basically no difference to the upstream integration test-suite running, but for users who want to run the integration-cli suite on a host machine (such as distributions doing tests) this change allows images to be pre-loaded such that compilers aren't needed on the test machine. However, this does remove the accidental re-compilation of nnp-test, as well as handling errors far more cleanly (previously if an error occurred during a test build, further tests won't attempt to rebuild it). SUSE-Bugs: bsc#1128746 Signed-off-by: Aleksa Sarai <[email protected]> --- .../fixtures_linux_daemon_test.go | 21 +++++++++-------- .../internal/test/environment/environment.go | 23 +++++++++++++++++++ 2 files changed, 35 insertions(+), 9 deletions(-) diff --git a/components/engine/integration-cli/fixtures_linux_daemon_test.go b/components/engine/integration-cli/fixtures_linux_daemon_test.go index 2387a9ebee2b..0a770a76a2a9 100644 --- a/components/engine/integration-cli/fixtures_linux_daemon_test.go +++ b/components/engine/integration-cli/fixtures_linux_daemon_test.go @@ -8,7 +8,6 @@ import ( "path/filepath" "runtime" "strings" - "sync" "github.com/docker/docker/integration-cli/checker" "github.com/docker/docker/internal/test/fixtures/load" @@ -24,17 +23,13 @@ type logT interface { Logf(string, ...interface{}) } -var ensureSyscallTestOnce sync.Once - func ensureSyscallTest(c *check.C) { - var doIt bool - ensureSyscallTestOnce.Do(func() { - doIt = true - }) - if !doIt { + defer testEnv.ProtectImage(c, "syscall-test:latest") + + // If the image already exists, there's nothing left to do. + if testEnv.HasExistingImage(c, "syscall-test:latest") { return } - defer testEnv.ProtectImage(c, "syscall-test:latest") // if no match, must build in docker, which is significantly slower // (slower mostly because of the vfs graphdriver) @@ -93,6 +88,14 @@ func ensureSyscallTestBuild(c *check.C) { func ensureNNPTest(c *check.C) { defer testEnv.ProtectImage(c, "nnp-test:latest") + + // If the image already exists, there's nothing left to do. + if testEnv.HasExistingImage(c, "nnp-test:latest") { + return + } + + // if no match, must build in docker, which is significantly slower + // (slower mostly because of the vfs graphdriver) if testEnv.OSType != runtime.GOOS { ensureNNPTestBuild(c) return diff --git a/components/engine/internal/test/environment/environment.go b/components/engine/internal/test/environment/environment.go index 74c8e2ce0ad7..e1c8a49ea8cb 100644 --- a/components/engine/internal/test/environment/environment.go +++ b/components/engine/internal/test/environment/environment.go @@ -8,9 +8,12 @@ import ( "strings" "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" "github.com/docker/docker/client" + "github.com/docker/docker/internal/test" "github.com/docker/docker/internal/test/fixtures/load" "github.com/pkg/errors" + "gotest.tools/assert" ) // Execution contains information about the current test execution and daemon @@ -145,6 +148,26 @@ func (e *Execution) APIClient() client.APIClient { return e.client } +// HasExistingImage checks whether there is an image with the given reference. +// Note that this is done by filtering and then checking whether there were any +// results -- so ambiguous references might result in false-positives. +func (e *Execution) HasExistingImage(t testingT, reference string) bool { + if ht, ok := t.(test.HelperT); ok { + ht.Helper() + } + client := e.APIClient() + filter := filters.NewArgs() + filter.Add("dangling", "false") + filter.Add("reference", reference) + imageList, err := client.ImageList(context.Background(), types.ImageListOptions{ + All: true, + Filters: filter, + }) + assert.NilError(t, err, "failed to list images") + + return len(imageList) > 0 +} + // EnsureFrozenImagesLinux loads frozen test images into the daemon // if they aren't already loaded func EnsureFrozenImagesLinux(testEnv *Execution) error { -- 2.21.0 ++++++ docker-18.09.1_ce.4c52b901c6cb.tar.xz -> docker-18.09.3_ce.774a1f4eee66.tar.xz ++++++ /work/SRC/openSUSE:Factory/docker/docker-18.09.1_ce.4c52b901c6cb.tar.xz /work/SRC/openSUSE:Factory/.docker.new.25356/docker-18.09.3_ce.774a1f4eee66.tar.xz differ: char 25, line 1 ++++++ tests.sh ++++++ --- /var/tmp/diff_new_pack.ydKF6e/_old 2019-03-26 22:28:13.009766681 +0100 +++ /var/tmp/diff_new_pack.ydKF6e/_new 2019-03-26 22:28:13.013766680 +0100 @@ -1,292 +1,205 @@ #!/bin/bash # # Script for launching the Docker integration tests +# XXX: We currently only support running integration-cli. # -#set -x - -SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +set -Eeuo pipefail DOCKER_DIR=/usr/src/docker -SCRIPTS_DIR=$DOCKER_DIR/hack -TESTS_EXE=$SCRIPTS_DIR/tests.main -VERSION=$(cat $DOCKER_DIR/VERSION) +SCRIPTS_DIR="$DOCKER_DIR/hack" +VERSION="$(cat "$DOCKER_DIR/VERSION")" # working dirs -TESTS_DIR=/tmp/docker-int-tests -BUNDLES_DIR=$TESTS_DIR/run/bundles -FAKE_GOPATH=$TESTS_DIR/go - -# some test expect the containerd socket here -CONTAINERD_SOCK=/run/containerd/containerd.sock -EXPECTED_CONTAINERD_SOCK=/var/run/docker/libcontainerd/docker-containerd.sock - -# ... and some programs -CONTAINERD_CTR=/usr/sbin/containerd-ctr -EXPECTED_CONTAINERD_CTR=/usr/local/bin/docker-containerd-ctr - -CHECK_TIMEOUT="${CHECK_TIMEOUT:-5m}" -TEST_TIMEOUT="${TEST_TIMEOUT:-60m}" -TEST_ARGS="-check.vv -check.timeout=${CHECK_TIMEOUT} -test.timeout=${TEST_TIMEOUT}" +FROZEN_IMAGES_DIR="/tmp/docker-frozen-images" +FROZEN_IMAGES_LINK=/docker-frozen-images + +readarray -t TESTS < <(find "$DOCKER_DIR/integration-cli" -type f -executable -name 'tests.main') +CHECK_TIMEOUT="${CHECK_TIMEOUT:-15m}" +TEST_TIMEOUT="${TEST_TIMEOUT:-0}" +TEST_ARGS=("-check.v" "-check.timeout=${CHECK_TIMEOUT}" "-test.timeout=${TEST_TIMEOUT}") TEST_SELECT= TEST_LOG=/tmp/docker-tests.log -ENABLE_XUNIT=${ENABLE_XUNIT:-yes} +KEEPBUNDLE="${KEEPBUNDLE:-}" -# the sysconfig file for Docker -SYSCFG_DOCKER=/etc/sysconfig/docker - -# some vars from the Dockerfile -ENABLE_NOTARY=${ENABLE_NOTARY:-} -ENABLE_REGISTRY=${ENABLE_REGISTRY:-} -REGISTRY_COMMIT_SCHEMA1=ec87e9b6971d831f0eff752ddb54fb64693e51cd -REGISTRY_COMMIT=47a064d4195a9b56133891bbb13620c3ac83a827 -NOTARY_VERSION=v0.3.0 +# the config file for Docker +CFG_DOCKER=/etc/docker/daemon.json ################################################################################ -log() { echo ">>> $@" ; } -warn() { log "WARNING: $@" ; } -error() { log "ERROR: $@" ; } -abort() { log "FATAL: $@" ; exit 1 ; } -usage() { echo "$USAGE" ; } -abort_usage() { usage ; abort $@ ; } +log() { echo ">>> $@" ; } +warn() { log "WARNING: $@" ; } +error() { log "ERROR: $@" ; } +abort() { log "FATAL: $@" ; exit 1 ; } +usage() { echo "$USAGE" ; } +abort_usage() { usage ; abort "$@" ; } bundle() { - local bundle="$1"; shift - log "Making bundle: $(basename "$bundle") (in $DEST)" - source "$SCRIPTS_DIR/make/$bundle" "$@" -} - -set_opts() { - OPT="$1" - VALUE="$2" - FILE=$3 - - perl -pi -e "s/^$OPT=.*$//g" $FILE - echo "$OPT=\"$VALUE\"" >> $FILE -} - -set_docker_opts() { set_opts "DOCKER_OPTS" "$DOCKER_OPTS" /etc/sysconfig/docker ; } -set_containerd_opts() { set_opts "CONTAINERD_OPTS" "$CONTAINERD_OPTS" /etc/sysconfig/containerd ; } - -fix_expected() { - EXPECTED=$1 - EXISTING=$2 - - exp_base=$(basename $EXPECTED) - exp_dir=$(dirname $EXPECTED) - [ -d $exp_dir ] || mkdir -p $exp_dir - rm -f $exp_dir/$exp_base - (cd $exp_dir && ln -sf $EXISTING $exp_base) -} - -save_backup() { - for x in $@ ; do - if [ ! -f $x ] ; then - touch $x.nbak - elif [ -f $x.bak ] ; then - warn "$x.bak already exists: no backup will be done" - else - cp -f $x $x.bak - fi - done + local bundle="$1"; shift + log "Making bundle: $(basename "$bundle") (in $PWD)" + local oldFlags="$-" + set +Eeu + source "$SCRIPTS_DIR/make/$bundle" "$@" + set "-$oldFlags" +} + +save_backup() { + for x in $@ ; do + if [ ! -f "$x" ] ; then + touch "$x.nbak" + elif [ -f "$x.bak" ] ; then + warn "$x.bak already exists: no backup will be done" + else + cp -f "$x" "$x.bak" + fi + done } restore_backup() { - for x in $@ ; do - if [ -f $x.nbak ] ; then - rm -f $x.nbak - else - if [ -f $x.bak ] ; then - mv -f $x.bak $x - fi - fi - done + for x in $@ ; do + if [ -f "$x.nbak" ] ; then + rm -f "$x.nbak" + elif [ -f "$x.bak" ] ; then + mv -f "$x.bak" "$x" + fi + done } -require_go() { go version >/dev/null 2>&1 ; } -require_git() { git version >/dev/null 2>&1 ; } +require_go() { go version >/dev/null 2>&1 ; } +require_git() { git version >/dev/null 2>&1 ; } ################################################################################ -[ -x $TESTS_EXE ] || abort "integration tests executable not found at $TESTS_EXE" -[ $EUID -eq 0 ] || abort "this script must be run as root" -[ -n "$VERSION" ] || abort "could not obtain version" -[ -e $CONTAINERD_SOCK ] || abort "containerd socket not found at $CONTAINERD_SOCK" -[ -x $CONTAINERD_CTR ] || abort "containerd-ctr not found at $CONTAINERD_CTR" - -if [ $# -gt 0 ] ; then - # run only some specific tests - TEST_SELECT="-check.f=$(echo $@ | tr ' ' '|')" -fi - -# We want this to fail if the bundles already exist and cannot be removed. -# This is to avoid mixing bundles from different versions of the code. -mkdir -p $BUNDLES_DIR -if [ -e "$BUNDLES_DIR/$VERSION" ] && [ -z "$KEEPBUNDLE" ]; then - log "$BUNDLES_DIR/$VERSION already exists. Removing." - rm -fr "$BUNDLES_DIR/$VERSION" && mkdir "$BUNDLES_DIR/$VERSION" || exit 1 - echo -fi - -DEST="$BUNDLES_DIR/$VERSION/" -mkdir -p "$DEST" -export DEST=$(realpath $DEST) - -# create a fake go path -rm -rf $FAKE_GOPATH -mkdir -p $FAKE_GOPATH/src/github.com/docker -(cd $FAKE_GOPATH/src/github.com/docker && ln -sf $DOCKER_DIR docker) - -if [ -n "$ENABLE_REGISTRY" ] ; then - # build the Docker registry - if [ ! -x /usr/local/bin/registry-v2 ] ; then - log "Building registry (commit:$REGISTRY_COMMIT)" - - require_git || abort "git is not installed" - require_go || abort "the Go compiler is not installed" - - export GOPATH="$(mktemp -d)" - - git clone https://github.com/docker/distribution.git "$GOPATH/src/github.com/docker/distribution" - (cd "$GOPATH/src/github.com/docker/distribution" && git checkout -q "$REGISTRY_COMMIT") - GOPATH="$GOPATH/src/github.com/docker/distribution/Godeps/_workspace:$GOPATH" \ - go build -o /usr/local/bin/registry-v2 github.com/docker/distribution/cmd/registry - (cd "$GOPATH/src/github.com/docker/distribution" && git checkout -q "$REGISTRY_COMMIT_SCHEMA1") - GOPATH="$GOPATH/src/github.com/docker/distribution/Godeps/_workspace:$GOPATH" \ - go build -o /usr/local/bin/registry-v2-schema1 github.com/docker/distribution/cmd/registry - - chmod 755 /usr/local/bin/registry-v2 - [ -x /usr/local/bin/registry-v2 ] || abort "registry-v2 could not be built" - - rm -rf "$GOPATH" - export -n GOPATH - fi -fi - -if [ -n "$ENABLE_NOTARY" ] ; then - # build the Docker notary - if [ ! -x /usr/local/bin/notary-server ] ; then - export GO15VENDOREXPERIMENT=1 - export GOPATH="$(mktemp -d)" - - require_git || abort "git is not installed" - require_go || abort "the Go compiler is not installed" - - log "Building notary (version:$NOTARY_VERSION)" - git clone https://github.com/docker/notary.git "$GOPATH/src/github.com/docker/notary" - (cd "$GOPATH/src/github.com/docker/notary" && git checkout -q "$NOTARY_VERSION") - GOPATH="$GOPATH/src/github.com/docker/notary/vendor:$GOPATH" \ - go build -o /usr/local/bin/notary-server github.com/docker/notary/cmd/notary-server - GOPATH="$GOPATH/src/github.com/docker/notary/vendor:$GOPATH" \ - go build -o /usr/local/bin/notary github.com/docker/notary/cmd/notary - - chmod 755 /usr/local/bin/notary-server - [ -x /usr/local/bin/notary-server ] || abort "notary could not be built" - - export -n GO15VENDOREXPERIMENT - - rm -rf "$GOPATH" - export -n GOPATH - fi -fi - -if [ -n "$ENABLE_XUNIT" ] ; then - if [ ! -x /usr/local/bin/go2xunit ] ; then - echo >&2 "Installing go2xunit." - - require_go || abort "the Go compiler is not installed" - - export GOPATH="$(mktemp -d)" - - go get -d github.com/tebeka/go2xunit - cd $GOPATH/src/github.com/tebeka/go2xunit && go build -o /usr/local/bin/go2xunit . - chmod 755 /usr/local/bin/go2xunit - [ -x /usr/local/bin/go2xunit ] || abort "go2xunit could not be built" - - rm -rf "$GOPATH" - export -n GOPATH - fi +[ "${#TESTS[@]}" -gt 0 ] || abort "integration tests executable not found in $DOCKER_DIR" +[ "$EUID" -eq 0 ] || abort "this script must be run as root" +[ -n "$VERSION" ] || abort "could not obtain version" + +if [ "$#" -gt 0 ] ; then + # run only some specific tests + TEST_ARGS+=( "-check.f=$(echo $@ | tr ' ' '|')" ) fi # tests require this user and group /usr/sbin/groupadd -r docker >/dev/null 2>&1 || /bin/true /usr/sbin/useradd --create-home --gid docker unprivilegeduser >/dev/null 2>&1 || /bin/true -# prepare some expected dirs, files, etc... -fix_expected $TESTS_DIR/contrib $DOCKER_DIR/contrib -fix_expected $DEST/fixtures $DOCKER_DIR/integration-cli/fixtures -fix_expected $EXPECTED_CONTAINERD_SOCK $CONTAINERD_SOCK -fix_expected $EXPECTED_CONTAINERD_CTR $CONTAINERD_CTR - export DOCKER_TEST_HOST="tcp://127.0.0.1:2375" -export PATH=/usr/local/bin:$PATH +export PATH="/usr/local/bin:$PATH" export TZ=utc -export GOPATH="$FAKE_GOPATH" export DOCKER_GRAPHDRIVER="${DOCKER_GRAPHDRIVER:-vfs}" export DOCKER_USERLANDPROXY="${DOCKER_USERLANDPROXY:-true}" -#export DOCKER_REMAP_ROOT=default +export DOCKER_STORAGE_OPTS="${DOCKER_STORAGE_OPTS:-}" +export DOCKER_REMAP_ROOT="${DOCKER_REMAP_ROOT:-}" # "default" uses dockremap -# example usage: DOCKER_STORAGE_OPTS="dm.basesize=20G,dm.loopdatasize=200G" -storage_params="" +# Example usage: DOCKER_STORAGE_OPTS="dm.basesize=20G,dm.loopdatasize=200G". +storage_opts=() if [ -n "$DOCKER_STORAGE_OPTS" ]; then - IFS=',' - for i in ${DOCKER_STORAGE_OPTS}; do - storage_params="--storage-opt $i $storage_params" - done - unset IFS + IFS=',' + for i in ${DOCKER_STORAGE_OPTS}; do + storage_opts+=("$i") + done + unset IFS fi -# example usage: DOCKER_STORAGE_OPTS="dm.basesize=20G,dm.loopdatasize=200G" -extra_params="" # deal with remapping save_backup /etc/subuid /etc/subgid -echo "dockremap:500000:65536" > /etc/subuid -echo "dockremap:500000:65536" > /etc/subgid -groupadd dockremap >/dev/null 2>&1 || /bin/true -useradd -g dockremap dockremap >/dev/null 2>&1 || /bin/true +echo "dockremap:500000:65536" >/etc/subuid +echo "dockremap:500000:65536" >/etc/subgid +groupadd dockremap >/dev/null 2>&1 || /bin/true +useradd -g dockremap dockremap >/dev/null 2>&1 || /bin/true # make sure Docker is stopped, set our config file and then start again -save_backup $SYSCFG_DOCKER -cat <<SYSCFG_DOCKER_EOF > $SYSCFG_DOCKER -DOCKER_OPTS="--log-level=debug \ - --pidfile=$DEST/docker.pid \ - -H tcp://127.0.0.1:2375 \ - --storage-driver=$DOCKER_GRAPHDRIVER \ - --userland-proxy=$DOCKER_USERLANDPROXY" -DOCKER_NETWORK_OPTIONS="" -SYSCFG_DOCKER_EOF -systemctl reload-or-restart docker.service +save_backup "$CFG_DOCKER" +cat <<CFG_DOCKER_EOF >"$CFG_DOCKER" +{ + "log-level": "debug", + "log-driver": "json-file", + "log-opts": { + "max-size": "50m", + "max-file": "5" + }, + "userns-remap": "$DOCKER_REMAP_ROOT", + "hosts": [ + "tcp://127.0.0.1:2375" + ], + "storage-driver": "$DOCKER_GRAPHDRIVER", + "storage-opts": [ + $(printf '"%s",' "${storage_opts[@]}" | sed 's/"",//g;$s/,$//') + ], + "userland-proxy": $DOCKER_USERLANDPROXY +} +CFG_DOCKER_EOF +systemctl restart docker.service cleanup() { - log "Restoring the Docker service..." - restore_backup $SYSCFG_DOCKER - systemctl reload-or-restart docker.service - - log "Removing extra files and restoring backups..." - restore_backup /etc/subuid /etc/subgid - rm -f $TESTS_DIR/contrib \ - $DEST/fixtures \ - $EXPECTED_CONTAINERD_SOCK \ - $EXPECTED_CONTAINERD_CTR + log "Restoring configuration files..." + restore_backup /etc/subuid /etc/subgid "$CFG_DOCKER" + rm -f "$FROZEN_IMAGES_LINK" + + log "Removing images and containers..." + export DOCKER_HOST="$DOCKER_TEST_HOST" + docker ps -aq | xargs docker rm -f &>/dev/null || : + docker images -q | xargs docker rmi -f &>/dev/null || : + + log "Restarting the Docker service in a pristine state..." + systemctl restart docker.service } trap cleanup EXIT -cd $DOCKER_DIR +cd "$DOCKER_DIR" + +export MAKEDIR="$SCRIPTS_DIR/make" +export DOCKER_HOST="$DOCKER_TEST_HOST" + +# Clean up all images on the host -- this is key to avoid test run failures. +log "Cleaning the environment..." +docker ps -aq | xargs docker rm -f &>/dev/null || : +docker images -q | xargs docker rmi -f &>/dev/null || : log "Preparing the environment..." -bundle .integration-daemon-start bundle .integration-daemon-setup -log "Running integration tests..." -export DOCKER_HOST=$DOCKER_TEST_HOST -cd $DEST && $TESTS_EXE $TEST_ARGS $TEST_SELECT | tee $TEST_LOG || /bin/true -if [ -n "$ENABLE_XUNIT" ] ; then - log "Generating xunit logs..." - go2xunit -fail -gocheck -input $TEST_LOG -output $TEST_LOG.xml -fi +# XXX: Really this should be sourced from the Dockerfile but this is good +# enough for now. This comes from the Docker 18.09.1-ce Dockerfile. +log "Downlading frozen images..." +mkdir -p "$FROZEN_IMAGES_DIR" +ln -sf "$FROZEN_IMAGES_DIR" "$FROZEN_IMAGES_LINK" +"$DOCKER_DIR/contrib/download-frozen-image-v2.sh" "$FROZEN_IMAGES_DIR" \ + buildpack-deps:jessie@sha256:dd86dced7c9cd2a724e779730f0a53f93b7ef42228d4344b25ce9a42a1486251 \ + busybox:latest@sha256:bbc3a03235220b170ba48a157dd097dd1379299370e1ed99ce976df0355d24f0 \ + busybox:glibc@sha256:0b55a30394294ab23b9afd58fab94e61a923f5834fba7ddbae7f8e0c11ba85e6 \ + debian:jessie@sha256:287a20c5f73087ab406e6b364833e3fb7b3ae63ca0eb3486555dc27ed32c6e60 \ + hello-world:latest@sha256:be0cd392e45be79ffeffa6b05338b98ebb16c87b255f48e297ec7f98e123905c + +# The code within integration-cli which handles building *-test images doesn't +# appear to work within our setup, not to mention we don't want to Require: a +# bunch of build tools so we just use the provided Dockerfile and +# buildpack-deps. +tar -cC "$FROZEN_IMAGES_DIR" . | docker load +for dir in "$DOCKER_DIR"/contrib/*-test +do + log "Building *-test images ($dir)..." + docker build -t "$(basename "$dir")" "$dir" +done + +# For some reason, dockerd appears to put the containerd.sock in the wrong +# place under systemd. So we just manually add a symlink for it. +[ -e "/var/run/docker/containerd/containerd.sock" ] || \ + ln -s docker-containerd.sock /var/run/docker/containerd/containerd.sock + +# And there appears to be an issue with daemon.json as a configuration format, +# so we need to hide our generated configuration. The original will be restored +# in cleanup(). +rm -f "$CFG_DOCKER" + +# Run all of our tests. +rm -f "$TEST_LOG" +for TEST in "${TESTS[@]}" +do + cd "$(dirname "$TEST")" + log "Running integration test ($TEST)..." | tee -a "$TEST_LOG" + "$TEST" "${TEST_ARGS[@]}" 2>&1 | tee -a "$TEST_LOG" || : +done export -n DOCKER_HOST - -bundle .integration-daemon-stop
