diff --git a/.github/workflows/build-push.yml b/.github/workflows/build-push.yml
new file mode 100644
index 0000000000000000000000000000000000000000..954ba5dd1e6409cf235d0e9cd5278bbe84231464
--- /dev/null
+++ b/.github/workflows/build-push.yml
@@ -0,0 +1,289 @@
+name: build-push
+
+on:
+ schedule:
+ - cron: "30 */6 * * *"
+ push:
+ branches:
+ - master
+ pull_request:
+ branches:
+ - master
+ workflow_dispatch:
+ inputs:
+ EDM4EIC_VERSION:
+ required: false
+ default: ''
+ type: string
+ EICRECON_VERSION:
+ required: false
+ default: ''
+ type: string
+ JUGGLER_VERSION:
+ required: false
+ default: ''
+ type: string
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
+ cancel-in-progress: false
+
+env:
+ ## Default versions are specified in packages.yaml but can be overridden
+ ## note: nightly builds will always use the master/main branch
+ EDM4EIC_VERSION: ${{ inputs.EDM4EIC_VERSION }}
+ EICRECON_VERSION: ${{ inputs.EICRECON_VERSION }}
+ JUGGLER_VERSION: ${{ inputs.JUGGLER_VERSION }}
+
+ ## Dockerhub registry
+ DH_REGISTRY: docker.io
+ DH_REGISTRY_USER: eicweb
+ DH_PUSH: 0
+ ## GitHub registry
+ GH_REGISTRY: ghcr.io
+ GH_REGISTRY_USER: eic
+ GH_PUSH: 1
+
+ ## Number of jobs to start during container builds
+ JOBS: 4
+
+ ## Internal tag used for the CI
+ INTERNAL_TAG: pipeline-${{ github.run_id }}
+
+jobs:
+ base:
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ include:
+ - BASE_IMAGE: debian:stable-slim
+ BUILD_IMAGE: debian_stable_base
+ PLATFORM: linux/amd64
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v3
+ with:
+ platforms: linux/amd64,linux/arm64
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+ - name: Docker meta
+ id: meta
+ uses: docker/metadata-action@v5
+ with:
+ images: |
+ name=${{ env.DH_REGISTRY }}/${{ env.DH_REGISTRY_USER }}/${{ matrix.BUILD_IMAGE }},enable=${{ env.DH_PUSH != 0 }}
+ name=${{ env.GH_REGISTRY }}/${{ env.GH_REGISTRY_USER }}/${{ matrix.BUILD_IMAGE }},enable=${{ env.GH_PUSH != 0 }}
+ tags: |
+ ${{ env.INTERNAL_TAG }}
+ type=schedule
+ type=ref,prefix=unstable-pr-,event=pr
+ - name: Login to Docker Hub
+ uses: docker/login-action@v3
+ if: ${{ env.DH_PUSH == '1' }}
+ with:
+ registry: ${{ env.DH_REGISTRY }}
+ username: ${{ env.DH_REGISTRY_USER }}
+ password: ${{ secrets.DH_EICWEB_TOKEN }}
+ - name: Login to GitHub Container Registry
+ uses: docker/login-action@v3
+ if: ${{ env.GH_PUSH == '1' }}
+ with:
+ registry: ${{ env.GH_REGISTRY }}
+ username: ${{ secrets.GHCR_REGISTRY_USER }}
+ password: ${{ secrets.GHCR_REGISTRY_TOKEN }}
+ - name: Build and push
+ uses: docker/build-push-action@v5
+ with:
+ file: containers/debian/base.Dockerfile
+ context: containers/debian
+ platforms: ${{ matrix.PLATFORM }}
+ push: true
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+ build-args: |
+ BASE_IMAGE=${{ matrix.BASE_IMAGE }}
+ BUILD_IMAGE=${{ matrix.BUILD_IMAGE }}
+ cache-from: type=gha,scope=${{ github.workflow }}
+ cache-to: type=gha,mode=max,scope=${{ github.workflow }}
+
+ dev:
+ runs-on: ubuntu-latest
+ needs: base
+ strategy:
+ matrix:
+ include:
+ - BASE_IMAGE: debian_stable_base
+ BUILD_IMAGE: dev
+ PLATFORM: linux/amd64
+ ENV: dev
+ steps:
+ - name: Free Disk Space (Ubuntu)
+ uses: jlumbroso/free-disk-space@v1.3.1
+ with:
+ android: true
+ dotnet: true
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Load spack version and cherry-picks
+ id: spack
+ shell: bash
+ run: |
+ source spack.sh
+ echo "orgrepo=${SPACK_ORGREPO}" | tee -a $GITHUB_OUTPUT
+ echo "version=${SPACK_VERSION}" | tee -a $GITHUB_OUTPUT
+ echo "cherrypicks=${SPACK_CHERRYPICKS//$'\n'/ }" | tee -a $GITHUB_OUTPUT
+ echo "cherrypicks_files=${SPACK_CHERRYPICKS_FILES//$'\n'/ }" | tee -a $GITHUB_OUTPUT
+ - name: Load eic-spack version and cherry-picks
+ id: eic-spack
+ run: |
+ source eic-spack.sh
+ echo "orgrepo=${EICSPACK_ORGREPO}" | tee -a $GITHUB_OUTPUT
+ echo "version=${EICSPACK_VERSION}" | tee -a $GITHUB_OUTPUT
+ echo "cherrypicks=${EICSPACK_CHERRYPICKS//$'\n'/ }" | tee -a $GITHUB_OUTPUT
+ - name: Load secrets into mirrors.yaml
+ id: mirrors
+ run: |
+ source spack.sh
+ export SPACK_VERSION
+ export CI_REGISTRY=ghcr.io
+ export CI_PROJECT_PATH=eic
+ export CI_REGISTRY_USER=${{ secrets.GHCR_REGISTRY_USER }}
+ export CI_REGISTRY_PASSWORD=${{ secrets.GHCR_REGISTRY_TOKEN }}
+ export GITHUB_REGISTRY_USER=${{ secrets.GHCR_REGISTRY_USER }}
+ export GITHUB_REGISTRY_TOKEN=${{ secrets.GHCR_REGISTRY_TOKEN }}
+ export S3RW_ACCESS_KEY=${{ secrets.S3RW_ACCESS_KEY }}
+ export S3RW_SECRET_KEY=${{ secrets.S3RW_SECRET_KEY }}
+ cat mirrors.yaml.in | envsubst > mirrors.yaml
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v3
+ with:
+ platforms: linux/amd64
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+ - name: Docker meta
+ id: meta
+ uses: docker/metadata-action@v5
+ with:
+ images: |
+ name=${{ env.DH_REGISTRY }}/${{ env.DH_REGISTRY_USER }}/eic_${{ matrix.BUILD_IMAGE }},enable=${{ env.DH_PUSH != 0 }}
+ name=${{ env.GH_REGISTRY }}/${{ env.GH_REGISTRY_USER }}/eic_${{ matrix.BUILD_IMAGE }},enable=${{ env.GH_PUSH != 0 }}
+ tags: |
+ ${{ env.INTERNAL_TAG }}
+ type=schedule,pattern={{date 'YYYY-MM-DD'}}
+ type=ref,prefix=unstable-pr-,event=pr
+ type=match,pattern=^v(\d+\.\d+\.\d+-.*)$,group=1
+ - name: Login to Docker Hub
+ uses: docker/login-action@v3
+ if: ${{ env.DH_PUSH == '1' }}
+ with:
+ registry: ${{ env.DH_REGISTRY }}
+ username: ${{ env.DH_REGISTRY_USER }}
+ password: ${{ secrets.DH_EICWEB_TOKEN }}
+ - name: Login to GitHub Container Registry
+ uses: docker/login-action@v3
+ if: ${{ env.GH_PUSH == '1' }}
+ with:
+ registry: ${{ env.GH_REGISTRY }}
+ username: ${{ secrets.GHCR_REGISTRY_USER }}
+ password: ${{ secrets.GHCR_REGISTRY_TOKEN }}
+ - name: Build and push
+ uses: docker/build-push-action@v5
+ with:
+ file: containers/jug/dev.Dockerfile
+ context: containers/jug
+ build-contexts: |
+ spack-environment=spack-environment
+ secret-files: |
+ mirrors=mirrors.yaml
+ platforms: ${{ matrix.PLATFORM }}
+ push: true
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+ build-args: |
+ DOCKER_REGISTRY=${{ env.GH_REGISTRY }}/${{ env.GH_REGISTRY_USER }}/
+ BASE_IMAGE=${{ matrix.BASE_IMAGE }}
+ BUILD_IMAGE=eic_${{ matrix.BUILD_IMAGE }}
+ INTERNAL_TAG=${{ env.INTERNAL_TAG }}
+ SPACK_ORGREPO=${{ steps.spack.outputs.orgrepo }}
+ SPACK_VERSION=${{ steps.spack.outputs.version }}
+ SPACK_CHERRYPICKS=${{ steps.spack.outputs.cherrypicks }}
+ SPACK_CHERRYPICKS_FILES=${{ steps.spack.outputs.cherrypicks_files }}
+ EICSPACK_ORGREPO=${{ steps.eic-spack.outputs.orgrepo }}
+ EICSPACK_VERSION=${{ steps.eic-spack.outputs.version }}
+ EICSPACK_CHERRYPICKS=${{ steps.eic-spack.outputs.cherrypicks }}
+ S3_ACCESS_KEY=${{ secrets.S3_ACCESS_KEY }}
+ S3_SECRET_KEY=${{ secrets.S3_SECRET_KEY }}
+ jobs=${{ env.JOBS }}
+ cache-from: type=gha,scope=${{ github.workflow }}
+ cache-to: type=gha,mode=max,scope=${{ github.workflow }}
+
+ xl:
+ runs-on: ubuntu-latest
+ needs: dev
+ strategy:
+ matrix:
+ include:
+ - BASE_IMAGE: dev
+ BUILD_IMAGE: xl
+ PLATFORM: linux/amd64
+ steps:
+ - name: Free Disk Space (Ubuntu)
+ uses: jlumbroso/free-disk-space@v1.3.1
+ with:
+ android: true
+ dotnet: true
+ - name: Checkout
+ uses: actions/checkout@v4
+ - name: Set up QEMU
+ uses: docker/setup-qemu-action@v3
+ with:
+ platforms: linux/amd64
+ - name: Set up Docker Buildx
+ uses: docker/setup-buildx-action@v3
+ - name: Docker meta
+ id: meta
+ uses: docker/metadata-action@v5
+ with:
+ images: |
+ name=${{ env.DH_REGISTRY }}/${{ env.DH_REGISTRY_USER }}/eic_${{ matrix.BUILD_IMAGE }},enable=${{ env.DH_PUSH != 0 }}
+ name=${{ env.GH_REGISTRY }}/${{ env.GH_REGISTRY_USER }}/eic_${{ matrix.BUILD_IMAGE }},enable=${{ env.GH_PUSH != 0 }}
+ tags: |
+ ${{ env.INTERNAL_TAG }}
+ type=schedule,pattern={{date 'YYYY-MM-DD'}}
+ type=ref,prefix=unstable-pr-,event=pr
+ type=match,pattern=^v(\d+\.\d+\.\d+-.*)$,group=1
+ - name: Login to Docker Hub
+ uses: docker/login-action@v3
+ if: ${{ env.DH_PUSH == '1' }}
+ with:
+ registry: ${{ env.DH_REGISTRY }}
+ username: ${{ env.DH_REGISTRY_USER }}
+ password: ${{ secrets.DH_EICWEB_TOKEN }}
+ - name: Login to GitHub Container Registry
+ uses: docker/login-action@v3
+ if: ${{ env.GH_PUSH == '1' }}
+ with:
+ registry: ${{ env.GH_REGISTRY }}
+ username: ${{ secrets.GHCR_REGISTRY_USER }}
+ password: ${{ secrets.GHCR_REGISTRY_TOKEN }}
+ - name: Build and push
+ uses: docker/build-push-action@v5
+ with:
+ file: containers/jug/xl.Dockerfile
+ context: containers/jug
+ build-contexts: |
+ detectors=.
+ platforms: ${{ matrix.PLATFORM }}
+ push: true
+ tags: ${{ steps.meta.outputs.tags }}
+ labels: ${{ steps.meta.outputs.labels }}
+ build-args: |
+ DOCKER_REGISTRY=${{ env.GH_REGISTRY }}/${{ env.GH_REGISTRY_USER }}/
+ BASE_IMAGE=eic_${{ matrix.BASE_IMAGE }}
+ BUILD_IMAGE=eic_${{ matrix.BUILD_IMAGE }}
+ INTERNAL_TAG=${{ env.INTERNAL_TAG }}
+ jobs=${{ env.JOBS }}
+ cache-from: type=gha,scope=${{ github.workflow }}
+ cache-to: type=gha,mode=max,scope=${{ github.workflow }}
diff --git a/containers/jug/dev.Dockerfile b/containers/jug/dev.Dockerfile
index 5ec5f4b9aa82050db6e9e424c7d8dda20e49829e..64bf2b1047e19964d202ec8b36fefc6488703518 100644
--- a/containers/jug/dev.Dockerfile
+++ b/containers/jug/dev.Dockerfile
@@ -43,7 +43,7 @@ git config --global advice.detachedHead false
git clone --filter=tree:0 https://github.com/${SPACK_ORGREPO}.git ${SPACK_ROOT}
git -C ${SPACK_ROOT} checkout ${SPACK_VERSION}
if [ -n "${SPACK_CHERRYPICKS}" ] ; then
- SPACK_CHERRYPICKS=$(git -C ${SPACK_ROOT} rev-list --topo-order ${SPACK_CHERRYPICKS} | grep -m $(echo ${SPACK_CHERRYPICKS} | wc -w) "${SPACK_CHERRYPICKS}" | tac)
+ SPACK_CHERRYPICKS=$(git -C ${SPACK_ROOT} rev-list --topo-order ${SPACK_CHERRYPICKS} | grep -m $(echo ${SPACK_CHERRYPICKS} | wc -w) -e ${SPACK_CHERRYPICKS// / -e } | tac)
eval "declare -A SPACK_CHERRYPICKS_FILES_ARRAY=(${SPACK_CHERRYPICKS_FILES})"
for hash in ${SPACK_CHERRYPICKS} ; do
if [ -n "${SPACK_CHERRYPICKS_FILES_ARRAY[${hash}]+found}" ] ; then