diff --git a/scripts/travis/build-all-in-one-image.sh b/scripts/travis/build-all-in-one-image.sh index aca77aff401..89c3a37e426 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 --platform=linux/arm64,linux/amd64 -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=${1} + + 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} --push } -make build-all-in-one GOOS=linux GOARCH=$GOARCH +GOOS=linux GOARCH=amd64 make build-all-in-one +GOOS=linux GOARCH=arm64 make build-all-in-one 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 -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 +GOOS=linux GOARCH=amd64 make build-otel-all-in-one +GOOS=linux GOARCH=arm64 make build-otel-all-in-one 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 -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..06431187c55 --- /dev/null +++ b/scripts/travis/setup-docker-buildx.sh @@ -0,0 +1,41 @@ +#!/bin/bash + +export DOCKER_CLI_EXPERIMENTAL=enabled + +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 +x ~/.docker/cli-plugins/docker-buildx +fi + +# 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) == *"Name"* ]]; then + docker buildx create --use --name=builder --platform=linux/amd64,linux/arm64 --driver-opt=image=moby/buildkit:master,network=host +fi