diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index b1290d8a983deae0fb7034d66b8eeaa4e2ef7ee9..bf17fc6268703f2abf787741c398a9859d3bc6f6 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -39,15 +39,15 @@ variables: ## [hash]: [description] ## f892e2b5d7ea9d1f2e43741499e899ce21dd3d5a: py-minkowskiengine: new package - ## We need to enable Docker Buildkit to use cache mounts and better - ## build performance overall - DOCKER_BUILDKIT: 1 - + ## Local registry + CI_PUSH: 1 ## Dockerhub registry + DH_REGISTRY: docker.io DH_REGISTRY_USER: eicweb DH_PUSH: 1 ## GitHub registry GH_REGISTRY: ghcr.io + GH_REGISTRY_USER: eic GH_PUSH: 1 ## Also export the raw builder image, will be stored on DH only @@ -73,7 +73,6 @@ variables: TESTING_TAG: "testing" INTERNAL_TAG: "${TESTING_TAG}-${VERSION}" EXPORT_TAG: "" - EXPORT_TAG2: "" stages: - config @@ -157,7 +156,6 @@ version: echo "INTERNAL_TAG=$INTERNAL_TAG" >> build.env echo "NIGHTLY_TAG=$NIGHTLY_TAG" >> build.env echo "EXPORT_TAG=$EXPORT_TAG" >> build.env - echo "EXPORT_TAG2=$EXPORT_TAG2" >> build.env cat build.env artifacts: @@ -200,24 +198,18 @@ version: base: parallel: matrix: - - BASE_IMAGE: amd64/debian:testing-20220822-slim - BUILD_IMAGE: amd64_debian_testing_base - PLATFORM: linux/amd64 - - BASE_IMAGE: amd64/ubuntu:20.04 - BUILD_IMAGE: amd64_ubuntu_base - PLATFORM: linux/amd64 + - BASE_IMAGE: debian:testing-20220822-slim + BUILD_IMAGE: debian_testing_base + PLATFORM: linux/amd64,linux/arm64/v8 + - BASE_IMAGE: ubuntu:20.04 + BUILD_IMAGE: ubuntu_base + PLATFORM: linux/amd64,linux/arm64/v8 - BASE_IMAGE: intel/oneapi-hpckit:2022.3.0-devel-ubuntu20.04 BUILD_IMAGE: oneapi_base PLATFORM: linux/amd64 # - BASE_IMAGE: nvidia/cuda:11.8.0-devel-ubuntu20.04 # BUILD_IMAGE: cuda_base # 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 stage: base needs: @@ -225,23 +217,25 @@ base: script: - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - 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 - ${PLATFORM:+--platform ${PLATFORM}} + --platform ${PLATFORM} --build-arg BASE_IMAGE=${BASE_IMAGE} --build-arg BUILD_IMAGE=${BUILD_IMAGE} containers/debian - - !reference [.build, script] jug_dev:default: parallel: matrix: - - BASE_IMAGE: amd64_debian_testing_base + - BASE_IMAGE: debian_testing_base BUILD_IMAGE: jug_dev - PLATFORM: linux/amd64 - - BASE_IMAGE: arm64v8_debian_testing_base - BUILD_IMAGE: jug_dev_arm64v8 - PLATFORM: linux/arm64/v8 + PLATFORM: linux/amd64,linux/arm64/v8 # - BASE_IMAGE: oneapi_base # BUILD_IMAGE: jug_dev_oneapi # PLATFORM: linux/amd64 @@ -255,25 +249,36 @@ jug_dev:default: - base script: - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - ## calculate a hash based on the spack.yaml file and the spack directory - ## and use this spack as a docker variable to force a rebuild when there - ## is a change (versus rerun from cache) - - PACKAGE_HASH=$(sha1sum spack.yaml | head -c40) - - echo "PACKAGE_HASH=${PACKAGE_HASH}" - ## move spack.yaml into the container build directory - - cp -r spack.yaml containers/jug + - docker buildx create --name builder --driver docker-container --bootstrap --use + ## Which targets to build + - TARGETS="export" + - | + if [ ${EXPORT_BUILDER} = 1 ]; then + TARGETS="builder ${TARGETS}" + fi + ## Disable caching - CACHE_FLAG="" - | if [ $FORCE_NOCACHE = 1 ]; then echo "FORCE_NOCACHE set" export CACHE_FLAG="--no-cache" fi - ## Optionally build the raw builder image - - test ${EXPORT_BUILDER} = 1 && docker buildx build --load ${CACHE_FLAG} - -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:builder-${INTERNAL_TAG} - --target=builder + ## Build targets + - for target in ${TARGETS} ; do + if [ ! ${target} = export ] ; then + 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 - ${PLATFORM:+--platform ${PLATFORM}} + --platform ${PLATFORM} --build-arg BASE_IMAGE="${BASE_IMAGE}" --build-arg SPACK_ORGREPO="${SPACK_ORGREPO}" --build-arg SPACK_VERSION="${SPACK_VERSION}" @@ -285,58 +290,18 @@ jug_dev:default: --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) + --build-context spack=. containers/jug - ## now build our image - - 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}-{}") + ; done jug_xl:default: parallel: matrix: - BASE_IMAGE: jug_dev BUILD_IMAGE: jug_xl - PLATFORM: linux/amd64 - - BASE_IMAGE: jug_dev_arm64v8 - BUILD_IMAGE: jug_xl_arm64v8 - PLATFORM: linux/arm64/v8 + PLATFORM: linux/amd64,linux/arm64/v8 # - BASE_IMAGE: jug_dev_oneapi # BUILD_IMAGE: jug_xl_oneapi # PLATFORM: linux/amd64 @@ -347,27 +312,30 @@ jug_xl:default: - jug_dev:default script: - 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 - - 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 - ${PLATFORM:+--platform ${PLATFORM}} + --platform ${PLATFORM} --build-arg BASE_IMAGE=${BASE_IMAGE} --build-arg INTERNAL_TAG=${INTERNAL_TAG} --build-arg JUGGLER_VERSION=${JUGGLER_VERSION} --build-arg EICRECON_VERSION=${EICRECON_VERSION} --build-arg JUG_VERSION=${INTERNAL_TAG}-$(git rev-parse HEAD) containers/jug - - !reference [.build, script] jug_xl:nightly: parallel: matrix: - BASE_IMAGE: jug_dev BUILD_IMAGE: jug_xl - PLATFORM: linux/amd64 - - BASE_IMAGE: jug_dev_arm64v8 - BUILD_IMAGE: jug_xl_arm64v8 - PLATFORM: linux/arm64/v8 + PLATFORM: linux/amd64,linux/arm64/v8 # - BASE_IMAGE: jug_dev_oneapi # BUILD_IMAGE: jug_xl_oneapi # PLATFORM: linux/amd64 @@ -384,31 +352,31 @@ jug_xl:nightly: - jug_dev:default script: - 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 - - 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 - ${PLATFORM:+--platform ${PLATFORM}} + --platform ${PLATFORM} --build-arg BASE_IMAGE=${BASE_IMAGE} --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 NIGHTLY=1 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: extends: .build diff --git a/containers/jug/dev.Dockerfile b/containers/jug/dev.Dockerfile index 429f92bd292b4a03e3ba8f15f31a6ef5862950fd..7d516e06f257ab762fec1ed0dc25a6e694dd72b4 100644 --- a/containers/jug/dev.Dockerfile +++ b/containers/jug/dev.Dockerfile @@ -1,4 +1,4 @@ -#syntax=docker/dockerfile:1.2 +#syntax=docker/dockerfile:1.4 ARG DOCKER_REGISTRY="eicweb.phy.anl.gov:4567/containers/eic_container/" ARG BASE_IMAGE="debian_base" ARG INTERNAL_TAG="testing" @@ -97,7 +97,7 @@ RUN git clone https://github.com/${EICSPACK_ORGREPO}.git ${EICSPACK_ROOT} \ && spack repo add --scope site "${EICSPACK_ROOT}" ## Setup our custom environment -COPY spack.yaml /opt/spack-environment/ +COPY --from=spack spack.yaml /opt/spack-environment/ RUN rm -r /usr/local \ && source $SPACK_ROOT/share/spack/setup-env.sh \ && spack env activate /opt/spack-environment/ \ @@ -259,7 +259,7 @@ RUN chmod a+x /usr/local/bin/mc ## STAGE 3 ## Lean target image ## ======================================================================================== -FROM ${DOCKER_REGISTRY}${BASE_IMAGE}:${INTERNAL_TAG} +FROM ${DOCKER_REGISTRY}${BASE_IMAGE}:${INTERNAL_TAG} as export ARG TARGETPLATFORM LABEL maintainer="Sylvester Joosten <sjoosten@anl.gov>" \