From 7ac89d127ddb559e507e77d6297498d0fef1ba9b Mon Sep 17 00:00:00 2001 From: olivier Date: Sat, 23 May 2020 11:34:02 +0200 Subject: [PATCH 01/12] Reactivate the test-case 2 to highlight issue https://github.com/docker/swarmkit/issues/2401 with docker daemon 18.09.3. --- Makefile | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/Makefile b/Makefile index 52c43bb..bfc074b 100644 --- a/Makefile +++ b/Makefile @@ -319,13 +319,11 @@ test-one-image: check # mkdir tmp # echo "dummy_password" > tmp/password_file # docker create --name mysql-test2 -v `pwd`/tmp/password_file:/tmp/root_password_file -v `pwd`/tmp/password_file:/tmp/user_password_file -e MYSQL_ROOT_PASSWORD_FILE=/tmp/root_password_file -e MYSQL_DATABASE=testdb -e MYSQL_USER=testuser -e MYSQL_PASSWORD_FILE=/tmp/user_password_file ${DOCKER_IMAGE_TAGNAME} -# The test of "biarms/mysql:5.7.30-linux-arm64v8-beta-circleci" produce a "no suitable node (unsupported platform on 1 node)" error, quite similar to https://github.com/docker/swarmkit/issues/2401..., but only on CircleCI. There is no issue on Travis ! -# Let's skip this tests globally :( . See https://github.com/biarms/mysql/issues/3 -# printf "dummy_password" | docker secret create mysql-test2-secret - -# docker service create --name mysql-test2 --secret mysql-test2-secret -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-test2-secret -e MYSQL_DATABASE=testdb -e MYSQL_USER=testuser -e MYSQL_PASSWORD_FILE=/run/secrets/mysql-test2-secret ${DOCKER_IMAGE_TAGNAME} -# while ! (docker service logs mysql-test2 2>&1 | grep 'ready for connections') ; do sleep 1; done -# docker service rm mysql-test2 -# docker secret rm mysql-test2-secret + printf "dummy_password" | docker secret create mysql-test2-secret - + docker service create --name mysql-test2 --secret mysql-test2-secret -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-test2-secret -e MYSQL_DATABASE=testdb -e MYSQL_USER=testuser -e MYSQL_PASSWORD_FILE=/run/secrets/mysql-test2-secret ${DOCKER_IMAGE_TAGNAME} + while ! (docker service logs mysql-test2 2>&1 | grep 'ready for connections') ; do sleep 1; done + docker service rm mysql-test2 + docker secret rm mysql-test2-secret # docker ps -a # rm -rf tmp From 5f4b1cde31ee2bd4c01dd3b988dbbb67318668c2 Mon Sep 17 00:00:00 2001 From: olivier Date: Sat, 23 May 2020 11:41:28 +0200 Subject: [PATCH 02/12] Only upgrade the docker server, to see if it fix https://github.com/docker/swarmkit/issues/2401 --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9e79689..267d013 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -6,6 +6,6 @@ jobs: - image: biarms/docker-toolbox:0.0.1 steps: - setup_remote_docker: - version: 18.09.3 # Max supported version was found on https://circleci.com/docs/2.0/building-docker-images/ + version: 19.03.8 # Max supported version was found on https://circleci.com/docs/2.0/building-docker-images/ - checkout - run: BETA_VERSION='-beta-circleci' make From 5da71a196df130475c60ecbd24ba4d78fbb4200e Mon Sep 17 00:00:00 2001 From: olivier Date: Sat, 23 May 2020 11:43:41 +0200 Subject: [PATCH 03/12] Final commit to upgrade to 'docker-toolbox:0.0.2' and fix https://github.com/docker/swarmkit/issues/2401 / https://github.com/biarms/mysql/issues/3 --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 267d013..9d81410 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ version: 2.1 jobs: build: docker: - - image: biarms/docker-toolbox:0.0.1 + - image: biarms/docker-toolbox:0.0.2 steps: - setup_remote_docker: version: 19.03.8 # Max supported version was found on https://circleci.com/docs/2.0/building-docker-images/ From f3eeb8d0af743274c5353ef1cd08fc03c4db2785 Mon Sep 17 00:00:00 2001 From: olivier Date: Sat, 23 May 2020 18:14:28 +0200 Subject: [PATCH 04/12] See if building with buildx could solve issue #3 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index bfc074b..4896d43 100644 --- a/Makefile +++ b/Makefile @@ -282,7 +282,7 @@ generate-test-suite: echo "Done. See the file 'testSuite.sh'" build-one-image: check - docker build -t ${DOCKER_IMAGE_TAGNAME} --build-arg VERSION="${DOCKER_IMAGE_VERSION}" --build-arg VCS_REF="${VCS_REF}" --build-arg BUILD_DATE="${BUILD_DATE}" --build-arg BUILD_ARCH="${BUILD_ARCH}" ${DOCKER_FILE} . + DOCKER_CLI_EXPERIMENTAL=enabled docker buildx build -t ${DOCKER_IMAGE_TAGNAME} --build-arg VERSION="${DOCKER_IMAGE_VERSION}" --build-arg VCS_REF="${VCS_REF}" --build-arg BUILD_DATE="${BUILD_DATE}" --build-arg BUILD_ARCH="${BUILD_ARCH}" ${DOCKER_FILE} . test-one-image: check # Smoke tests: From 8bcf02e7bac05333c0ebefaea2c144918fca20e2 Mon Sep 17 00:00:00 2001 From: olivier Date: Sun, 24 May 2020 12:56:11 +0200 Subject: [PATCH 05/12] Revert the fix for https://github.com/docker/swarmkit/issues/2401 / https://github.com/biarms/mysql/issues/3, as it doesn't work :( However, split the TC --- Makefile | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 4896d43..ec2844a 100644 --- a/Makefile +++ b/Makefile @@ -282,9 +282,9 @@ generate-test-suite: echo "Done. See the file 'testSuite.sh'" build-one-image: check - DOCKER_CLI_EXPERIMENTAL=enabled docker buildx build -t ${DOCKER_IMAGE_TAGNAME} --build-arg VERSION="${DOCKER_IMAGE_VERSION}" --build-arg VCS_REF="${VCS_REF}" --build-arg BUILD_DATE="${BUILD_DATE}" --build-arg BUILD_ARCH="${BUILD_ARCH}" ${DOCKER_FILE} . + DOCKER_CLI_EXPERIMENTAL=enabled docker build -t ${DOCKER_IMAGE_TAGNAME} --build-arg VERSION="${DOCKER_IMAGE_VERSION}" --build-arg VCS_REF="${VCS_REF}" --build-arg BUILD_DATE="${BUILD_DATE}" --build-arg BUILD_ARCH="${BUILD_ARCH}" ${DOCKER_FILE} . -test-one-image: check +run-smoke-tests: check # Smoke tests: docker run --rm ${DOCKER_IMAGE_TAGNAME} /bin/echo "Success." docker run --rm ${DOCKER_IMAGE_TAGNAME} uname -a @@ -297,6 +297,8 @@ test-one-image: check # on armv6l, it will return 'armv7l'... # docker run --rm ${DOCKER_IMAGE_NAME} mysql --version | grep "${LINUX_ARCH}" # docker run --rm ${DOCKER_IMAGE_NAME} mysqld --version | grep "${LINUX_ARCH}" + +run-tc-01: check # Test Case 1: test that MYSQL starts docker stop mysql-test || true docker rm mysql-test || true @@ -309,6 +311,8 @@ test-one-image: check # docker run --rm -it --link mysql-test ${DOCKER_IMAGE_NAME} bash -c 'sleep 1 && mysql -h mysql-test -u testuser -ptestpassword -e "show variables;" testdb' docker stop mysql-test docker rm mysql-test + +run-tc-02: check # Test Case 2: test that it is possible to use "xxx_FILE" syntax docker swarm init || true docker service rm mysql-test2 || true @@ -328,6 +332,12 @@ test-one-image: check docker ps -a # rm -rf tmp +# Disable tc-02 because of issue #3 :( +test-one-image: run-smoke-tests run-tc-01 # run-tc-02 + +run-tc-2-for-arm64v8: install-qemu + ARCH=arm64v8 LINUX_ARCH=aarch64 DOCKER_IMAGE_VERSION=${MYSQL_VERSION_OTHER_ARCH} make run-tc-02 + push-one-image: check docker-login-if-possible # push only is 'DOCKER_USERNAME' (and hopefully DOCKER_PASSWORD) are set: if [[ ! "${DOCKER_USERNAME}" == "" ]]; then docker push "${DOCKER_IMAGE_TAGNAME}"; fi From c4de76c9ce157c01b91e59f6fd279bae9ad596e3 Mon Sep 17 00:00:00 2001 From: olivier Date: Sun, 24 May 2020 13:02:07 +0200 Subject: [PATCH 06/12] .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index a9d49d9..d01fdc9 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /testSuite.sh +/.DS_Store \ No newline at end of file From 08fa9bed401b7c2a3dbd897959dd8beded40fc0f Mon Sep 17 00:00:00 2001 From: olivier Date: Sun, 24 May 2020 14:37:21 +0200 Subject: [PATCH 07/12] Improve doc --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index ec2844a..5cb6ad2 100644 --- a/Makefile +++ b/Makefile @@ -8,8 +8,8 @@ SHELL = bash ## Caution: this Makefile has 'multiple entries', which means that it is 'calling himself'. # For instance, if you call 'make circleci-local-build': # 1. CircleCi cli is invoked -# 2. After have installed a build environment (inside a docker container), CircleCI will call "make" without parameter, which correspond to a 'make build-all-images' build (because of default target) -# 3. And 'build-all-images' target will run 4 times the "make all-one-image" for 4 different architecture (arm32v6, arm32v7, arm64v8 and amd64). +# 2. After have installed a build environment (inside a docker container), CircleCI will call "make" without parameter, which correspond to a 'make all' build (because of default target) +# 3. And the 'all' target will run 4 times the "make all-one-image" for 4 different architecture (arm32v6, arm32v7, arm64v8 and amd64), via the 'build-all-images' target. # Inspired from https://github.com/hypriot/rpi-mysql/blob/master/Makefile # DOCKER_REGISTRY: Nothing, or 'registry:5000/' From 640d41da0b60e3269b510b894cc13514ce053690 Mon Sep 17 00:00:00 2001 From: olivier Date: Sun, 24 May 2020 19:29:20 +0200 Subject: [PATCH 08/12] Build code refactoring --- Makefile | 191 +++++++++++++++++++++++++++++++------------------------ 1 file changed, 109 insertions(+), 82 deletions(-) diff --git a/Makefile b/Makefile index 5cb6ad2..33ea147 100644 --- a/Makefile +++ b/Makefile @@ -1,17 +1,12 @@ +# Original version was inspired by https://github.com/hypriot/rpi-mysql/blob/master/Makefile + SHELL = bash # .ONESHELL: # .SHELLFLAGS = -e # See https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html -.PHONY: default all build circleci-local-build check-binaries check-buildx check-docker-login docker-login-if-possible buildx-prepare \ +.PHONY: default all build circleci-local-build check-binaries check-docker-login docker-login-if-possible buildx-prepare \ buildx * TODO -## Caution: this Makefile has 'multiple entries', which means that it is 'calling himself'. -# For instance, if you call 'make circleci-local-build': -# 1. CircleCi cli is invoked -# 2. After have installed a build environment (inside a docker container), CircleCI will call "make" without parameter, which correspond to a 'make all' build (because of default target) -# 3. And the 'all' target will run 4 times the "make all-one-image" for 4 different architecture (arm32v6, arm32v7, arm64v8 and amd64), via the 'build-all-images' target. -# Inspired from https://github.com/hypriot/rpi-mysql/blob/master/Makefile - # DOCKER_REGISTRY: Nothing, or 'registry:5000/' DOCKER_REGISTRY ?= docker.io/ # DOCKER_USERNAME: Nothing, or 'biarms' @@ -20,38 +15,26 @@ DOCKER_USERNAME ?= DOCKER_PASSWORD ?= # BETA_VERSION: Nothing, or '-beta-123' BETA_VERSION ?= -DOCKER_IMAGE_NAME=biarms/mysql +DOCKER_IMAGE_NAME = biarms/mysql DOCKER_IMAGE_VERSION ?= MYSQL_VERSION_ARM32V6 = 5.5.60 MYSQL_VERSION_5_5 = 5.5.62 MYSQL_VERSION_OTHER_ARCH = 5.7.30 DOCKER_FILE ?= -DOCKER_IMAGE_TAGNAME = $(DOCKER_REGISTRY)$(DOCKER_IMAGE_NAME):$(DOCKER_IMAGE_VERSION)-linux-$(ARCH)$(BETA_VERSION) +DOCKER_IMAGE_TAGNAME = ${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_VERSION}${BETA_VERSION} # See https://www.gnu.org/software/make/manual/html_node/Shell-Function.html BUILD_DATE=$(shell date -u +"%Y-%m-%dT%H:%M:%SZ") # See https://microbadger.com/labels VCS_REF=$(shell git rev-parse --short HEAD) -ARCH ?= arm64v8 -LINUX_ARCH ?= aarch64 -BUILD_ARCH = $(ARCH)/ - -# See https://github.com/docker-library/official-images#architectures-other-than-amd64 -# |---------|------------| -# | ARCH | LINUX_ARCH | -# |---------|------------| -# | amd64 | x86_64 | -# | arm32v6 | armv6l | -# | arm32v7 | armv7l | -# | arm64v8 | aarch64 | -# |---------|------------| - default: all -all: check-docker-login build all-manifests generate-test-suite +all: check-docker-login build all-manifests generate-test-suite uninstall-qemu build: build-all-images +test: test-all-images + # Launch a local build as on circleci, that will call the default target, but inside the 'circleci build and test env' circleci-local-build: check-docker-login @ circleci local execute -e DOCKER_USERNAME="${DOCKER_USERNAME}" -e DOCKER_PASSWORD="${DOCKER_PASSWORD}" @@ -66,8 +49,6 @@ check-binaries: @ echo "DOCKER_REGISTRY: ${DOCKER_REGISTRY}" @ echo "BUILD_DATE: ${BUILD_DATE}" @ echo "VCS_REF: ${VCS_REF}" - -check-build: check-binaries # Next line will fail if docker server can't be contacted docker version @@ -84,8 +65,6 @@ check-docker-login: check-binaries docker-login-if-possible: check-binaries if [[ ! "${DOCKER_USERNAME}" == "" ]]; then echo "${DOCKER_PASSWORD}" | docker login --username "${DOCKER_USERNAME}" --password-stdin; fi -prepare: check-build check install-qemu - # Test are qemu based. SHOULD_DO: use `docker buildx bake`. See https://github.com/docker/buildx#buildx-bake-options-target install-qemu: check-binaries # @ # From https://github.com/multiarch/qemu-user-static: @@ -94,40 +73,9 @@ install-qemu: check-binaries uninstall-qemu: check-binaries docker run --rm --privileged multiarch/qemu-user-static:register --reset -check: check-binaries - @ if [[ "$(DOCKER_IMAGE_VERSION)" == "" ]]; then \ - echo 'DOCKER_IMAGE_VERSION is $(DOCKER_IMAGE_VERSION) (MUST BE SET !)' && \ - echo 'Correct usage sample: ' && \ - echo ' ARCH=arm64v8 LINUX_ARCH=aarch64 DOCKER_IMAGE_VERSION=5.7.30 make' && \ - echo ' or ' && \ - echo ' ARCH=arm64v8 LINUX_ARCH=aarch64 DOCKER_IMAGE_VERSION=5.7.30 make' && \ - exit -1; \ - fi - @ if [[ "$(ARCH)" == "" ]]; then \ - echo 'ARCH is $(ARCH) (MUST BE SET !)' && \ - echo 'Correct usage sample: ' && \ - echo ' ARCH=arm64v8 LINUX_ARCH=aarch64 DOCKER_IMAGE_VERSION=5.7.30 make' && \ - echo ' or ' && \ - echo ' ARCH=arm64v8 LINUX_ARCH=aarch64 DOCKER_IMAGE_VERSION=5.7.30 make' && \ - exit -2; \ - fi - @ if [[ "$(LINUX_ARCH)" == "" ]]; then \ - echo 'LINUX_ARCH is $(LINUX_ARCH) (MUST BE SET !)' && \ - echo 'Correct usage sample: ' && \ - echo ' ARCH=arm32v7 LINUX_ARCH=armv7l DOCKER_IMAGE_VERSION=5.7.30 make ' && \ - echo ' or ' && \ - echo ' ARCH=arm64v8 LINUX_ARCH=aarch64 DOCKER_IMAGE_VERSION=5.7.30 make' && \ - exit -3; \ - fi - # Debug info - @ echo "DOCKER_IMAGE_TAGNAME: ${DOCKER_IMAGE_TAGNAME}" - build-all-images: build-all-one-image-amd64 build-all-one-image-arm64v8 build-all-one-image-arm32v7 build-all-one-image-arm32v6 \ build-all-one-image-amd64-5.5 build-all-one-image-arm64v8-5.5 build-all-one-image-arm32v7-5.5 uninstall-qemu -# Actually, the 'push' will only be done is DOCKER_USERNAME is set and not empty ! -build-all-one-image: prepare build-one-image test-one-image push-one-image - build-all-one-image-arm32v6: ARCH=arm32v6 LINUX_ARCH=armv6l DOCKER_IMAGE_VERSION=${MYSQL_VERSION_ARM32V6} DOCKER_FILE='-f Dockerfile-5.5-arm32v6' make build-all-one-image @@ -281,28 +229,110 @@ generate-test-suite: @ echo "docker run --rm ${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_OTHER_ARCH}${BETA_VERSION} sh -c 'cat /etc/*release'" >> testSuite.sh echo "Done. See the file 'testSuite.sh'" -build-one-image: check - DOCKER_CLI_EXPERIMENTAL=enabled docker build -t ${DOCKER_IMAGE_TAGNAME} --build-arg VERSION="${DOCKER_IMAGE_VERSION}" --build-arg VCS_REF="${VCS_REF}" --build-arg BUILD_DATE="${BUILD_DATE}" --build-arg BUILD_ARCH="${BUILD_ARCH}" ${DOCKER_FILE} . +# Fails with: "standard_init_linux.go:211: exec user process caused "no such file or directory"" if qemu is not installed... +test-all-images: test-arm32v6 test-arm32v7-5.5 test-arm32v7 test-arm64v8 test-amd64 + echo "All tests are OK :)" + +test-arm32v6: + ARCH=arm32v6 LINUX_ARCH=armv6l DOCKER_IMAGE_VERSION=${MYSQL_VERSION_ARM32V6} DOCKER_FILE='-f Dockerfile-5.5-arm32v6' make test-one-image + +test-arm32v7-5.5: + ARCH=arm32v7 LINUX_ARCH=armv7l DOCKER_IMAGE_VERSION=${MYSQL_VERSION_5_5} DOCKER_FILE='-f Dockerfile-5.5' make test-one-image + +test-arm32v7: + ARCH=arm32v7 LINUX_ARCH=armv7l DOCKER_IMAGE_VERSION=${MYSQL_VERSION_OTHER_ARCH} make test-one-image + +test-arm64v8-5.5: + ARCH=arm64v8 LINUX_ARCH=aarch64 DOCKER_IMAGE_VERSION=${MYSQL_VERSION_5_5} DOCKER_FILE='-f Dockerfile-5.5' make test-one-image -run-smoke-tests: check +test-arm64v8: + ARCH=arm64v8 LINUX_ARCH=aarch64 DOCKER_IMAGE_VERSION=${MYSQL_VERSION_OTHER_ARCH} make test-one-image + +run-tc-2-for-arm64v8: + ARCH=arm64v8 LINUX_ARCH=aarch64 DOCKER_IMAGE_VERSION=${MYSQL_VERSION_OTHER_ARCH} make run-tc-02 + +test-amd64: + ARCH=amd64 LINUX_ARCH=x86_64 DOCKER_IMAGE_VERSION=${MYSQL_VERSION_OTHER_ARCH} make test-one-image + +test-amd64-5.5: + ARCH=amd64 LINUX_ARCH=x86_64 DOCKER_IMAGE_VERSION=${MYSQL_VERSION_5_5} DOCKER_FILE='-f Dockerfile-5.5' make test-one-image + +## Caution: this Makefile has 'multiple entries', which means that it is 'calling himself'. +# For instance, if you call 'make circleci-local-build': +# 1. CircleCi cli is invoked +# 2. After have installed a build environment (inside a docker container), CircleCI will call "make" without parameter, which correspond to a 'make all' build (because of default target) +# 3. And the 'all' target will run 4 times the "make all-one-image" for 4 different architecture (arm32v6, arm32v7, arm64v8 and amd64), via the 'build-all-images' target. +# See https://github.com/docker-library/official-images#architectures-other-than-amd64 +# |---------|------------| +# | ARCH | LINUX_ARCH | +# |---------|------------| +# | amd64 | x86_64 | +# | arm32v6 | armv6l | +# | arm32v7 | armv7l | +# | arm64v8 | aarch64 | +# |---------|------------| +ARCH ?= arm64v8 +LINUX_ARCH ?= aarch64 +BUILD_ARCH = $(ARCH)/ +MULTI_ARCH_DOCKER_IMAGE_TAGNAME = ${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_VERSION}-linux-${ARCH}${BETA_VERSION} + +## Multi-arch targets + +# Actually, the 'push' will only be done is DOCKER_USERNAME is set and not empty ! +build-all-one-image: build-one-image test-one-image push-one-image + +check: check-binaries + @ if [[ "$(ARCH)" == "" ]]; then \ + echo 'ARCH is $(ARCH) (MUST BE SET !)' && \ + echo 'Correct usage sample: ' && \ + echo ' ARCH=arm64v8 LINUX_ARCH=aarch64 DOCKER_IMAGE_VERSION=1.2.3 make test-one-image' && \ + echo ' or ' && \ + echo ' ARCH=arm64v8 LINUX_ARCH=aarch64 DOCKER_IMAGE_VERSION=1.2.3 make test-one-image' && \ + exit -1; \ + fi + @ if [[ "$(LINUX_ARCH)" == "" ]]; then \ + echo 'LINUX_ARCH is $(LINUX_ARCH) (MUST BE SET !)' && \ + echo 'Correct usage sample: ' && \ + echo ' ARCH=arm32v7 LINUX_ARCH=armv7l DOCKER_IMAGE_VERSION=1.2.3 make test-one-image' && \ + echo ' or ' && \ + echo ' ARCH=arm64v8 LINUX_ARCH=aarch64 DOCKER_IMAGE_VERSION=1.2.3 make test-one-image' && \ + exit -2; \ + fi + @ if [[ "$(DOCKER_IMAGE_VERSION)" == "" ]]; then \ + echo 'DOCKER_IMAGE_VERSION is $(DOCKER_IMAGE_VERSION) (MUST BE SET !)' && \ + echo 'Correct usage sample: ' && \ + echo ' ARCH=arm64v8 LINUX_ARCH=aarch64 DOCKER_IMAGE_VERSION=1.2.3 make test-one-image' && \ + echo ' or ' && \ + echo ' ARCH=arm64v8 LINUX_ARCH=aarch64 DOCKER_IMAGE_VERSION=1.2.3 make test-one-image' && \ + exit -3; \ + fi + # Debug info + @ echo "MULTI_ARCH_DOCKER_IMAGE_TAGNAME: ${MULTI_ARCH_DOCKER_IMAGE_TAGNAME}" + +prepare: check install-qemu + +build-one-image: prepare + docker build -t "${MULTI_ARCH_DOCKER_IMAGE_TAGNAME}" --build-arg VERSION="${DOCKER_IMAGE_VERSION}" --build-arg VCS_REF="${VCS_REF}" --build-arg BUILD_DATE="${BUILD_DATE}" --build-arg BUILD_ARCH="${BUILD_ARCH}" ${DOCKER_FILE} . + +run-smoke-tests: prepare # Smoke tests: - docker run --rm ${DOCKER_IMAGE_TAGNAME} /bin/echo "Success." - docker run --rm ${DOCKER_IMAGE_TAGNAME} uname -a - docker run --rm ${DOCKER_IMAGE_TAGNAME} mysql --version - docker run --rm ${DOCKER_IMAGE_TAGNAME} uname -a | grep "${LINUX_ARCH}" - docker run --rm ${DOCKER_IMAGE_TAGNAME} mysql --version | grep mysql - docker run --rm ${DOCKER_IMAGE_TAGNAME} mysqld --version | grep mysql - docker run --rm ${DOCKER_IMAGE_TAGNAME} mysql --version | grep "${DOCKER_IMAGE_VERSION}" - docker run --rm ${DOCKER_IMAGE_TAGNAME} mysqld --version | grep "${DOCKER_IMAGE_VERSION}" + docker run --rm "${MULTI_ARCH_DOCKER_IMAGE_TAGNAME}" /bin/echo "Success." | grep "Success" + docker run --rm "${MULTI_ARCH_DOCKER_IMAGE_TAGNAME}" uname -a + docker run --rm "${MULTI_ARCH_DOCKER_IMAGE_TAGNAME}" uname -a | grep "${LINUX_ARCH}" + docker run --rm "${MULTI_ARCH_DOCKER_IMAGE_TAGNAME}" mysql --version + docker run --rm "${MULTI_ARCH_DOCKER_IMAGE_TAGNAME}" mysql --version | grep mysql + docker run --rm "${MULTI_ARCH_DOCKER_IMAGE_TAGNAME}" mysqld --version | grep mysql + docker run --rm "${MULTI_ARCH_DOCKER_IMAGE_TAGNAME}" mysql --version | grep "${DOCKER_IMAGE_VERSION}" + docker run --rm "${MULTI_ARCH_DOCKER_IMAGE_TAGNAME}" mysqld --version | grep "${DOCKER_IMAGE_VERSION}" # on armv6l, it will return 'armv7l'... # docker run --rm ${DOCKER_IMAGE_NAME} mysql --version | grep "${LINUX_ARCH}" # docker run --rm ${DOCKER_IMAGE_NAME} mysqld --version | grep "${LINUX_ARCH}" -run-tc-01: check +run-tc-01: prepare # Test Case 1: test that MYSQL starts docker stop mysql-test || true docker rm mysql-test || true - docker create --name mysql-test -e MYSQL_ROOT_PASSWORD=root_password -e MYSQL_DATABASE=testdb -e MYSQL_USER=testuser -e MYSQL_PASSWORD=testpassword ${DOCKER_IMAGE_TAGNAME} + docker create --name mysql-test -e MYSQL_ROOT_PASSWORD=root_password -e MYSQL_DATABASE=testdb -e MYSQL_USER=testuser -e MYSQL_PASSWORD=testpassword ${MULTI_ARCH_DOCKER_IMAGE_TAGNAME} docker start mysql-test # wait for port 3306 to be ready # netstat -tulpn | grep LISTEN | grep 3306 @@ -312,7 +342,7 @@ run-tc-01: check docker stop mysql-test docker rm mysql-test -run-tc-02: check +run-tc-02: prepare # Test Case 2: test that it is possible to use "xxx_FILE" syntax docker swarm init || true docker service rm mysql-test2 || true @@ -322,9 +352,9 @@ run-tc-02: check # rm -rf tmp || true # mkdir tmp # echo "dummy_password" > tmp/password_file - # docker create --name mysql-test2 -v `pwd`/tmp/password_file:/tmp/root_password_file -v `pwd`/tmp/password_file:/tmp/user_password_file -e MYSQL_ROOT_PASSWORD_FILE=/tmp/root_password_file -e MYSQL_DATABASE=testdb -e MYSQL_USER=testuser -e MYSQL_PASSWORD_FILE=/tmp/user_password_file ${DOCKER_IMAGE_TAGNAME} + # docker create --name mysql-test2 -v `pwd`/tmp/password_file:/tmp/root_password_file -v `pwd`/tmp/password_file:/tmp/user_password_file -e MYSQL_ROOT_PASSWORD_FILE=/tmp/root_password_file -e MYSQL_DATABASE=testdb -e MYSQL_USER=testuser -e MYSQL_PASSWORD_FILE=/tmp/user_password_file ${MULTI_ARCH_DOCKER_IMAGE_TAGNAME} printf "dummy_password" | docker secret create mysql-test2-secret - - docker service create --name mysql-test2 --secret mysql-test2-secret -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-test2-secret -e MYSQL_DATABASE=testdb -e MYSQL_USER=testuser -e MYSQL_PASSWORD_FILE=/run/secrets/mysql-test2-secret ${DOCKER_IMAGE_TAGNAME} + docker service create --name mysql-test2 --secret mysql-test2-secret -e MYSQL_ROOT_PASSWORD_FILE=/run/secrets/mysql-test2-secret -e MYSQL_DATABASE=testdb -e MYSQL_USER=testuser -e MYSQL_PASSWORD_FILE=/run/secrets/mysql-test2-secret ${MULTI_ARCH_DOCKER_IMAGE_TAGNAME} while ! (docker service logs mysql-test2 2>&1 | grep 'ready for connections') ; do sleep 1; done docker service rm mysql-test2 docker secret rm mysql-test2-secret @@ -333,18 +363,15 @@ run-tc-02: check # rm -rf tmp # Disable tc-02 because of issue #3 :( -test-one-image: run-smoke-tests run-tc-01 # run-tc-02 - -run-tc-2-for-arm64v8: install-qemu - ARCH=arm64v8 LINUX_ARCH=aarch64 DOCKER_IMAGE_VERSION=${MYSQL_VERSION_OTHER_ARCH} make run-tc-02 +test-one-image: build-one-image run-smoke-tests run-tc-01 # run-tc-02 push-one-image: check docker-login-if-possible # push only is 'DOCKER_USERNAME' (and hopefully DOCKER_PASSWORD) are set: - if [[ ! "${DOCKER_USERNAME}" == "" ]]; then docker push "${DOCKER_IMAGE_TAGNAME}"; fi + if [[ ! "${DOCKER_USERNAME}" == "" ]]; then docker push "${MULTI_ARCH_DOCKER_IMAGE_TAGNAME}"; fi # Helper targets rmi-one-image: check - docker rmi -f $(DOCKER_IMAGE_TAGNAME) + docker rmi -f "${MULTI_ARCH_DOCKER_IMAGE_TAGNAME}" rebuild-one-image: rmi-one-image build-one-image From 4b6a6c9c11210677553ffeaa63c37151ce16fd3b Mon Sep 17 00:00:00 2001 From: olivier Date: Mon, 1 Feb 2021 22:23:24 +0100 Subject: [PATCH 09/12] Migrate to 5.7.33 --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 33ea147..50c201d 100644 --- a/Makefile +++ b/Makefile @@ -19,7 +19,7 @@ DOCKER_IMAGE_NAME = biarms/mysql DOCKER_IMAGE_VERSION ?= MYSQL_VERSION_ARM32V6 = 5.5.60 MYSQL_VERSION_5_5 = 5.5.62 -MYSQL_VERSION_OTHER_ARCH = 5.7.30 +MYSQL_VERSION_OTHER_ARCH = 5.7.33 DOCKER_FILE ?= DOCKER_IMAGE_TAGNAME = ${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${DOCKER_IMAGE_VERSION}${BETA_VERSION} # See https://www.gnu.org/software/make/manual/html_node/Shell-Function.html From 0bbe5089f89412120113a871afc4742e56f846f3 Mon Sep 17 00:00:00 2001 From: olivier Date: Mon, 1 Feb 2021 23:16:11 +0100 Subject: [PATCH 10/12] Migrate to 5.7.33 --- Makefile | 4 ++-- README.md | 33 +++++++++++++++++---------------- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/Makefile b/Makefile index 50c201d..99e7c00 100644 --- a/Makefile +++ b/Makefile @@ -138,7 +138,7 @@ create-and-push-manifests: #ideally, should reference 'check-docker-login' and ' DOCKER_CLI_EXPERIMENTAL=enabled docker manifest annotate "${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_5_5}${BETA_VERSION}" "${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_5_5}-linux-arm64v8${BETA_VERSION}" --os linux --arch arm64 --variant v8 DOCKER_CLI_EXPERIMENTAL=enabled docker manifest annotate "${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_5_5}${BETA_VERSION}" "${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_5_5}-linux-amd64${BETA_VERSION}" --os linux --arch amd64 DOCKER_CLI_EXPERIMENTAL=enabled docker manifest push "${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_5_5}${BETA_VERSION}" - # biarms/mysql:5.7.30 # It is a good idea to push this one at the end... + # biarms/mysql:5.7.32 # It is a good idea to push this one at the end... DOCKER_CLI_EXPERIMENTAL=enabled docker manifest create --amend "${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_OTHER_ARCH}${BETA_VERSION}" "${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_OTHER_ARCH}-linux-arm32v7${BETA_VERSION}" "${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_OTHER_ARCH}-linux-arm64v8${BETA_VERSION}" "${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_OTHER_ARCH}-linux-amd64${BETA_VERSION}" DOCKER_CLI_EXPERIMENTAL=enabled docker manifest annotate "${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_OTHER_ARCH}${BETA_VERSION}" "${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_OTHER_ARCH}-linux-arm32v7${BETA_VERSION}" --os linux --arch arm --variant v7 DOCKER_CLI_EXPERIMENTAL=enabled docker manifest annotate "${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_OTHER_ARCH}${BETA_VERSION}" "${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_OTHER_ARCH}-linux-arm64v8${BETA_VERSION}" --os linux --arch arm64 --variant v8 @@ -172,7 +172,7 @@ test-manifests: test $$(docker run --rm mplatform/mquery "${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_5_5}${BETA_VERSION}" | grep linux | wc -l | xargs) = 3 test $$(docker run --rm mplatform/mquery "${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_5_5}${BETA_VERSION}" | grep -c "arm/v6") = 0 test $$(docker run --rm mplatform/mquery "${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_5_5}${BETA_VERSION}" | grep -c "arm/v7") = 1 - # Same kind of tests of biarms/mysql:5.7.30 + # Same kind of tests of biarms/mysql:5.7.33 test $$(docker run --rm mplatform/mquery "${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_OTHER_ARCH}${BETA_VERSION}" | grep linux | wc -l | xargs) = 3 test $$(docker run --rm mplatform/mquery "${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_OTHER_ARCH}${BETA_VERSION}" | grep -c "arm/v6") = 0 test $$(docker run --rm mplatform/mquery "${DOCKER_REGISTRY}${DOCKER_IMAGE_NAME}:${MYSQL_VERSION_OTHER_ARCH}${BETA_VERSION}" | grep -c "arm/v7") = 1 diff --git a/README.md b/README.md index d053cfd..ad66900 100644 --- a/README.md +++ b/README.md @@ -56,28 +56,28 @@ Caution: Image: biarms/mysql:5 * Supported platforms: - linux/arm/v6 # => mysql version 5.5.60 - - linux/amd64 # => mysql version 5.7.30 - - linux/arm64 # => mysql version 5.7.30 + - linux/amd64 # => mysql version 5.7.33 + - linux/arm64 # => mysql version 5.7.33 ``` In other words, `docker run -it --rm biarms/mysql:5 --version` will return: 1. '5.5.60' on arm32v6 devices 2. '5.5.60' on arm32v7 devices (because of our workaround about https://github.com/biarms/mysql/issues/4 issue) - 3. '5.7.30' on arm64v8 devices - 4. '5.7.30' on x86_64 devices -- Be aware no arm32v6 image is build for the 5.7 and 5.7.30 releases ! In other words, `docker run --rm mplatform/mquery biarms/mysql:5.7.30` (as well as `docker run --rm mplatform/mquery biarms/mysql:5.7`) will return something similar to: + 3. '5.7.33' on arm64v8 devices + 4. '5.7.33' on x86_64 devices +- Be aware no arm32v6 image is build for the 5.7 and 5.7.33 releases ! In other words, `docker run --rm mplatform/mquery biarms/mysql:5.7.33` (as well as `docker run --rm mplatform/mquery biarms/mysql:5.7`) will return something similar to: ``` - Image: biarms/mysql:5.7.30 + Image: biarms/mysql:5.7.33 * Manifest List: Yes * Supported platforms: - - linux/amd64 # => mysql version 5.7.30 - - linux/arm/v7 # => mysql version 5.7.30 - - linux/arm64 # => mysql version 5.7.30 + - linux/amd64 # => mysql version 5.7.33 + - linux/arm/v7 # => mysql version 5.7.33 + - linux/arm64 # => mysql version 5.7.33 ``` - Which means that `docker run -it --rm biarms/mysql:5.7 --version` (or `docker run -it --rm biarms/mysql:5.7.30 --version`) will return: + Which means that `docker run -it --rm biarms/mysql:5.7 --version` (or `docker run -it --rm biarms/mysql:5.7.33 --version`) will return: 1. an error on arm32v6 devices (so it will not work on armv6 devices like rpi zero or rpi one) - 2. '5.7.30' on arm32v7 devices (like Odroid, or rpi2, rpi3, rpi4 running a 32 bits OS) - 3. '5.7.30' on arm64v8 devices (like rpi2, rpi3, rpi4 running a 64 bits OS) - 4. '5.7.30' on x86_64 devices (like a MacOS, Linux or PC) + 2. '5.7.33' on arm32v7 devices (like Odroid, or rpi2, rpi3, rpi4 running a 32 bits OS) + 3. '5.7.33' on arm64v8 devices (like rpi2, rpi3, rpi4 running a 64 bits OS) + 4. '5.7.33' on x86_64 devices (like a MacOS, Linux or PC) - However, as soon as you stay with 5.5, you should get something working on any device ``` - linux/amd64 # => mysql version 5.5.62 @@ -102,13 +102,14 @@ Caution: | | *arm32v6* | *arm32v7* | *arm64v8* | *amd64* | |-------------------------------------------------|-----------|------------|-----------|----------| | `docker run --rm biarms/mysql --version` | 5.5.60 | 5.5.60 (1) | 5.7.30 | 5.7.30 | -| `docker run --rm biarms/mysql:5 --version` | 5.5.60 | 5.5.60 (1) | 5.7.30 | 5.7.30 | +| `docker run --rm biarms/mysql:5 --version` | 5.5.60 | 5.5.60 (1) | 5.7.33 | 5.7.33 | | `docker run --rm biarms/mysql:5.5 --version` | 5.5.60 | 5.5.60 (2) | 5.5.62 | 5.5.62 | | `docker run --rm biarms/mysql:5.5.62 --version` | NOK | 5.5.62 | 5.5.62 | 5.5.62 | -| `docker run --rm biarms/mysql:5.7 --version` | NOK | 5.7.30 | 5.7.30 | 5.7.30 | +| `docker run --rm biarms/mysql:5.7 --version` | NOK | 5.7.33 | 5.7.33 | 5.7.33 | | `docker run --rm biarms/mysql:5.7.30 --version` | NOK | 5.7.30 | 5.7.30 | 5.7.30 | +| `docker run --rm biarms/mysql:5.7.33 --version` | NOK | 5.7.33 | 5.7.33 | 5.7.33 | -- (1) Should be 5.7.30 (build for arm32v7), but is 5.5.60 (build of arm32v6) because of 'docker pull' issue. See https://github.com/biarms/mysql/issues/4 for more details. +- (1) Should be 5.7.33 (build for arm32v7), but is 5.5.60 (build of arm32v6) because of 'docker pull' issue. See https://github.com/biarms/mysql/issues/4 for more details. - (2) Should be 5.5.62 (build for arm32v7), but is 5.5.60 (build of arm32v6) because of 'docker pull' issue. See https://github.com/biarms/mysql/issues/4 for more details. ### Architecture From 4cc27490febfe0c6fd2a63edef299fc44d9aea56 Mon Sep 17 00:00:00 2001 From: olivier Date: Tue, 2 Feb 2021 21:32:47 +0100 Subject: [PATCH 11/12] Upgrade docker --- .circleci/config.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9d81410..1f7ccdd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,9 +3,9 @@ version: 2.1 jobs: build: docker: - - image: biarms/docker-toolbox:0.0.2 + - image: biarms/docker-toolbox:0.0.3 steps: - setup_remote_docker: - version: 19.03.8 # Max supported version was found on https://circleci.com/docs/2.0/building-docker-images/ + version: 19.03.13 # Max supported version was found on https://circleci.com/docs/2.0/building-docker-images/ - checkout - run: BETA_VERSION='-beta-circleci' make From b59b12fadba6eeb88d6105160feaa3b6a5376643 Mon Sep 17 00:00:00 2001 From: olivier Date: Tue, 2 Feb 2021 21:33:44 +0100 Subject: [PATCH 12/12] Upgrade docker --- .travis.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index c87b10c..e92301d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,9 +1,9 @@ language: bash -dist: bionic # On 20/05/2020, focal is still not listed on https://docs.travis-ci.com/user/reference/overview/ :( +dist: focal # See available images on https://docs.travis-ci.com/user/reference/overview/ -env: - - DOCKER_CLI_EXPERIMENTAL=enabled +#env: +# - DOCKER_CLI_EXPERIMENTAL=enabled before_install: - sudo rm -rf /var/lib/apt/lists/*