From 63ead0929a0ce482dd21025d0cfcca554f04e959 Mon Sep 17 00:00:00 2001 From: Morlay Date: Thu, 2 Jul 2020 09:57:10 +0800 Subject: [PATCH] build: setup docker buildx Signed-off-by: Morlay --- scripts/travis/build-all-in-one-image.sh | 60 +++++++++++++++++++---- scripts/travis/setup-docker-buildx.sh | 61 ++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 8 deletions(-) create mode 100755 scripts/travis/setup-docker-buildx.sh diff --git a/scripts/travis/build-all-in-one-image.sh b/scripts/travis/build-all-in-one-image.sh index aca77aff401..a9cdb40f22d 100755 --- a/scripts/travis/build-all-in-one-image.sh +++ b/scripts/travis/build-all-in-one-image.sh @@ -1,5 +1,7 @@ #!/bin/bash +bash ./scripts/travis/setup-docker-buildx.sh + set -exu BRANCH=${BRANCH:?'missing BRANCH env var'} @@ -26,6 +28,12 @@ run_integration_test() { docker kill $CID } +docker_buildx() { + CMD_ROOT=${1} + FLAGS=${@:2} + docker buildx build -f ${CMD_ROOT}/Dockerfile ${FLAGS} ${CMD_ROOT} +} + upload_to_docker() { # Only push the docker container to Docker Hub for master branch if [[ ("$BRANCH" == "master" || $BRANCH =~ ^v[0-9]+\.[0-9]+\.[0-9]+$) && "$TRAVIS_SECURE_ENV_VARS" == "true" ]]; then @@ -34,18 +42,54 @@ upload_to_docker() { echo 'skip docker upload for PR' exit 0 fi - export REPO=$1 - bash ./scripts/travis/upload-to-docker.sh + + REPO=${1} + CMD_ROOT=${2} + + unset major minor patch + + if [[ "$BRANCH" == "master" ]]; then + TAG="latest" + elif [[ $BRANCH =~ ^v([0-9]+)\.([0-9]+)\.([0-9]+)$ ]]; then + major="${BASH_REMATCH[1]}" + minor="${BASH_REMATCH[2]}" + patch="${BASH_REMATCH[3]}" + TAG=${major}.${minor}.${patch} + echo "BRANCH is a release tag: major=$major, minor=$minor, patch=$patch" + else + TAG="${BRANCH///}" + fi + + echo "TRAVIS_BRANCH=$TRAVIS_BRANCH, REPO=$REPO, BRANCH=$BRANCH, TAG=$TAG, IMAGE=$IMAGE" + + IMAGE_TAGS="-t ${REPO}:${TAG}" + + # add major, major.minor and major.minor.patch tags + if [[ -n $major ]]; then + IMAGE_TAGS="${IMAGE_TAGS} -t ${REPO}:${major}" + if [[ -n $minor ]]; then + IMAGE_TAGS="${IMAGE_TAGS} -t ${REPO}:${major}.${minor}" + if [[ -n $patch ]]; then + IMAGE_TAGS="${IMAGE_TAGS} -t ${REPO}:${major}.${minor}.${patch}" + fi + fi + fi + + docker_buildx ${CMD_ROOT} ${IMAGE_TAGS} --platform=linux/amd64,linux/arm64 --push } -make build-all-in-one GOOS=linux GOARCH=$GOARCH +make build-all-in-one GOOS=linux GOARCH=amd64 +make build-all-in-one GOOS=linux GOARCH=arm64 repo=jaegertracing/all-in-one -docker build -f cmd/all-in-one/Dockerfile -t $repo:latest cmd/all-in-one --build-arg TARGETARCH=$GOARCH +docker_buildx cmd/all-in-one --load --platform=linux/amd64 -t $repo:latest run_integration_test $repo -upload_to_docker $repo +upload_to_docker $repo cmd/all-in-one + -make build-otel-all-in-one GOOS=linux GOARCH=$GOARCH +make build-otel-all-in-one GOOS=linux GOARCH=amd64 +make build-otel-all-in-one GOOS=linux GOARCH=arm64 repo=jaegertracing/opentelemetry-all-in-one -docker build -f cmd/opentelemetry/cmd/all-in-one/Dockerfile -t $repo:latest cmd/opentelemetry/cmd/all-in-one --build-arg TARGETARCH=$GOARCH +docker_buildx cmd/opentelemetry/cmd/all-in-one --load --platform=linux/amd64 -t $repo:latest run_integration_test $repo -upload_to_docker $repo +upload_to_docker $repo cmd/opentelemetry/cmd/all-in-one + diff --git a/scripts/travis/setup-docker-buildx.sh b/scripts/travis/setup-docker-buildx.sh new file mode 100755 index 00000000000..6ef1df09c1e --- /dev/null +++ b/scripts/travis/setup-docker-buildx.sh @@ -0,0 +1,61 @@ +#!/bin/bash + +set -eux + +# update docker +# for setup buildx https://travis-ci.community/t/installing-docker-19-03/8077/2 +sudo apt update + +sudo systemctl stop docker +sudo apt install -y docker.io + +sudo systemctl unmask docker.service +sudo systemctl unmask docker.socket +sudo systemctl start docker +sudo systemctl status docker.socket + +docker version + +DOCKER_BUILDX_VERSION=v0.4.1 + +LOCAL_OS=$(uname -s | tr '[A-Z]' '[a-z]') + +case $(uname -m) in +x86_64) + LOCAL_ARCH=amd64 + ;; +aarch64) + LOCAL_ARCH=arm64 + ;; +*) + echo "unsupported architecture" + exit 1 + ;; +esac + +if [[ ! -f ~/.docker/cli-plugins/docker-buildx ]]; then + DOCKER_BUILDX_DOWNLOAD_URL=https://github.com/docker/buildx/releases/download/${DOCKER_BUILDX_VERSION}/buildx-${DOCKER_BUILDX_VERSION}.${LOCAL_OS}-${LOCAL_ARCH} + mkdir -p ~/.docker/cli-plugins + echo "downloading from ${DOCKER_BUILDX_DOWNLOAD_URL}" + curl -sL --output ~/.docker/cli-plugins/docker-buildx "${DOCKER_BUILDX_DOWNLOAD_URL}" + chmod a+x ~/.docker/cli-plugins/docker-buildx +fi + +# enable buildx +export DOCKER_CLI_EXPERIMENTAL=enabled + +# checkout buildx available +docker buildx version + +# enabled qemu if needed +if [[ ! $(docker buildx inspect default | grep Platforms) == *arm64* ]]; then + docker run --rm --privileged multiarch/qemu-user-static --reset -p +fi + +# setup builder if need +if [[ $(docker buildx inspect builder) == *"no builder"* ]]; then + docker buildx create --use --name=builder --platform=linux/amd64,linux/arm64 --driver-opt=image=moby/buildkit:master,network=host +fi + +# log buildx detail +docker buildx inspect builder \ No newline at end of file