Skip to content
Snippets Groups Projects
Commit 0c246c6e authored by Wouter Deconinck's avatar Wouter Deconinck
Browse files

feat: multi-platform builds

parent 25632d32
No related branches found
No related tags found
1 merge request!500feat: multi-platform builds
...@@ -39,15 +39,15 @@ variables: ...@@ -39,15 +39,15 @@ variables:
## [hash]: [description] ## [hash]: [description]
## f892e2b5d7ea9d1f2e43741499e899ce21dd3d5a: py-minkowskiengine: new package ## f892e2b5d7ea9d1f2e43741499e899ce21dd3d5a: py-minkowskiengine: new package
## We need to enable Docker Buildkit to use cache mounts and better ## Local registry
## build performance overall CI_PUSH: 1
DOCKER_BUILDKIT: 1
## Dockerhub registry ## Dockerhub registry
DH_REGISTRY: docker.io
DH_REGISTRY_USER: eicweb DH_REGISTRY_USER: eicweb
DH_PUSH: 1 DH_PUSH: 1
## GitHub registry ## GitHub registry
GH_REGISTRY: ghcr.io GH_REGISTRY: ghcr.io
GH_REGISTRY_USER: eic
GH_PUSH: 1 GH_PUSH: 1
## Also export the raw builder image, will be stored on DH only ## Also export the raw builder image, will be stored on DH only
...@@ -73,7 +73,6 @@ variables: ...@@ -73,7 +73,6 @@ variables:
TESTING_TAG: "testing" TESTING_TAG: "testing"
INTERNAL_TAG: "${TESTING_TAG}-${VERSION}" INTERNAL_TAG: "${TESTING_TAG}-${VERSION}"
EXPORT_TAG: "" EXPORT_TAG: ""
EXPORT_TAG2: ""
stages: stages:
- config - config
...@@ -157,7 +156,6 @@ version: ...@@ -157,7 +156,6 @@ version:
echo "INTERNAL_TAG=$INTERNAL_TAG" >> build.env echo "INTERNAL_TAG=$INTERNAL_TAG" >> build.env
echo "NIGHTLY_TAG=$NIGHTLY_TAG" >> build.env echo "NIGHTLY_TAG=$NIGHTLY_TAG" >> build.env
echo "EXPORT_TAG=$EXPORT_TAG" >> build.env echo "EXPORT_TAG=$EXPORT_TAG" >> build.env
echo "EXPORT_TAG2=$EXPORT_TAG2" >> build.env
cat build.env cat build.env
artifacts: artifacts:
...@@ -200,24 +198,18 @@ version: ...@@ -200,24 +198,18 @@ version:
base: base:
parallel: parallel:
matrix: matrix:
- BASE_IMAGE: amd64/debian:testing-20220822-slim - BASE_IMAGE: debian:testing-20220822-slim
BUILD_IMAGE: amd64_debian_testing_base BUILD_IMAGE: debian_testing_base
PLATFORM: linux/amd64 PLATFORM: linux/amd64,linux/arm64/v8
- BASE_IMAGE: amd64/ubuntu:20.04 - BASE_IMAGE: ubuntu:20.04
BUILD_IMAGE: amd64_ubuntu_base BUILD_IMAGE: ubuntu_base
PLATFORM: linux/amd64 PLATFORM: linux/amd64,linux/arm64/v8
- BASE_IMAGE: intel/oneapi-hpckit:2022.3.0-devel-ubuntu20.04 - BASE_IMAGE: intel/oneapi-hpckit:2022.3.0-devel-ubuntu20.04
BUILD_IMAGE: oneapi_base BUILD_IMAGE: oneapi_base
PLATFORM: linux/amd64 PLATFORM: linux/amd64
# - BASE_IMAGE: nvidia/cuda:11.8.0-devel-ubuntu20.04 # - BASE_IMAGE: nvidia/cuda:11.8.0-devel-ubuntu20.04
# BUILD_IMAGE: cuda_base # BUILD_IMAGE: cuda_base
# PLATFORM: linux/amd64 # PLATFORM: linux/amd64
- BASE_IMAGE: arm64v8/debian:testing-20220822-slim
BUILD_IMAGE: arm64v8_debian_testing_base
PLATFORM: linux/arm64/v8
# - BASE_IMAGE: debian:testing-20220822-slim
# BUILD_IMAGE: debian_testing_base_multiarch
# PLATFORM: linux/amd64,linux/arm64/v8
extends: .build extends: .build
stage: base stage: base
needs: needs:
...@@ -225,23 +217,25 @@ base: ...@@ -225,23 +217,25 @@ base:
script: script:
- docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
- docker buildx create --name builder --driver docker-container --bootstrap --use - docker buildx create --name builder --driver docker-container --bootstrap --use
- docker buildx build --load -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${INTERNAL_TAG} - docker buildx build --push
-t ${CI_REGISTRY}/${CI_PROJECT_PATH}/${BUILD_IMAGE}:${INTERNAL_TAG}
${EXPORT_TAG:+
${CI_PUSH:+-t ${CI_REGISTRY}/${CI_PROJECT_PATH}/${BUILD_IMAGE}:${EXPORT_TAG}}
${DH_PUSH:+-t ${DH_REGISTRY}/${DH_REGISTRY_USER}/${BUILD_IMAGE}:${EXPORT_TAG}}
${GH_PUSH:+-t ${GH_REGISTRY}/${GH_REGISTRY_USER}/${BUILD_IMAGE}:${EXPORT_TAG}}
}
-f containers/debian/base.Dockerfile -f containers/debian/base.Dockerfile
${PLATFORM:+--platform ${PLATFORM}} --platform ${PLATFORM}
--build-arg BASE_IMAGE=${BASE_IMAGE} --build-arg BASE_IMAGE=${BASE_IMAGE}
--build-arg BUILD_IMAGE=${BUILD_IMAGE} --build-arg BUILD_IMAGE=${BUILD_IMAGE}
containers/debian containers/debian
- !reference [.build, script]
jug_dev:default: jug_dev:default:
parallel: parallel:
matrix: matrix:
- BASE_IMAGE: amd64_debian_testing_base - BASE_IMAGE: debian_testing_base
BUILD_IMAGE: jug_dev BUILD_IMAGE: jug_dev
PLATFORM: linux/amd64 PLATFORM: linux/amd64,linux/arm64/v8
- BASE_IMAGE: arm64v8_debian_testing_base
BUILD_IMAGE: jug_dev_arm64v8
PLATFORM: linux/arm64/v8
# - BASE_IMAGE: oneapi_base # - BASE_IMAGE: oneapi_base
# BUILD_IMAGE: jug_dev_oneapi # BUILD_IMAGE: jug_dev_oneapi
# PLATFORM: linux/amd64 # PLATFORM: linux/amd64
...@@ -255,25 +249,36 @@ jug_dev:default: ...@@ -255,25 +249,36 @@ jug_dev:default:
- base - base
script: script:
- docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
## calculate a hash based on the spack.yaml file and the spack directory - docker buildx create --name builder --driver docker-container --bootstrap --use
## and use this spack as a docker variable to force a rebuild when there ## Which targets to build
## is a change (versus rerun from cache) - TARGETS="export"
- PACKAGE_HASH=$(sha1sum spack.yaml | head -c40) - |
- echo "PACKAGE_HASH=${PACKAGE_HASH}" if [ ${EXPORT_BUILDER} = 1 ]; then
## move spack.yaml into the container build directory TARGETS="builder ${TARGETS}"
- cp -r spack.yaml containers/jug fi
## Disable caching
- CACHE_FLAG="" - CACHE_FLAG=""
- | - |
if [ $FORCE_NOCACHE = 1 ]; then if [ $FORCE_NOCACHE = 1 ]; then
echo "FORCE_NOCACHE set" echo "FORCE_NOCACHE set"
export CACHE_FLAG="--no-cache" export CACHE_FLAG="--no-cache"
fi fi
## Optionally build the raw builder image ## Build targets
- test ${EXPORT_BUILDER} = 1 && docker buildx build --load ${CACHE_FLAG} - for target in ${TARGETS} ; do
-t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:builder-${INTERNAL_TAG} if [ ! ${target} = export ] ; then
--target=builder suffix=-${target} ;
fi ;
docker buildx build --push
--target ${target}
${CACHE_FLAG}
-t ${CI_REGISTRY}/${CI_PROJECT_PATH}/${BUILD_IMAGE}:${INTERNAL_TAG}${suffix}
${EXPORT_TAG:+
${CI_PUSH:+-t ${CI_REGISTRY}/${CI_PROJECT_PATH}/${BUILD_IMAGE}:${EXPORT_TAG}${suffix}}
${DH_PUSH:+-t ${DH_REGISTRY}/${DH_REGISTRY_USER}/${BUILD_IMAGE}:${EXPORT_TAG}${suffix}}
${GH_PUSH:+-t ${GH_REGISTRY}/${GH_REGISTRY_USER}/${BUILD_IMAGE}:${EXPORT_TAG}${suffix}}
}
-f containers/jug/dev.Dockerfile -f containers/jug/dev.Dockerfile
${PLATFORM:+--platform ${PLATFORM}} --platform ${PLATFORM}
--build-arg BASE_IMAGE="${BASE_IMAGE}" --build-arg BASE_IMAGE="${BASE_IMAGE}"
--build-arg SPACK_ORGREPO="${SPACK_ORGREPO}" --build-arg SPACK_ORGREPO="${SPACK_ORGREPO}"
--build-arg SPACK_VERSION="${SPACK_VERSION}" --build-arg SPACK_VERSION="${SPACK_VERSION}"
...@@ -285,58 +290,18 @@ jug_dev:default: ...@@ -285,58 +290,18 @@ jug_dev:default:
--build-arg S3_SECRET_KEY="${S3_SECRET_KEY}" --build-arg S3_SECRET_KEY="${S3_SECRET_KEY}"
--build-arg S3RW_ACCESS_KEY="${S3RW_ACCESS_KEY}" --build-arg S3RW_ACCESS_KEY="${S3RW_ACCESS_KEY}"
--build-arg S3RW_SECRET_KEY="${S3RW_SECRET_KEY}" --build-arg S3RW_SECRET_KEY="${S3RW_SECRET_KEY}"
--build-arg CACHE_BUST=${PACKAGE_HASH}
--build-arg INTERNAL_TAG=${INTERNAL_TAG} --build-arg INTERNAL_TAG=${INTERNAL_TAG}
--build-arg JUG_VERSION=${INTERNAL_TAG}-$(git rev-parse HEAD) --build-arg JUG_VERSION=${INTERNAL_TAG}-$(git rev-parse HEAD)
--build-context spack=.
containers/jug containers/jug
## now build our image ; done
- docker buildx build --load -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${INTERNAL_TAG} ${CACHE_FLAG}
-f containers/jug/dev.Dockerfile
${PLATFORM:+--platform ${PLATFORM}}
--build-arg BASE_IMAGE="${BASE_IMAGE}"
--build-arg SPACK_ORGREPO="${SPACK_ORGREPO}"
--build-arg SPACK_VERSION="${SPACK_VERSION}"
--build-arg SPACK_CHERRYPICKS="${SPACK_CHERRYPICKS}"
--build-arg EICSPACK_ORGREPO="${EICSPACK_ORGREPO}"
--build-arg EICSPACK_VERSION="${EICSPACK_VERSION}"
--build-arg EICSPACK_CHERRYPICKS="${EICSPACK_CHERRYPICKS}"
--build-arg S3_ACCESS_KEY="${S3_ACCESS_KEY}"
--build-arg S3_SECRET_KEY="${S3_SECRET_KEY}"
--build-arg S3RW_ACCESS_KEY="${S3RW_ACCESS_KEY}"
--build-arg S3RW_SECRET_KEY="${S3RW_SECRET_KEY}"
--build-arg CACHE_BUST=${PACKAGE_HASH}
--build-arg INTERNAL_TAG=${INTERNAL_TAG}
--build-arg JUG_VERSION=${INTERNAL_TAG}-$(git rev-parse HEAD)
containers/jug
## push builder image do DH if desired
- test ${EXPORT_BUILDER} = 1 && ./gitlab-ci/docker_push.sh
-i ${BUILD_IMAGE} -l builder-${INTERNAL_TAG}
-n ${DOCKER_NTRIES} -t ${DOCKER_WAIT_TIME}
builder-${EXPORT_TAG} --dockerhub
## standard exports
- !reference [.build, script]
jug_dev:multiarch:
parallel:
matrix:
- IMAGE: jug_dev
ARCHS: "amd64 arm64v8"
stage: jug
needs:
- version
- jug_dev:default
script:
- echo docker manifest create ${IMAGE}:${EXPORT_TAG} $(echo ${ARCHS} | xargs -d " " -I "{}" echo -n "--amend ${IMAGE}:${EXPORT_TAG}-{}")
jug_xl:default: jug_xl:default:
parallel: parallel:
matrix: matrix:
- BASE_IMAGE: jug_dev - BASE_IMAGE: jug_dev
BUILD_IMAGE: jug_xl BUILD_IMAGE: jug_xl
PLATFORM: linux/amd64 PLATFORM: linux/amd64,linux/arm64/v8
- BASE_IMAGE: jug_dev_arm64v8
BUILD_IMAGE: jug_xl_arm64v8
PLATFORM: linux/arm64/v8
# - BASE_IMAGE: jug_dev_oneapi # - BASE_IMAGE: jug_dev_oneapi
# BUILD_IMAGE: jug_xl_oneapi # BUILD_IMAGE: jug_xl_oneapi
# PLATFORM: linux/amd64 # PLATFORM: linux/amd64
...@@ -347,27 +312,30 @@ jug_xl:default: ...@@ -347,27 +312,30 @@ jug_xl:default:
- jug_dev:default - jug_dev:default
script: script:
- docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
- docker buildx create --name builder --driver docker-container --bootstrap --use
- cp detectors.yaml containers/jug - cp detectors.yaml containers/jug
- docker buildx build --load -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${INTERNAL_TAG} - docker buildx build --push
-t ${CI_REGISTRY}/${CI_PROJECT_PATH}/${BUILD_IMAGE}:${INTERNAL_TAG}
${EXPORT_TAG:+
${CI_PUSH:+-t ${CI_REGISTRY}/${CI_PROJECT_PATH}/${BUILD_IMAGE}:${EXPORT_TAG}}
${DH_PUSH:+-t ${DH_REGISTRY}/${DH_REGISTRY_USER}/${BUILD_IMAGE}:${EXPORT_TAG}}
${GH_PUSH:+-t ${GH_REGISTRY}/${GH_REGISTRY_USER}/${BUILD_IMAGE}:${EXPORT_TAG}}
}
-f containers/jug/xl.Dockerfile -f containers/jug/xl.Dockerfile
${PLATFORM:+--platform ${PLATFORM}} --platform ${PLATFORM}
--build-arg BASE_IMAGE=${BASE_IMAGE} --build-arg BASE_IMAGE=${BASE_IMAGE}
--build-arg INTERNAL_TAG=${INTERNAL_TAG} --build-arg INTERNAL_TAG=${INTERNAL_TAG}
--build-arg JUGGLER_VERSION=${JUGGLER_VERSION} --build-arg JUGGLER_VERSION=${JUGGLER_VERSION}
--build-arg EICRECON_VERSION=${EICRECON_VERSION} --build-arg EICRECON_VERSION=${EICRECON_VERSION}
--build-arg JUG_VERSION=${INTERNAL_TAG}-$(git rev-parse HEAD) --build-arg JUG_VERSION=${INTERNAL_TAG}-$(git rev-parse HEAD)
containers/jug containers/jug
- !reference [.build, script]
jug_xl:nightly: jug_xl:nightly:
parallel: parallel:
matrix: matrix:
- BASE_IMAGE: jug_dev - BASE_IMAGE: jug_dev
BUILD_IMAGE: jug_xl BUILD_IMAGE: jug_xl
PLATFORM: linux/amd64 PLATFORM: linux/amd64,linux/arm64/v8
- BASE_IMAGE: jug_dev_arm64v8
BUILD_IMAGE: jug_xl_arm64v8
PLATFORM: linux/arm64/v8
# - BASE_IMAGE: jug_dev_oneapi # - BASE_IMAGE: jug_dev_oneapi
# BUILD_IMAGE: jug_xl_oneapi # BUILD_IMAGE: jug_xl_oneapi
# PLATFORM: linux/amd64 # PLATFORM: linux/amd64
...@@ -384,31 +352,31 @@ jug_xl:nightly: ...@@ -384,31 +352,31 @@ jug_xl:nightly:
- jug_dev:default - jug_dev:default
script: script:
- docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
- docker buildx create --name builder --driver docker-container --bootstrap --use
- cp detectors.yaml containers/jug - cp detectors.yaml containers/jug
- docker buildx build --load -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${NIGHTLY_TAG} - |
PUSH_NIGHTLY_WITH_DATE=""
if [ "$CI_COMMIT_BRANCH" == "master" ]; then
PUSH_NIGHTLY_WITH_DATE="1"
fi
- docker buildx build --push
-t ${CI_REGISTRY}/${CI_PROJECT_PATH}/${BUILD_IMAGE}:${INTERNAL_TAG}
${EXPORT_TAG:+
${CI_PUSH:+-t ${CI_REGISTRY}/${CI_PROJECT_PATH}/${BUILD_IMAGE}:${EXPORT_TAG}}
${DH_PUSH:+-t ${DH_REGISTRY}/${DH_REGISTRY_USER}/${BUILD_IMAGE}:${NIGHTLY_TAG}}
${GH_PUSH:+-t ${GH_REGISTRY}/${GH_REGISTRY_USER}/${BUILD_IMAGE}:${NIGHTLY_TAG}}
}
${PUSH_NIGHTLY_WITH_DATE:+
${DH_PUSH:+-t ${DH_REGISTRY}/${DH_REGISTRY_USER}/${NIGHTLY_TAG}-$(date +%Y-%m-%d)}
${GH_PUSH:+-t ${GH_REGISTRY}/${GH_REGISTRY_USER}/${NIGHTLY_TAG}-$(date +%Y-%m-%d)}
}
-f containers/jug/xl.Dockerfile -f containers/jug/xl.Dockerfile
${PLATFORM:+--platform ${PLATFORM}} --platform ${PLATFORM}
--build-arg BASE_IMAGE=${BASE_IMAGE} --build-arg BASE_IMAGE=${BASE_IMAGE}
--build-arg INTERNAL_TAG=${INTERNAL_TAG} --build-arg INTERNAL_TAG=${INTERNAL_TAG}
--build-arg JUG_VERSION=nightly-$(date +%Y-%m-%d_%H-%M-%S)-${INTERNAL_TAG}-$(git rev-parse HEAD) --build-arg JUG_VERSION=nightly-$(date +%Y-%m-%d_%H-%M-%S)-${INTERNAL_TAG}-$(git rev-parse HEAD)
--build-arg NIGHTLY=1 --build-arg NIGHTLY=1
containers/jug containers/jug
- |
PUSH_FLAG=""
if [ "$CI_PIPELINE_SOURCE" == "merge_request_event" ]; then
PUSH_FLAG="--eicweb"
fi
- ./gitlab-ci/docker_push.sh -i ${BUILD_IMAGE} -l ${NIGHTLY_TAG}
-n $DOCKER_NTRIES -t $DOCKER_WAIT_TIME
${NIGHTLY_TAG} ${PUSH_FLAG}
- if [ -z "${PUSH_FLAG}" ] ; then
./gitlab-ci/docker_push.sh -i ${BUILD_IMAGE} -l ${NIGHTLY_TAG}
-n $DOCKER_NTRIES -t $DOCKER_WAIT_TIME
${NIGHTLY_TAG}-$(date +%Y-%m-%d) --ghcr ;
./gitlab-ci/docker_push.sh -i ${BUILD_IMAGE} -l ${NIGHTLY_TAG}
-n $DOCKER_NTRIES -t $DOCKER_WAIT_TIME
${NIGHTLY_TAG}-$(date +%Y-%m-%d) --dockerhub ;
fi
jug_xl:feature: jug_xl:feature:
extends: .build extends: .build
......
#syntax=docker/dockerfile:1.2 #syntax=docker/dockerfile:1.4
ARG DOCKER_REGISTRY="eicweb.phy.anl.gov:4567/containers/eic_container/" ARG DOCKER_REGISTRY="eicweb.phy.anl.gov:4567/containers/eic_container/"
ARG BASE_IMAGE="debian_base" ARG BASE_IMAGE="debian_base"
ARG INTERNAL_TAG="testing" ARG INTERNAL_TAG="testing"
...@@ -97,7 +97,7 @@ RUN git clone https://github.com/${EICSPACK_ORGREPO}.git ${EICSPACK_ROOT} \ ...@@ -97,7 +97,7 @@ RUN git clone https://github.com/${EICSPACK_ORGREPO}.git ${EICSPACK_ROOT} \
&& spack repo add --scope site "${EICSPACK_ROOT}" && spack repo add --scope site "${EICSPACK_ROOT}"
## Setup our custom environment ## Setup our custom environment
COPY spack.yaml /opt/spack-environment/ COPY --from=spack spack.yaml /opt/spack-environment/
RUN rm -r /usr/local \ RUN rm -r /usr/local \
&& source $SPACK_ROOT/share/spack/setup-env.sh \ && source $SPACK_ROOT/share/spack/setup-env.sh \
&& spack env activate /opt/spack-environment/ \ && spack env activate /opt/spack-environment/ \
...@@ -259,7 +259,7 @@ RUN chmod a+x /usr/local/bin/mc ...@@ -259,7 +259,7 @@ RUN chmod a+x /usr/local/bin/mc
## STAGE 3 ## STAGE 3
## Lean target image ## Lean target image
## ======================================================================================== ## ========================================================================================
FROM ${DOCKER_REGISTRY}${BASE_IMAGE}:${INTERNAL_TAG} FROM ${DOCKER_REGISTRY}${BASE_IMAGE}:${INTERNAL_TAG} as export
ARG TARGETPLATFORM ARG TARGETPLATFORM
LABEL maintainer="Sylvester Joosten <sjoosten@anl.gov>" \ LABEL maintainer="Sylvester Joosten <sjoosten@anl.gov>" \
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment