From 1dbcc37fb5cba0cb55e913d624e3b19b9fd01730 Mon Sep 17 00:00:00 2001 From: Sylvester Joosten <sylvester.joosten@gmail.com> Date: Thu, 10 Jun 2021 02:29:42 +0000 Subject: [PATCH] Resolve "Tweak singularity container deploy" --- .gitlab-ci.yml | 5 +++-- README.md | 14 ++++++++++++ containers/jug/Dockerfile.dev | 21 +++++++++++++----- containers/jug/Dockerfile.xl | 28 +++++++++++++++++++----- install_dev.sh => download_dev.sh | 19 ++++++++++++---- install.py | 2 +- install.sh | 36 ++++++++++++++++++------------- 7 files changed, 93 insertions(+), 32 deletions(-) rename install_dev.sh => download_dev.sh (77%) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index e7bd17536..f38d409bc 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -177,6 +177,7 @@ jug_dev:default: --build-arg SPACK_VERSION=${SPACK_VERSION} --build-arg CACHE_BUST=${PACKAGE_HASH} --build-arg INTERNAL_TAG=${INTERNAL_TAG} + --build-arg JUG_VERSION=${INTERNAL_TAG}-$(git rev-parse HEAD) containers/jug - !reference [.build, script] @@ -197,6 +198,7 @@ jug_xl:default: --build-arg EICD_VERSION=${EICD_VERSION} --build-arg DETECTOR_VERSION=${DETECTOR_VERSION} --build-arg IP6_VERSION=${IP6_VERSION} + --build-arg JUG_VERSION=${INTERNAL_TAG}-$(git rev-parse HEAD) containers/jug - !reference [.build, script] @@ -213,11 +215,10 @@ jug_xl:nightly: variables: BUILD_IMAGE: "jug_xl" script: - - CACHEBUST=`date +%s` - docker build -t ${CI_REGISTRY_IMAGE}/${BUILD_IMAGE}:${NIGHTLY_TAG} -f containers/jug/Dockerfile.xl --build-arg INTERNAL_TAG=${INTERNAL_TAG} - --build-arg CACHEBUST=${CACHEBUST} + --build-arg JUG_VERSION=nightly-$(date +%Y-%m-%d_%H-%M-%S)-$(git rev-parse HEAD) containers/jug - ./gitlab-ci/docker_push.sh -i ${BUILD_IMAGE} -l ${NIGHTLY_TAG} -n $DOCKER_NTRIES -t $DOCKER_WAIT_TIME diff --git a/README.md b/README.md index f1c861fdc..d0456e6a4 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,20 @@ eic-shell 4. Within your development environment (`eic-shell`), you can install software to the internal `$ATHENA_PREFIX` +Singularity Container Dowload for Development Usage +------------- +**Note: this container download script is meant for expert usage. If it is unclear to you +why you would want to do this, you are probably looking for the single installation +above.** +To download the `jug_dev:testing` base image, do +```bash +curl https://eicweb.phy.anl.gov/containers/eic_container/-/raw/master/download_dev.sh | bash +``` +To download the `jug_xl:nightly` image, do +```bash +curl https://eicweb.phy.anl.gov/containers/eic_container/-/raw/master/download_dev.sh | bash -s -- -c jug_xl -v nightly +``` + Using the docker container for your CI purposes ----------------------------------------------- diff --git a/containers/jug/Dockerfile.dev b/containers/jug/Dockerfile.dev index 4f1c3a291..e65606ac4 100644 --- a/containers/jug/Dockerfile.dev +++ b/containers/jug/Dockerfile.dev @@ -94,12 +94,13 @@ RUN --mount=type=cache,target=/var/cache/spack-mirror \ && spack clean -a ## Update the local build cache if needed. Consists of 3 steps: -## 1. Remove the B010 network buildcache +## 1. Remove the B010 network buildcache (silicon) ## 2. Get a list of all packages, and compare with what is already on ## the buildcache (using package hash) ## 3. Add packages that need to be added to buildcache if any RUN --mount=type=cache,target=/var/cache/spack-mirror \ - spack buildcache list --allarch --long \ + spack mirror remove silicon \ + && spack buildcache list --allarch --long \ | grep -v -e '---' \ | sed "s/@.\+//" \ | sort > tmp.buildcache.txt \ @@ -136,8 +137,6 @@ RUN cd /opt/spack-environment \ && echo -n "" \ && echo "Add extra environment variables for Jug, Podio and Gaudi" \ && spack env activate . \ - && echo "export JUG_DEV_VERSION=${INTERNAL_TAG}-$(date +%Y-%m-%d)" \ - >> /etc/profile.d/z11_jug_env.sh \ && export PODIO=`spack find -p podio \ | grep software \ | awk '{print $2}'` \ @@ -198,6 +197,14 @@ RUN strip --remove-section=.note.ABI-tag /usr/local/lib/libQt5Core.so COPY eic-shell /usr/local/bin/eic-shell COPY entrypoint.sh /usr/local/sbin/entrypoint.sh +RUN spack debug report \ + | sed "s/^/ - /" | sed "s/\* \*\*//" | sed "s/\*\*//" \ + >> /etc/jug_info \ + && spack find --no-groups | sed "s/^/ - /" >> /etc/jug_info \ + && echo "#!/bin/bash" > /usr/local/bin/eic-info \ + && echo "cat /etc/jug_info" >> /usr/local/bin/eic-info \ + && chmod +x /usr/local/bin/eic-info + ## ======================================================================================== ## STAGE 3 ## Lean target image @@ -218,8 +225,12 @@ RUN --mount=from=staging,target=/staging \ && cp /staging/etc/profile.d/z11_jug_env.sh \ /etc/profile.d/z11_jug_env.sh \ && cat /etc/profile.d/z11_jug_env.sh >> /etc/eic-env.sh \ - && cp /etc/eic-env.sh /etc/profile.d/z10_eic-env.sh + && cp /etc/eic-env.sh /etc/profile.d/z10_eic-env.sh \ + && cp /staging/etc/jug_info /etc/jug_info +ARG JUG_VERSION=1 +RUN echo "" >> /etc/jug_info \ + && echo " - jug_dev: ${JUG_VERSION}" >> /etc/jug_info ## make sure we have the entrypoints setup correctly ENTRYPOINT ["/usr/local/sbin/entrypoint.sh"] diff --git a/containers/jug/Dockerfile.xl b/containers/jug/Dockerfile.xl index c88868ea7..5e76ba363 100644 --- a/containers/jug/Dockerfile.xl +++ b/containers/jug/Dockerfile.xl @@ -11,25 +11,36 @@ ARG JUGGLER_VERSION="master" ARG NPDET_VERSION="master" ARG EICD_VERSION="master" -## cachebust that can change values to trigger a rebuild, useful for nightly builds -## off the master -ARG CACHEBUST=1 +## version will automatically bust cache for nightly, as it includes +## the date +ARG JUG_VERSION=1 RUN cd /tmp \ + && echo " - jug_xl: ${JUG_VERSION}" >> /etc/jug_info \ && echo "INSTALLING NPDET" \ && git clone -b ${NPDET_VERSION} https://eicweb.phy.anl.gov/EIC/NPDet.git \ && cmake -B build -S NPDet -DCMAKE_CXX_STANDARD=17 \ && cmake --build build -j12 -- install \ + && pushd NPDet \ + && echo " - NPDet: ${NPDET_VERSION}-$(git rev-parse HEAD)">> /etc/jug_info \ + && popd \ && rm -rf build NPDet \ && echo "INSTALLING EICD" \ && git clone -b ${EICD_VERSION} https://eicweb.phy.anl.gov/EIC/eicd.git \ && cmake -B build -S eicd -DCMAKE_CXX_STANDARD=17 \ && cmake --build build -j12 -- install \ + && pushd eicd \ + && echo " - EICD: ${EICD_VERSION}-$(git rev-parse HEAD)">> /etc/jug_info \ + && popd \ && rm -rf build eicd \ && echo "INSTALLING JUGGLER" \ && git clone -b ${JUGGLER_VERSION} https://eicweb.phy.anl.gov/EIC/juggler.git \ && cmake -B build -S juggler \ -DCMAKE_CXX_STANDARD=17 -DCMAKE_INSTALL_PREFIX=/usr/local \ && cmake --build build -j12 -- install \ + && pushd juggler \ + && echo " - Juggler: ${JUGGLER_VERSION}-$(git rev-parse HEAD)" \ + >> /etc/jug_info \ + && popd \ && rm -rf build juggler ## also install detector/ip geometries into opt @@ -37,12 +48,11 @@ RUN cd /tmp ## build ARG DETECTOR_VERSION="master" ARG IP6_VERSION="master" -ARG ACCELERATOR_VERSION="master" RUN cd /tmp \ && DETECTOR_PREFIX=/opt/detector \ && DETECTOR_DATA=$DETECTOR_PREFIX/share/athena \ && mkdir -p /opt/detector/share/athena \ - && echo "INSTALLING REFERENCE DETECTOR" \ + && echo "INSTALLING ATHENA" \ && git clone -b ${DETECTOR_VERSION} \ https://eicweb.phy.anl.gov/EIC/detectors/athena.git \ && cmake -B build -S athena -DCMAKE_CXX_STANDARD=17 \ @@ -51,6 +61,10 @@ RUN cd /tmp && cp -r athena/compact \ athena/athena.xml \ ${DETECTOR_DATA} \ + && pushd athena \ + && echo " - Athena: ${DETECTOR_VERSION}-$(git rev-parse HEAD)" \ + >> /etc/jug_info \ + && popd \ && rm -rf build athena \ && echo "INSTALLING IP6 GEOMETRY" \ && git clone -b ${IP6_VERSION} \ @@ -60,6 +74,10 @@ RUN cd /tmp && cmake --build build -j12 -- install \ && cp -r ip6/ip6 \ ${DETECTOR_DATA} \ + && pushd ip6 \ + && echo " - IP6: ${IP6_VERSION}-$(git rev-parse HEAD)" \ + >> /etc/jug_info \ + && popd \ && rm -rf build ip6 \ && echo "ADDING SETUP SCRIPT" \ && echo "export LD_LIBRARY_PATH=/opt/detector/lib:\$LD_LIBRARY_PATH" \ diff --git a/install_dev.sh b/download_dev.sh similarity index 77% rename from install_dev.sh rename to download_dev.sh index b110d74d7..1f56c46c7 100755 --- a/install_dev.sh +++ b/download_dev.sh @@ -5,18 +5,23 @@ VERSION="testing" ODIR="$PWD" function print_the_help { - echo "USAGE: ./install_dev.sh [-o DIR] [-v VERSION]" + echo "USAGE: ./download_dev.sh [-o DIR] [-v VERSION]" echo "OPTIONAL ARGUMENTS:" echo " -o,--outdir Directory to download the container to (D: $ODIR)" - echo " -v,--version Version to install (D: $VERSION)" + echo " -c,--container Container to download (D: $CONTAINER)" + echo " -v,--version Version to download (D: $VERSION)" echo " -h,--help Print this message" echo "" echo " Download development container into an output directory" echo "" - echo "EXAMPLE: ./install.sh" + echo "EXAMPLE: ./download_dev.sh" exit } +echo "WARNING: this container download script is meant for expert usage" +echo " if you don't know what this script does, you are probably" +echo " looking for install.sh" + while [ $# -gt 0 ]; do key=$1 case $key in @@ -25,6 +30,11 @@ while [ $# -gt 0 ]; do shift shift ;; + -c|--container) + CONTAINER=$2 + shift + shift + ;; -v|--version) VERSION=$2 shift @@ -72,7 +82,8 @@ wget https://eicweb.phy.anl.gov/containers/eic_container/-/raw/master/install.py chmod +x install.py ./install.py -f -c $CONTAINER -v $VERSION . -SIF=`ls lib/$CONTAINER.sif.* | head -n1` +SIF=lib/$CONTAINER-$VERSION.sif +chmod +x ${SIF} ## That's all if [ -z $SIF -o ! -f $SIF ]; then diff --git a/install.py b/install.py index 1dd1763f3..e5b353fdf 100755 --- a/install.py +++ b/install.py @@ -287,7 +287,7 @@ if __name__ == "__main__": ## Builder SIF is not built anymore, deprecated #if args.builder: #img += "_builder" - container = '{}/{}.sif.{}'.format(libdir, img, version_docker) + container = '{}/{}-{}.sif'.format(libdir, img, version_docker) if not os.path.exists(container) or args.force: url = CONTAINER_URL.format(ref=version_gitlab, img=img, job=build_job) print('Downloading container from:', url) diff --git a/install.sh b/install.sh index 5318d944c..b39a1010a 100755 --- a/install.sh +++ b/install.sh @@ -96,30 +96,34 @@ echo " - Found singularity at $SINGULARITY" SINGULARITY_VERSION=`$SINGULARITY --version` SIF= if [ ${SINGULARITY_VERSION:0:1} = 2 ]; then + SIF="$PREFIX/local/lib/${CONTAINER}-${VERSION}.simg" + echo "WARNING: your singularity version $SINGULARITY_VERSION is ancient, we strongly recommend using version 3.x" echo "We will attempt to use a fall-back SIMG image to be used with this singularity version" if [ -f /gpfs02/eic/athena/${CONTAINER}-${VERSION}.simg ]; then - ln -sf /gpfs02/eic/athena/${CONTAINER}-${VERSION}.simg local/lib - SIF="$PREFIX/local/lib/${CONTAINER}-${VERSION}.simg" + ln -sf /gpfs02/eic/athena/${CONTAINER}-${VERSION}.simg ${SIF} else echo "Attempting last-resort singularity pull for old image" echo "This may take a few minutes..." - SIF="$PREFIX/local/lib/${CONTAINER}-${VERSION}.simg" - singularity pull --name "$SIF" docker://eicweb/$CONTAINER:$VERSION - mv `basename $SIF` $SIF + INSIF=`basename ${SIF}` + singularity pull --name "${INSIF}" docker://eicweb/$CONTAINER:$VERSION + mv ${INSIF} $SIF + chmod +x ${SIF} + unset INSIF fi ## we are in sane territory, yay! else ## check if we can just use cvmfs for the image + SIF="$PREFIX/local/lib/${CONTAINER}-${VERSION}.sif" if [ -d /cvmfs/singularity.opensciencegrid.org/eicweb/${CONTAINER}:${VERSION} ]; then - ln -sf /cvmfs/singularity.opensciencegrid.org/eicweb/${CONTAINER}:${VERSION} local/lib - SIF="$PREFIX/local/lib/${CONTAINER}:${VERSION}" - elif [ -f /gpfs02/cvmfst0/eic.opensciencegrid.org/singularity/athena/${CONTAINER}_${VERSION}.sif ]; then - ln -sf /gpfs02/cvmfst0/eic.opensciencegrid.org/singularity/athena/${CONTAINER}_${VERSION}.sif local/lib - SIF="$PREFIX/local/lib/${CONTAINER}-${VERSION}.sif" + SIF="$PREFIX/local/lib/${CONTAINER}-${VERSION}" + ## need to cleanup in this case, else it will try to make a subdirectory + rm -rf ${SIF} + ln -sf /cvmfs/singularity.opensciencegrid.org/eicweb/${CONTAINER}:${VERSION} ${SIF} + elif [ -f /cvmfs/eic.opensciencegrid.org/singularity/athena/${CONTAINER}_v${VERSION}.sif ]; then + ln -sf /cvmfs/eic.opensciencegrid.org/singularity/athena/${CONTAINER}_v${VERSION}.sif ${SIF} elif [ -f /gpfs02/cvmfst0/eic.opensciencegrid.org/singularity/athena/${CONTAINER}_v${VERSION}.sif ]; then - ln -sf /gpfs02/cvmfst0/eic.opensciencegrid.org/singularity/athena/${CONTAINER}_v${VERSION}.sif local/lib - SIF="$PREFIX/local/lib/${CONTAINER}-v${VERSION}.sif" + ln -sf /gpfs02/cvmfst0/eic.opensciencegrid.org/singularity/athena/${CONTAINER}_v${VERSION}.sif ${SIF} ## if not, download the container to the system else ## get the python installer and run the old-style install @@ -129,17 +133,19 @@ else wget https://eicweb.phy.anl.gov/containers/eic_container/-/raw/master/install.py chmod +x install.py ./install.py -f -c $CONTAINER -v $VERSION . - INSIF=`ls lib/$CONTAINER.sif.* | head -n1` - SIF="$PREFIX/local/lib/${CONTAINER}-${VERSION}.sif" + INSIF=lib/`basename ${SIF}` mv $INSIF $SIF + chmod +x ${SIF} ## cleanup popd rm -rf $tmp_dir + unset INSIF fi fi echo $SIF -if [ -z $SIF ]; then +ls $SIF 2>&1 > /dev/null && GOOD_SIF=1 +if [ -z "$SIF" -o -z "$GOOD_SIF" ]; then echo "ERROR: no singularity image found" exit 1 else -- GitLab