diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index af5316914b5385da60b0ac7716476dac02925d5b..43e365497ce0cff5898acf223017b75450c05a82 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -193,22 +193,28 @@ base: parallel: matrix: - BASE_IMAGE: amd64/debian:testing-20220822-slim - BUILD_IMAGE: debian_testing_base - - BASE_IMAGE: amd64/debian:stable-20220527-slim - BUILD_IMAGE: debian_stable_base_new - - BASE_IMAGE: ubuntu:20.04 - BUILD_IMAGE: ubuntu_base + BUILD_IMAGE: amd64_debian_testing_base + - BASE_IMAGE: amd64/ubuntu:20.04 + BUILD_IMAGE: amd64_ubuntu_base - BASE_IMAGE: intel/oneapi-hpckit:2022.3.0-devel-ubuntu20.04 BUILD_IMAGE: oneapi_base - BASE_IMAGE: nvidia/cuda:11.8.0-devel-ubuntu20.04 BUILD_IMAGE: cuda_base + - BASE_IMAGE: arm64v8/debian:testing-20220822-slim + BUILD_IMAGE: arm64v8_debian_testing_base +# - BASE_IMAGE: debian:testing-20220822-slim +# BUILD_IMAGE: debian_testing_base_multiarch +# PLATFORM: linux/amd64,linux/arm64/v8 extends: .build stage: base needs: - version script: - - docker build -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${INTERNAL_TAG} + - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes + - docker buildx create --name builder --driver docker-container --bootstrap --use + - docker buildx build -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${INTERNAL_TAG} -f containers/debian/base.Dockerfile + ${PLATFORM:+--platform ${PLATFORM}} --build-arg BASE_IMAGE=${BASE_IMAGE} --build-arg BUILD_IMAGE=${BUILD_IMAGE} containers/debian @@ -217,18 +223,25 @@ base: jug_dev:default: parallel: matrix: - - BASE_IMAGE: debian_testing_base + - BASE_IMAGE: amd64_debian_testing_base BUILD_IMAGE: jug_dev + SPACK_ARCH: x86_64 + - BASE_IMAGE: arm64v8_debian_testing_base + BUILD_IMAGE: jug_dev_arm64v8 + SPACK_ARCH: aarch64 # - BASE_IMAGE: oneapi_base # BUILD_IMAGE: jug_dev_oneapi +# SPACK_ARCH: x86_64 # - BASE_IMAGE: cuda_base_new # BUILD_IMAGE: jug_dev_cuda +# SPACK_ARCH: x86_64 extends: .build stage: jug needs: - version - 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) @@ -243,11 +256,12 @@ jug_dev:default: export CACHE_FLAG="--no-cache" fi ## Optionally build the raw builder image - - test ${EXPORT_BUILDER} = 1 && docker build ${CACHE_FLAG} + - test ${EXPORT_BUILDER} = 1 && docker buildx build ${CACHE_FLAG} -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:builder-${INTERNAL_TAG} --target=builder -f containers/jug/dev.Dockerfile --build-arg BASE_IMAGE="${BASE_IMAGE}" + --build-arg SPACK_ARCH="${SPACK_ARCH}" --build-arg SPACK_ORGREPO="${SPACK_ORGREPO}" --build-arg SPACK_VERSION="${SPACK_VERSION}" --build-arg SPACK_CHERRYPICKS="${SPACK_CHERRYPICKS}" @@ -261,9 +275,10 @@ jug_dev:default: --build-arg JUG_VERSION=${INTERNAL_TAG}-$(git rev-parse HEAD) containers/jug ## now build our image - - docker build -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${INTERNAL_TAG} ${CACHE_FLAG} + - docker buildx build -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${INTERNAL_TAG} ${CACHE_FLAG} -f containers/jug/dev.Dockerfile --build-arg BASE_IMAGE="${BASE_IMAGE}" + --build-arg SPACK_ARCH="${SPACK_ARCH}" --build-arg SPACK_ORGREPO="${SPACK_ORGREPO}" --build-arg SPACK_VERSION="${SPACK_VERSION}" --build-arg SPACK_CHERRYPICKS="${SPACK_CHERRYPICKS}" @@ -284,19 +299,37 @@ jug_dev:default: ## 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: parallel: matrix: - BASE_IMAGE: jug_dev BUILD_IMAGE: jug_xl + DOCKER_ARCH: amd64 + - BASE_IMAGE: jug_dev_arm64v8 + BUILD_IMAGE: jug_xl_arm64v8 + DOCKER_ARCH: arm64v8 # - BASE_IMAGE: jug_dev_oneapi # BUILD_IMAGE: jug_xl_oneapi +# DOCKER_ARCH: amd64 extends: .build stage: jug needs: - version - jug_dev:default script: + - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - cp detectors.yaml containers/jug - docker build -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${INTERNAL_TAG} -f containers/jug/xl.Dockerfile @@ -312,8 +345,13 @@ jug_xl:nightly: matrix: - BASE_IMAGE: jug_dev BUILD_IMAGE: jug_xl + DOCKER_ARCH: amd64 + - BASE_IMAGE: jug_dev_arm64v8 + BUILD_IMAGE: jug_xl_arm64v8 + DOCKER_ARCH: arm64v8 # - BASE_IMAGE: jug_dev_oneapi # BUILD_IMAGE: jug_xl_oneapi +# DOCKER_ARCH: amd64 extends: .build stage: jug rules: @@ -326,6 +364,7 @@ jug_xl:nightly: - version - jug_dev:default script: + - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes - cp detectors.yaml containers/jug - docker build -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${NIGHTLY_TAG} -f containers/jug/xl.Dockerfile diff --git a/containers/debian/base.Dockerfile b/containers/debian/base.Dockerfile index bb2c26d65348ebd92e1b8ed40de4ecf606d476f6..6791c2ba85367479b1731d0847693b75cbbd4b9c 100644 --- a/containers/debian/base.Dockerfile +++ b/containers/debian/base.Dockerfile @@ -17,8 +17,8 @@ ENV CLICOLOR_FORCE=1 \ ## Install additional packages. Remove the auto-cleanup functionality ## for docker, as we're using the new buildkit cache instead. -RUN --mount=type=cache,target=/var/cache/apt \ - --mount=type=cache,target=/var/lib/apt/lists \ +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt/lists,sharing=locked \ rm -f /etc/apt/apt.conf.d/docker-clean \ && ln -fs /usr/share/zoneinfo/America/New_York /etc/localtime \ && echo "US/Eastern" > /etc/timezone \ @@ -60,8 +60,8 @@ RUN --mount=type=cache,target=/var/cache/apt \ # Install updated compilers, with support for multiple base images ## Ubuntu: latest gcc from toolchain ppa, latest stable clang ## Debian: default gcc with distribution, latest stable clang -RUN --mount=type=cache,target=/var/cache/apt \ - --mount=type=cache,target=/var/lib/apt/lists \ +RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt/lists,sharing=locked \ . /etc/os-release \ && mkdir -p /etc/apt/source.list.d \ && if [ "${ID}" = "ubuntu" ] ; then \ diff --git a/containers/jug/dev.Dockerfile b/containers/jug/dev.Dockerfile index ffae11e3a7ff0a3fbaf05dfb4d8ce1df5ab4de00..c31dc6b0694b0e0fa1143896e6bf2319cdb3dd54 100644 --- a/containers/jug/dev.Dockerfile +++ b/containers/jug/dev.Dockerfile @@ -23,6 +23,7 @@ RUN --mount=type=cache,target=/var/cache/apt \ ## Setup spack ## parts: +ARG SPACK_ARCH="x86_64" ENV SPACK_ROOT=/opt/spack ARG SPACK_ORGREPO="spack/spack" ARG SPACK_VERSION="develop" @@ -30,8 +31,8 @@ ARG SPACK_CHERRYPICKS="" ADD https://api.github.com/repos/${SPACK_ORGREPO}/commits/${SPACK_VERSION} /tmp/spack.json RUN git clone https://github.com/${SPACK_ORGREPO}.git ${SPACK_ROOT} \ && git -C ${SPACK_ROOT} checkout ${SPACK_VERSION} \ - && if [ -n "$SPACK_CHERRYPICKS" ] ; then \ - git -C ${SPACK_ROOT} cherry-pick -n $SPACK_CHERRYPICKS ; \ + && if [ -n "${SPACK_CHERRYPICKS}" ] ; then \ + git -C ${SPACK_ROOT} cherry-pick -n ${SPACK_CHERRYPICKS} ; \ fi \ && ln -s $SPACK_ROOT/share/spack/docker/entrypoint.bash \ /usr/sbin/docker-shell \ @@ -40,7 +41,7 @@ RUN git clone https://github.com/${SPACK_ORGREPO}.git ${SPACK_ROOT} \ && ln -s $SPACK_ROOT/share/spack/docker/entrypoint.bash \ /usr/sbin/spack-env \ && export PATH=${PATH}:${SPACK_ROOT}/bin \ - && spack config --scope site add "packages:all:require:arch=x86_64" \ + && spack config --scope site add "packages:all:require:arch=${SPACK_ARCH}" \ && spack config blame packages \ && spack config --scope site add "config:suppress_gpg_warnings:true" \ && spack config --scope site add "config:build_jobs:64" \ @@ -92,6 +93,7 @@ RUN git clone https://github.com/${EICSPACK_ORGREPO}.git ${EICSPACK_ROOT} \ ## Setup our custom environment COPY spack.yaml /opt/spack-environment/ RUN rm -r /usr/local \ + && source $SPACK_ROOT/share/spack/setup-env.sh \ && spack env activate /opt/spack-environment/ \ && spack concretize --fresh @@ -111,7 +113,7 @@ RUN rm -r /usr/local \ ## 3. Add packages that need to be added to buildcache if any RUN --mount=type=cache,target=/var/cache/spack-mirror \ cd /opt/spack-environment \ - && ls /var/cache/spack-mirror \ + && source $SPACK_ROOT/share/spack/setup-env.sh \ && spack env activate . \ && status=0 \ && spack install -j64 --no-check-signature \ @@ -139,7 +141,9 @@ RUN --mount=type=cache,target=/var/cache/spack-mirror \ COPY requirements.txt /usr/local/etc/requirements.txt RUN --mount=type=cache,target=/var/cache/pip \ echo "Installing additional python packages" \ - && cd /opt/spack-environment && spack env activate . \ + && cd /opt/spack-environment \ + && source $SPACK_ROOT/share/spack/setup-env.sh \ + && spack env activate . \ && python -m pip install \ --trusted-host pypi.org \ --trusted-host files.pythonhosted.org \ @@ -152,6 +156,7 @@ RUN --mount=type=cache,target=/var/cache/pip \ ## - Somehow PODIO env isn't automatically set, ## - and Gaudi likes BINARY_TAG to be set RUN cd /opt/spack-environment \ + && source $SPACK_ROOT/share/spack/setup-env.sh \ && echo -n "" \ && echo "Grabbing environment info" \ && spack env activate --sh -d . \ @@ -179,7 +184,10 @@ WORKDIR / FROM builder as staging # Garbage collect in environment -RUN cd /opt/spack-environment && spack env activate . && spack gc -y +RUN cd /opt/spack-environment \ + && source $SPACK_ROOT/share/spack/setup-env.sh \ + && spack env activate . \ + && spack gc -y ## Bugfix to address issues loading the Qt5 libraries on Linux kernels prior to 3.15 ## See diff --git a/spack.yaml b/spack.yaml index eeda5fefa642758c84e12228a83e6e903d2c29dd..e95ab0538362200e9c93cd954d106e5ba31db21e 100644 --- a/spack.yaml +++ b/spack.yaml @@ -25,7 +25,6 @@ spack: - geant4@11.1.0 cxxstd=17 +opengl +vecgeom +x11 +qt +threads - hepmc3@3.2.5 +python +rootio - heppdt@2.06.01 - - igprof@5.9.16 - imagemagick@7.0.8-7 - intel-tbb@2020.3 - irt@1.0.0