Build, test, and push Docker Images #2601
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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') |