Skip to content

Build, test, and push Docker Images #2689

Build, test, and push Docker Images

Build, test, and push Docker Images #2689

Workflow file for this run

name: Build, test, and push Docker Images
# [FAST_BUILD] in the PR title makes this workflow only build
# the `jupyter/docker-stacks-foundation` and `jupyter/base-notebook` images
# This allows to run CI faster if a full build is not required
# This only works for a `pull_request` event and does not affect `push` to the `main` branch
on:
schedule:
# Weekly, at 03:00 on Monday UTC
- cron: "0 3 * * 1"
pull_request:
paths:
- ".github/workflows/docker.yml"
# We use local reusable workflows to make architecture clean and simple
# https://docs.github.com/en/actions/using-workflows/reusing-workflows
- ".github/workflows/docker-build-test-upload.yml"
- ".github/workflows/docker-merge-tags.yml"
- ".github/workflows/docker-tag-push.yml"
- ".github/workflows/docker-wiki-update.yml"
# We use local composite actions to combine multiple workflow steps within one action
# https://docs.github.com/en/actions/creating-actions/about-custom-actions#composite-actions
- ".github/actions/create-dev-env/action.yml"
- ".github/actions/load-image/action.yml"
- "images/**"
- "!images/*/README.md"
- "tagging/**"
- "!tagging/README.md"
- "tests/**"
- "!tests/README.md"
- "requirements-dev.txt"
push:
branches:
- main
paths:
- ".github/workflows/docker.yml"
- ".github/workflows/docker-build-test-upload.yml"
- ".github/workflows/docker-merge-tags.yml"
- ".github/workflows/docker-tag-push.yml"
- ".github/workflows/docker-wiki-update.yml"
- ".github/actions/create-dev-env/action.yml"
- ".github/actions/load-image/action.yml"
- "images/**"
- "!images/*/README.md"
- "tagging/**"
- "!tagging/README.md"
- "tests/**"
- "!tests/README.md"
- "requirements-dev.txt"
workflow_dispatch:
# https://docs.github.com/en/actions/using-jobs/using-concurrency
concurrency:
# Only cancel in-progress jobs or runs for the current workflow - matches against branch & tags
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
aarch64-foundation:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: ""
image: docker-stacks-foundation
platform: aarch64
runs-on: ARM64_FAST
if: github.repository_owner == 'jupyter'
x86_64-foundation:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: ""
image: docker-stacks-foundation
platform: x86_64
runs-on: ubuntu-latest
aarch64-base:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: docker-stacks-foundation
image: base-notebook
platform: aarch64
runs-on: ARM64_FAST
needs: [aarch64-foundation]
if: github.repository_owner == 'jupyter'
x86_64-base:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: docker-stacks-foundation
image: base-notebook
platform: x86_64
runs-on: ubuntu-latest
needs: [x86_64-foundation]
aarch64-minimal:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: base-notebook
image: minimal-notebook
platform: aarch64
runs-on: ARM64_FAST
needs: [aarch64-base]
if: github.repository_owner == 'jupyter' && !contains(github.event.pull_request.title, '[FAST_BUILD]')
x86_64-minimal:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: base-notebook
image: minimal-notebook
platform: x86_64
runs-on: ubuntu-latest
needs: [x86_64-base]
if: ${{ !contains(github.event.pull_request.title, '[FAST_BUILD]') }}
aarch64-scipy:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: minimal-notebook
image: scipy-notebook
platform: aarch64
runs-on: ARM64_FAST
needs: [aarch64-minimal]
if: github.repository_owner == 'jupyter' && !contains(github.event.pull_request.title, '[FAST_BUILD]')
x86_64-scipy:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: minimal-notebook
image: scipy-notebook
platform: x86_64
runs-on: ubuntu-latest
needs: [x86_64-minimal]
if: ${{ !contains(github.event.pull_request.title, '[FAST_BUILD]') }}
aarch64-r:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: minimal-notebook
image: r-notebook
platform: aarch64
runs-on: ARM64_SLOW
needs: [aarch64-minimal]
if: github.repository_owner == 'jupyter' && !contains(github.event.pull_request.title, '[FAST_BUILD]')
x86_64-r:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: minimal-notebook
image: r-notebook
platform: x86_64
runs-on: ubuntu-latest
needs: [x86_64-minimal]
if: ${{ !contains(github.event.pull_request.title, '[FAST_BUILD]') }}
aarch64-julia:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: minimal-notebook
image: julia-notebook
platform: aarch64
runs-on: ARM64_SLOW
needs: [aarch64-minimal]
if: github.repository_owner == 'jupyter' && !contains(github.event.pull_request.title, '[FAST_BUILD]')
x86_64-julia:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: minimal-notebook
image: julia-notebook
platform: x86_64
runs-on: ubuntu-latest
needs: [x86_64-minimal]
if: ${{ !contains(github.event.pull_request.title, '[FAST_BUILD]') }}
aarch64-tensorflow:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: scipy-notebook
image: tensorflow-notebook
platform: aarch64
runs-on: ARM64_SLOW
needs: [aarch64-scipy]
if: github.repository_owner == 'jupyter' && !contains(github.event.pull_request.title, '[FAST_BUILD]')
x86_64-tensorflow:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: scipy-notebook
image: tensorflow-notebook
platform: x86_64
runs-on: ubuntu-latest
needs: [x86_64-scipy]
if: ${{ !contains(github.event.pull_request.title, '[FAST_BUILD]') }}
x86_64-tensorflow-cuda:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: scipy-notebook
image: tensorflow-notebook
variant: cuda
platform: x86_64
runs-on: ubuntu-latest
needs: [x86_64-scipy]
if: ${{ !contains(github.event.pull_request.title, '[FAST_BUILD]') }}
aarch64-pytorch:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: scipy-notebook
image: pytorch-notebook
platform: aarch64
runs-on: ARM64_SLOW
needs: [aarch64-scipy]
if: github.repository_owner == 'jupyter' && !contains(github.event.pull_request.title, '[FAST_BUILD]')
x86_64-pytorch:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: scipy-notebook
image: pytorch-notebook
platform: x86_64
runs-on: ubuntu-latest
needs: [x86_64-scipy]
if: ${{ !contains(github.event.pull_request.title, '[FAST_BUILD]') }}
x86_64-pytorch-cuda11:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: scipy-notebook
image: pytorch-notebook
variant: cuda11
platform: x86_64
runs-on: ubuntu-latest
needs: [x86_64-scipy]
if: ${{ !contains(github.event.pull_request.title, '[FAST_BUILD]') }}
x86_64-pytorch-cuda12:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: scipy-notebook
image: pytorch-notebook
variant: cuda12
platform: x86_64
runs-on: ubuntu-latest
needs: [x86_64-scipy]
if: ${{ !contains(github.event.pull_request.title, '[FAST_BUILD]') }}
aarch64-datascience:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: scipy-notebook
image: datascience-notebook
platform: aarch64
runs-on: ARM64_SLOW
needs: [aarch64-scipy]
if: github.repository_owner == 'jupyter' && !contains(github.event.pull_request.title, '[FAST_BUILD]')
x86_64-datascience:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: scipy-notebook
image: datascience-notebook
platform: x86_64
runs-on: ubuntu-latest
needs: [x86_64-scipy]
if: ${{ !contains(github.event.pull_request.title, '[FAST_BUILD]') }}
aarch64-pyspark:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: scipy-notebook
image: pyspark-notebook
platform: aarch64
runs-on: ARM64_FAST
needs: [aarch64-scipy]
if: github.repository_owner == 'jupyter' && !contains(github.event.pull_request.title, '[FAST_BUILD]')
x86_64-pyspark:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: scipy-notebook
image: pyspark-notebook
platform: x86_64
runs-on: ubuntu-latest
needs: [x86_64-scipy]
if: ${{ !contains(github.event.pull_request.title, '[FAST_BUILD]') }}
aarch64-all-spark:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: pyspark-notebook
image: all-spark-notebook
platform: aarch64
runs-on: ARM64_FAST
needs: [aarch64-pyspark]
if: github.repository_owner == 'jupyter' && !contains(github.event.pull_request.title, '[FAST_BUILD]')
x86_64-all-spark:
uses: ./.github/workflows/docker-build-test-upload.yml
with:
parent-image: pyspark-notebook
image: all-spark-notebook
platform: x86_64
runs-on: ubuntu-latest
needs: [x86_64-pyspark]
if: ${{ !contains(github.event.pull_request.title, '[FAST_BUILD]') }}
aarch64-images-tag-push:
uses: ./.github/workflows/docker-tag-push.yml
with:
platform: aarch64
image: ${{ matrix.image-variant.image }}
variant: ${{ matrix.image-variant.variant }}
secrets:
REGISTRY_USERNAME: ${{ secrets.QUAY_USERNAME }}
REGISTRY_TOKEN: ${{ secrets.QUAY_ROBOT_TOKEN }}
strategy:
matrix:
image-variant:
[
{ image: docker-stacks-foundation, variant: default },
{ image: base-notebook, variant: default },
{ image: minimal-notebook, variant: default },
{ image: scipy-notebook, variant: default },
{ image: r-notebook, variant: default },
{ image: julia-notebook, variant: default },
{ image: tensorflow-notebook, variant: default },
{ image: pytorch-notebook, variant: default },
{ image: datascience-notebook, variant: default },
{ image: pyspark-notebook, variant: default },
{ image: all-spark-notebook, variant: default },
]
needs:
[
aarch64-foundation,
aarch64-base,
aarch64-minimal,
aarch64-scipy,
aarch64-r,
aarch64-julia,
aarch64-tensorflow,
aarch64-pytorch,
aarch64-datascience,
aarch64-pyspark,
aarch64-all-spark,
]
if: github.repository_owner == 'jupyter' && !contains(github.event.pull_request.title, '[FAST_BUILD]')
aarch64-images-tag-push-fast:
uses: ./.github/workflows/docker-tag-push.yml
with:
platform: aarch64
image: ${{ matrix.image-variant.image }}
variant: ${{ matrix.image-variant.variant }}
secrets:
REGISTRY_USERNAME: ${{ secrets.QUAY_USERNAME }}
REGISTRY_TOKEN: ${{ secrets.QUAY_ROBOT_TOKEN }}
strategy:
matrix:
image-variant:
[
{ image: docker-stacks-foundation, variant: default },
{ image: base-notebook, variant: default },
]
needs: [aarch64-foundation, aarch64-base]
if: github.repository_owner == 'jupyter' && contains(github.event.pull_request.title, '[FAST_BUILD]')
x86_64-images-tag-push:
uses: ./.github/workflows/docker-tag-push.yml
with:
platform: x86_64
image: ${{ matrix.image-variant.image }}
variant: ${{ matrix.image-variant.variant }}
secrets:
REGISTRY_USERNAME: ${{ secrets.QUAY_USERNAME }}
REGISTRY_TOKEN: ${{ secrets.QUAY_ROBOT_TOKEN }}
strategy:
matrix:
image-variant:
[
{ image: docker-stacks-foundation, variant: default },
{ image: base-notebook, variant: default },
{ image: minimal-notebook, variant: default },
{ image: scipy-notebook, variant: default },
{ image: r-notebook, variant: default },
{ image: julia-notebook, variant: default },
{ image: tensorflow-notebook, variant: default },
{ image: tensorflow-notebook, variant: cuda },
{ image: pytorch-notebook, variant: default },
{ image: pytorch-notebook, variant: cuda11 },
{ image: pytorch-notebook, variant: cuda12 },
{ image: datascience-notebook, variant: default },
{ image: pyspark-notebook, variant: default },
{ image: all-spark-notebook, variant: default },
]
needs:
[
x86_64-foundation,
x86_64-base,
x86_64-minimal,
x86_64-scipy,
x86_64-r,
x86_64-julia,
x86_64-tensorflow,
x86_64-pytorch,
x86_64-datascience,
x86_64-pyspark,
x86_64-all-spark,
]
if: ${{ !contains(github.event.pull_request.title, '[FAST_BUILD]') }}
x86_64-images-tag-push-fast:
uses: ./.github/workflows/docker-tag-push.yml
with:
platform: x86_64
image: ${{ matrix.image-variant.image }}
variant: ${{ matrix.image-variant.variant }}
secrets:
REGISTRY_USERNAME: ${{ secrets.QUAY_USERNAME }}
REGISTRY_TOKEN: ${{ secrets.QUAY_ROBOT_TOKEN }}
strategy:
matrix:
image-variant:
[
{ image: docker-stacks-foundation, variant: default },
{ image: base-notebook, variant: default },
]
needs: [x86_64-foundation, x86_64-base]
if: contains(github.event.pull_request.title, '[FAST_BUILD]')
merge-tags:
uses: ./.github/workflows/docker-merge-tags.yml
with:
image: ${{ matrix.image-variant.image }}
variant: ${{ matrix.image-variant.variant }}
secrets:
REGISTRY_USERNAME: ${{ secrets.QUAY_USERNAME }}
REGISTRY_TOKEN: ${{ secrets.QUAY_ROBOT_TOKEN }}
strategy:
matrix:
image-variant:
[
{ image: docker-stacks-foundation, variant: default },
{ image: base-notebook, variant: default },
{ image: minimal-notebook, variant: default },
{ image: scipy-notebook, variant: default },
{ image: r-notebook, variant: default },
{ image: julia-notebook, variant: default },
{ image: tensorflow-notebook, variant: default },
{ image: tensorflow-notebook, variant: cuda },
{ image: pytorch-notebook, variant: default },
{ image: pytorch-notebook, variant: cuda11 },
{ image: pytorch-notebook, variant: cuda12 },
{ image: datascience-notebook, variant: default },
{ image: pyspark-notebook, variant: default },
{ image: all-spark-notebook, variant: default },
]
needs: [aarch64-images-tag-push, x86_64-images-tag-push]
if: |
always() &&
needs.x86_64-images-tag-push.result == 'success' &&
(needs.aarch64-images-tag-push.result == 'success' || needs.aarch64-images-tag-push.result == 'skipped') &&
!contains(github.event.pull_request.title, '[FAST_BUILD]')
merge-tags-fast:
uses: ./.github/workflows/docker-merge-tags.yml
with:
image: ${{ matrix.image-variant.image }}
variant: ${{ matrix.image-variant.variant }}
secrets:
REGISTRY_USERNAME: ${{ secrets.QUAY_USERNAME }}
REGISTRY_TOKEN: ${{ secrets.QUAY_ROBOT_TOKEN }}
strategy:
matrix:
image-variant:
[
{ image: docker-stacks-foundation, variant: default },
{ image: base-notebook, variant: default },
]
needs: [aarch64-images-tag-push-fast, x86_64-images-tag-push-fast]
if: |
always() &&
needs.x86_64-images-tag-push-fast.result == 'success' &&
(needs.aarch64-images-tag-push-fast.result == 'success' || needs.aarch64-images-tag-push-fast.result == 'skipped') &&
contains(github.event.pull_request.title, '[FAST_BUILD]')
wiki-update:
uses: ./.github/workflows/docker-wiki-update.yml
needs: [aarch64-images-tag-push, x86_64-images-tag-push]
if: github.repository_owner == 'jupyter' && !contains(github.event.pull_request.title, '[FAST_BUILD]')
permissions:
contents: write
wiki-update-fast:
uses: ./.github/workflows/docker-wiki-update.yml
needs: [aarch64-images-tag-push-fast, x86_64-images-tag-push-fast]
if: github.repository_owner == 'jupyter' && contains(github.event.pull_request.title, '[FAST_BUILD]')
permissions:
contents: write
contributed-recipes:
uses: ./.github/workflows/contributed-recipes.yml
needs: [merge-tags]
if: github.repository_owner == 'jupyter' && (github.ref == 'refs/heads/main' || github.event_name == 'schedule')