From 70fdc702ed3aa08f586c80281ff9fa34ccad2ed5 Mon Sep 17 00:00:00 2001 From: Sebastian Larsen Prehn Date: Fri, 12 Jan 2024 16:39:44 +0100 Subject: [PATCH 01/19] Added new Julia datascience notebook with some standard datascience-related packages --- julia-datascience-notebook/Dockerfile.j2 | 19 +++++++ julia-datascience-notebook/packages.jl | 10 ++++ .../tests/requirements.txt | 3 ++ julia-datascience-notebook/tests/test.sh | 2 + .../tests/test_notebook.py | 51 +++++++++++++++++++ 5 files changed, 85 insertions(+) create mode 100644 julia-datascience-notebook/Dockerfile.j2 create mode 100644 julia-datascience-notebook/packages.jl create mode 100644 julia-datascience-notebook/tests/requirements.txt create mode 100644 julia-datascience-notebook/tests/test.sh create mode 100644 julia-datascience-notebook/tests/test_notebook.py diff --git a/julia-datascience-notebook/Dockerfile.j2 b/julia-datascience-notebook/Dockerfile.j2 new file mode 100644 index 0000000..70a647f --- /dev/null +++ b/julia-datascience-notebook/Dockerfile.j2 @@ -0,0 +1,19 @@ +FROM {{ parent }} +LABEL MAINTAINER="Sebastian Larsen Prehn " +ARG PACKAGE_TIMEOUT=60 + +USER root + +# Setup default timeout of installing packages +RUN echo "[global]" > /etc/pip.conf \ + && echo "timeout=${PACKAGE_TIMEOUT}" >> /etc/pip.conf + +WORKDIR /tmp/ + +COPY packages.jl /tmp/ +RUN julia packages.jl + +WORKDIR "${HOME}" + +# Ensure that container Runs as +USER $NB_UID diff --git a/julia-datascience-notebook/packages.jl b/julia-datascience-notebook/packages.jl new file mode 100644 index 0000000..293640f --- /dev/null +++ b/julia-datascience-notebook/packages.jl @@ -0,0 +1,10 @@ +using Pkg + +dependencies = [ + "Surrogates", + "ReservoirComputing", + "SymbolicRegression", + "MLJ" +] + +Pkg.add(dependencies) \ No newline at end of file diff --git a/julia-datascience-notebook/tests/requirements.txt b/julia-datascience-notebook/tests/requirements.txt new file mode 100644 index 0000000..07a0dc3 --- /dev/null +++ b/julia-datascience-notebook/tests/requirements.txt @@ -0,0 +1,3 @@ +pytest==7.1.2 +pytest-xdist==2.2.1 +nbformat==5.4.0 diff --git a/julia-datascience-notebook/tests/test.sh b/julia-datascience-notebook/tests/test.sh new file mode 100644 index 0000000..9f93c74 --- /dev/null +++ b/julia-datascience-notebook/tests/test.sh @@ -0,0 +1,2 @@ +#!/bin/bash +pytest -n 4 --durations=0 diff --git a/julia-datascience-notebook/tests/test_notebook.py b/julia-datascience-notebook/tests/test_notebook.py new file mode 100644 index 0000000..0c7911a --- /dev/null +++ b/julia-datascience-notebook/tests/test_notebook.py @@ -0,0 +1,51 @@ +import os +import subprocess +import tempfile +import nbformat + +cur_path = os.path.abspath(".") +notebooks_path = os.path.join(cur_path, "notebooks") +kernels = ["julia-1.9"] + + +def _notebook_run(path, kernel="julia-1.9", timeout=300): + """Execute a notebook via nbconvert and collect output. + :returns (parsed nb object, execution errors) + """ + dirname, __ = os.path.split(path) + os.chdir(dirname) + with tempfile.NamedTemporaryFile(suffix=".ipynb") as fout: + args = [ + "jupyter", + "nbconvert", + "--to", + "notebook", + "--execute", + "--ExecutePreprocessor.timeout={}".format(timeout), + "--ExecutePreprocessor.kernel_name={}".format(kernel), + "--output", + fout.name, + path, + ] + subprocess.check_call(args) + + fout.seek(0) + nb = nbformat.read(fout, nbformat.current_nbformat) + + errors = [ + output + for cell in nb.cells + if "outputs" in cell + for output in cell["outputs"] + if output.output_type == "error" + ] + return nb, errors + + +def test_notebooks(): + for f_notebook in os.listdir(notebooks_path): + for kernel in kernels: + _, errors = _notebook_run( + os.path.join(notebooks_path, f_notebook), kernel=kernel + ) + assert errors == [] From 90a3293143fb47e2ac7fb2a6f31dfc2a7843c963 Mon Sep 17 00:00:00 2001 From: Sebastian Larsen Prehn Date: Fri, 12 Jan 2024 16:48:38 +0100 Subject: [PATCH 02/19] Modified architecture.yml file to include the new datascience notebook --- architecture.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/architecture.yml b/architecture.yml index 305aab6..7117e17 100644 --- a/architecture.yml +++ b/architecture.yml @@ -175,3 +175,10 @@ architecture: JULIA_MAJOR_VERSION: 1.9 JULIA_MINOR_VERSION: 4 JULIA_DOWNLOAD_MD5: 3503c6bc79c48b4e13178155ebe9cae5 + julia-datascience-notebook: + dev: + parent: + owner: ucphhpc + image: julia-notebook + tag: dev + pipeline_dependent: true From e7a49b7fdd46f3f8432c08bc806f2cfe857bbe9f Mon Sep 17 00:00:00 2001 From: Sebastian Larsen Prehn Date: Wed, 24 Jan 2024 12:23:07 +0100 Subject: [PATCH 03/19] Update kernel for Julia 1.10 pre-optimization --- julia-datascience-notebook/tests/test_notebook.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/julia-datascience-notebook/tests/test_notebook.py b/julia-datascience-notebook/tests/test_notebook.py index 0c7911a..24daf6b 100644 --- a/julia-datascience-notebook/tests/test_notebook.py +++ b/julia-datascience-notebook/tests/test_notebook.py @@ -5,10 +5,11 @@ cur_path = os.path.abspath(".") notebooks_path = os.path.join(cur_path, "notebooks") -kernels = ["julia-1.9"] +julia_kernel = "julia-1.10" +kernels = [julia_kernel] -def _notebook_run(path, kernel="julia-1.9", timeout=300): +def _notebook_run(path, kernel=julia_kernel, timeout=300): """Execute a notebook via nbconvert and collect output. :returns (parsed nb object, execution errors) """ From 0bf954abd23a44b42c4b63b97f7a8283e636d086 Mon Sep 17 00:00:00 2001 From: Sebastian Larsen Prehn Date: Fri, 26 Jan 2024 13:56:42 +0100 Subject: [PATCH 04/19] Test for Surrogates package added --- .../tests/notebooks/surrogates.ipynb | 86 +++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 julia-datascience-notebook/tests/notebooks/surrogates.ipynb diff --git a/julia-datascience-notebook/tests/notebooks/surrogates.ipynb b/julia-datascience-notebook/tests/notebooks/surrogates.ipynb new file mode 100644 index 0000000..cdf9d6d --- /dev/null +++ b/julia-datascience-notebook/tests/notebooks/surrogates.ipynb @@ -0,0 +1,86 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "972ead84-63f9-411f-9052-e6ec42a54c5d", + "metadata": {}, + "outputs": [], + "source": [ + "using Test" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "1bafe864-1373-4377-a20b-f65f8b789ce4", + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax (1176252391.py, line 1)", + "output_type": "error", + "traceback": [ + "\u001b[0;36m Cell \u001b[0;32mIn[2], line 1\u001b[0;36m\u001b[0m\n\u001b[0;31m using Surrogates\u001b[0m\n\u001b[0m ^\u001b[0m\n\u001b[0;31mSyntaxError\u001b[0m\u001b[0;31m:\u001b[0m invalid syntax\n" + ] + } + ], + "source": [ + "# taken from quick example: https://docs.sciml.ai/Surrogates/stable/\n", + "using Surrogates\n", + "num_samples = 10\n", + "lb = 0.0\n", + "ub = 10.0\n", + "\n", + "#Sampling\n", + "x = sample(num_samples,lb,ub,SobolSample())\n", + "f = x-> log(x)*x^2+x^3\n", + "y = f.(x)\n", + "\n", + "#Creating surrogate\n", + "alpha = 2.0\n", + "n = 6\n", + "my_lobachevsky = LobachevskySurrogate(x,y,lb,ub,alpha=alpha,n=n)\n", + "\n", + "#Approximating value at 5.0\n", + "value = my_lobachevsky(5.0)\n", + "\n", + "#Adding more data points\n", + "surrogate_optimize(f,SRBF(),lb,ub,my_lobachevsky,RandomSample())\n", + "\n", + "#New approximation\n", + "value = my_lobachevsky(5.0)\n", + "@test value == 135.03849067814392" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5b34ce7e-b805-4d28-bdae-1775359447c5", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From 2defe652a9af4e804c5e57fb1bf6216fd1944697 Mon Sep 17 00:00:00 2001 From: Rasmus Munk Date: Thu, 8 Feb 2024 16:30:35 +0100 Subject: [PATCH 05/19] Add the jupyterlab version tag to the images --- 1.gocd.yml | 322 +++++++++++++++++++++++------------------------ Makefile | 4 +- architecture.yml | 90 ++++++------- 3 files changed, 208 insertions(+), 208 deletions(-) diff --git a/1.gocd.yml b/1.gocd.yml index 01b6169..d2424d2 100644 --- a/1.gocd.yml +++ b/1.gocd.yml @@ -1,35 +1,35 @@ environments: - notebook_image_dev: + notebook_image_master: environment_variables: DOCKERHUB_PASSWORD: '{{SECRET:[dockerhub][password]}}' DOCKERHUB_USERNAME: '{{SECRET:[dockerhub][username]}}' pipelines: - - base-notebook-dev - - python-notebook-dev - - statistics-notebook-dev - - r-notebook-dev - - slurm-notebook-dev - - python-cuda-notebook-dev - - gpu-notebook-dev - - datascience-notebook-dev - - chemistry-notebook-dev - - fenics-notebook-dev - - qsharp-notebook-dev - - hpc-notebook-dev - - hpc-ocean-notebook-dev - - hpc-gpu-notebook-dev - - ocean-notebook-dev - - geo-notebook-dev - - bio-notebook-dev - - bio-bigdata-notebook-dev - - bio-bsa-notebook-dev - - sme-notebook-dev - - jwst-notebook-dev - - julia-notebook-dev - - cern-notebook-dev + - base-notebook-latest + - python-notebook-latest + - statistics-notebook-latest + - r-notebook-latest + - slurm-notebook-latest + - python-cuda-notebook-latest + - gpu-notebook-latest + - datascience-notebook-latest + - chemistry-notebook-latest + - fenics-notebook-latest + - qsharp-notebook-latest + - hpc-notebook-latest + - hpc-ocean-notebook-latest + - hpc-gpu-notebook-latest + - ocean-notebook-latest + - geo-notebook-latest + - bio-notebook-latest + - bio-bigdata-notebook-latest + - bio-bsa-notebook-latest + - sme-notebook-latest + - jwst-notebook-latest + - julia-notebook-latest + - cern-notebook-latest format_version: 10 pipelines: - base-notebook-dev: + base-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -42,16 +42,16 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: base-notebook - NOTEBOOK_PIPELINE: base-notebook-dev + NOTEBOOK_PIPELINE: base-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -59,7 +59,7 @@ pipelines: timer: &id001 only_on_changes: 'no' spec: 0 0 0 1 * ? - bio-bigdata-notebook-dev: + bio-bigdata-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -72,25 +72,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_bio-bigdata-notebook: - pipeline: r-notebook-dev + pipeline: r-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: bio-bigdata-notebook - NOTEBOOK_PIPELINE: bio-bigdata-notebook-dev + NOTEBOOK_PIPELINE: bio-bigdata-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - bio-bsa-notebook-dev: + bio-bsa-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -103,25 +103,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_bio-bsa-notebook: - pipeline: r-notebook-dev + pipeline: r-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: bio-bsa-notebook - NOTEBOOK_PIPELINE: bio-bsa-notebook-dev + NOTEBOOK_PIPELINE: bio-bsa-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - bio-notebook-dev: + bio-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -134,25 +134,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_bio-notebook: - pipeline: r-notebook-dev + pipeline: r-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: bio-notebook - NOTEBOOK_PIPELINE: bio-notebook-dev + NOTEBOOK_PIPELINE: bio-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - cern-notebook-dev: + cern-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -165,25 +165,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_cern-notebook: - pipeline: datascience-notebook-dev + pipeline: datascience-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: cern-notebook - NOTEBOOK_PIPELINE: cern-notebook-dev + NOTEBOOK_PIPELINE: cern-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - chemistry-notebook-dev: + chemistry-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -196,25 +196,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_chemistry-notebook: - pipeline: base-notebook-dev + pipeline: base-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: chemistry-notebook - NOTEBOOK_PIPELINE: chemistry-notebook-dev + NOTEBOOK_PIPELINE: chemistry-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - datascience-notebook-dev: + datascience-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -227,25 +227,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_datascience-notebook: - pipeline: python-notebook-dev + pipeline: python-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: datascience-notebook - NOTEBOOK_PIPELINE: datascience-notebook-dev + NOTEBOOK_PIPELINE: datascience-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - fenics-notebook-dev: + fenics-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -258,25 +258,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_fenics-notebook: - pipeline: python-notebook-dev + pipeline: python-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: fenics-notebook - NOTEBOOK_PIPELINE: fenics-notebook-dev + NOTEBOOK_PIPELINE: fenics-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - geo-notebook-dev: + geo-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -289,25 +289,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_geo-notebook: - pipeline: python-notebook-dev + pipeline: python-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: geo-notebook - NOTEBOOK_PIPELINE: geo-notebook-dev + NOTEBOOK_PIPELINE: geo-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - gpu-notebook-dev: + gpu-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -320,25 +320,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_gpu-notebook: - pipeline: python-cuda-notebook-dev + pipeline: python-cuda-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: gpu-notebook - NOTEBOOK_PIPELINE: gpu-notebook-dev + NOTEBOOK_PIPELINE: gpu-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - hpc-gpu-notebook-dev: + hpc-gpu-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -351,25 +351,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_hpc-gpu-notebook: - pipeline: hpc-notebook-dev + pipeline: hpc-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: hpc-gpu-notebook - NOTEBOOK_PIPELINE: hpc-gpu-notebook-dev + NOTEBOOK_PIPELINE: hpc-gpu-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - hpc-notebook-dev: + hpc-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -382,25 +382,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_hpc-notebook: - pipeline: slurm-notebook-dev + pipeline: slurm-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: hpc-notebook - NOTEBOOK_PIPELINE: hpc-notebook-dev + NOTEBOOK_PIPELINE: hpc-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - hpc-ocean-notebook-dev: + hpc-ocean-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -413,25 +413,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_hpc-ocean-notebook: - pipeline: slurm-notebook-dev + pipeline: slurm-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: hpc-ocean-notebook - NOTEBOOK_PIPELINE: hpc-ocean-notebook-dev + NOTEBOOK_PIPELINE: hpc-ocean-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - julia-notebook-dev: + julia-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -444,25 +444,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_julia-notebook: - pipeline: base-notebook-dev + pipeline: base-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: julia-notebook - NOTEBOOK_PIPELINE: julia-notebook-dev + NOTEBOOK_PIPELINE: julia-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - jwst-notebook-dev: + jwst-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -475,25 +475,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_jwst-notebook: - pipeline: python-notebook-dev + pipeline: python-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: jwst-notebook - NOTEBOOK_PIPELINE: jwst-notebook-dev + NOTEBOOK_PIPELINE: jwst-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - ocean-notebook-dev: + ocean-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -506,25 +506,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_ocean-notebook: - pipeline: datascience-notebook-dev + pipeline: datascience-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: ocean-notebook - NOTEBOOK_PIPELINE: ocean-notebook-dev + NOTEBOOK_PIPELINE: ocean-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - python-cuda-notebook-dev: + python-cuda-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -537,25 +537,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_python-cuda-notebook: - pipeline: python-notebook-dev + pipeline: python-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: python-cuda-notebook - NOTEBOOK_PIPELINE: python-cuda-notebook-dev + NOTEBOOK_PIPELINE: python-cuda-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - python-notebook-dev: + python-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -568,25 +568,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_python-notebook: - pipeline: base-notebook-dev + pipeline: base-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: python-notebook - NOTEBOOK_PIPELINE: python-notebook-dev + NOTEBOOK_PIPELINE: python-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - qsharp-notebook-dev: + qsharp-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -599,25 +599,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_qsharp-notebook: - pipeline: python-notebook-dev + pipeline: python-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: qsharp-notebook - NOTEBOOK_PIPELINE: qsharp-notebook-dev + NOTEBOOK_PIPELINE: qsharp-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - r-notebook-dev: + r-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -630,25 +630,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_r-notebook: - pipeline: python-notebook-dev + pipeline: python-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: r-notebook - NOTEBOOK_PIPELINE: r-notebook-dev + NOTEBOOK_PIPELINE: r-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - slurm-notebook-dev: + slurm-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -661,25 +661,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_slurm-notebook: - pipeline: python-notebook-dev + pipeline: python-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: slurm-notebook - NOTEBOOK_PIPELINE: slurm-notebook-dev + NOTEBOOK_PIPELINE: slurm-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - sme-notebook-dev: + sme-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -692,25 +692,25 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_sme-notebook: - pipeline: base-notebook-dev + pipeline: base-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: sme-notebook - NOTEBOOK_PIPELINE: sme-notebook-dev + NOTEBOOK_PIPELINE: sme-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - statistics-notebook-dev: + statistics-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -723,19 +723,19 @@ pipelines: password: '{{SECRET:[github][access_token]}}' username: ${GIT_USER} ucphhpc_images: - branch: dev + branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_statistics-notebook: - pipeline: python-notebook-dev + pipeline: python-notebook-4.0.12-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: dev - EXTRA_TAG: 4.0.12-dev + DEFAULT_TAG: latest + EXTRA_TAG: 4.0.12-latest NOTEBOOK: statistics-notebook - NOTEBOOK_PIPELINE: statistics-notebook-dev + NOTEBOOK_PIPELINE: statistics-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks diff --git a/Makefile b/Makefile index 74473d4..db0ebe6 100755 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ .PHONY: installcheck uninstallcheck test test-all push push-all OWNER:=ucphhpc -TAG:=dev +TAG:=latest JUPYTERLAB_VERSION:=4.0.12 PACKAGE_TIMEOUT:=600 ALL_IMAGES:=base-notebook python-notebook statistics-notebook r-notebook slurm-notebook python-cuda-notebook gpu-notebook datascience-notebook chemistry-notebook fenics-notebook qsharp-notebook hpc-notebook hpc-ocean-notebook hpc-gpu-notebook ocean-notebook geo-notebook bio-notebook bio-bigdata-notebook bio-bsa-notebook sme-notebook jwst-notebook julia-notebook cern-notebook @@ -18,7 +18,7 @@ help: @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' init: - . $(VENV)/activate; python3 init-notebooks.py --branch dev --tag $(TAG) --jupyterlab-version $(JUPYTERLAB_VERSION) + . $(VENV)/activate; python3 init-notebooks.py --branch master --tag $(TAG) --jupyterlab-version $(JUPYTERLAB_VERSION) clean: rm -fr .env diff --git a/architecture.yml b/architecture.yml index 4240454..8dfec9f 100644 --- a/architecture.yml +++ b/architecture.yml @@ -1,108 +1,108 @@ owner: ucphhpc architecture: base-notebook: - dev: + latest: parent: owner: quay.io/jupyter image: base-notebook tag: lab-4.0.12 pipeline_dependent: false python-notebook: - dev: + latest: parent: owner: ucphhpc image: base-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true statistics-notebook: - dev: + latest: parent: owner: ucphhpc image: python-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true r-notebook: - dev: + latest: parent: owner: ucphhpc image: python-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true slurm-notebook: - dev: + latest: parent: owner: ucphhpc image: python-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true parameters: SLURM_VERSION: 22.05.11 SLURM_DOWNLOAD_MD5: 44647df647e63dfbfc07dc4d35c3262e python-cuda-notebook: - dev: + latest: parent: owner: ucphhpc image: python-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true extra_template: res/templates/cuda/Dockerfile.cuda extra_template_files: - res/templates/cuda/requirements.txt gpu-notebook: - dev: + latest: parent: owner: ucphhpc image: python-cuda-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true datascience-notebook: - dev: + latest: parent: owner: ucphhpc image: python-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true chemistry-notebook: - dev: + latest: parent: owner: ucphhpc image: base-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true fenics-notebook: - dev: + latest: parent: owner: ucphhpc image: python-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true qsharp-notebook: - dev: + latest: parent: owner: ucphhpc image: python-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true hpc-notebook: - dev: + latest: parent: owner: ucphhpc image: slurm-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true hpc-ocean-notebook: - dev: + latest: parent: owner: ucphhpc image: slurm-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true hpc-gpu-notebook: - dev: + latest: parent: owner: ucphhpc image: hpc-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true parameters: nvhome: /opt/nvidia/hpc_sdk @@ -116,69 +116,69 @@ architecture: extra_template_files: - res/templates/cuda/requirements.txt ocean-notebook: - dev: + latest: parent: owner: ucphhpc image: datascience-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true geo-notebook: - dev: + latest: parent: owner: ucphhpc image: python-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true bio-notebook: - dev: + latest: parent: owner: ucphhpc image: r-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true bio-bigdata-notebook: - dev: + latest: parent: owner: ucphhpc image: r-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true bio-bsa-notebook: - dev: + latest: parent: owner: ucphhpc image: r-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true sme-notebook: - dev: + latest: parent: owner: ucphhpc image: base-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true jwst-notebook: - dev: + latest: parent: owner: ucphhpc image: python-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true julia-notebook: - dev: + latest: parent: owner: ucphhpc image: base-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true parameters: JULIA_MAJOR_VERSION: "1.10" JULIA_MINOR_VERSION: "0" JULIA_DOWNLOAD_MD5: c16f16304cac9af1501ae71c02cb4d1e cern-notebook: - dev: + latest: parent: owner: ucphhpc image: datascience-notebook - tag: dev + tag: 4.0.12-latest pipeline_dependent: true From 205f42a190d1352911359a44614b8ae1fa355ce8 Mon Sep 17 00:00:00 2001 From: Rasmus Munk Date: Thu, 8 Feb 2024 16:58:27 +0100 Subject: [PATCH 06/19] Adjust the pipelines such that both a latest and jupyterlab tagged version is generated --- 1.gocd.yml | 1109 ++++++++++++++++++++++++++++++++++++++++----- Makefile | 3 +- architecture.yml | 241 +++++++++- init-notebooks.py | 13 +- 4 files changed, 1206 insertions(+), 160 deletions(-) diff --git a/1.gocd.yml b/1.gocd.yml index d2424d2..77fc614 100644 --- a/1.gocd.yml +++ b/1.gocd.yml @@ -5,31 +5,58 @@ environments: DOCKERHUB_USERNAME: '{{SECRET:[dockerhub][username]}}' pipelines: - base-notebook-latest + - base-notebook-4.0.12 - python-notebook-latest + - python-notebook-4.0.12 - statistics-notebook-latest + - statistics-notebook-4.0.12 - r-notebook-latest + - r-notebook-4.0.12 - slurm-notebook-latest + - slurm-notebook-22.05.11 + - slurm-notebook-4.0.12 - python-cuda-notebook-latest + - python-cuda-notebook-4.0.12 - gpu-notebook-latest + - gpu-notebook-4.0.12 - datascience-notebook-latest + - datascience-notebook-4.0.12 - chemistry-notebook-latest + - chemistry-notebook-4.0.12 - fenics-notebook-latest + - fenics-notebook-4.0.12 - qsharp-notebook-latest + - qsharp-notebook-4.0.12 - hpc-notebook-latest + - hpc-notebook-22.05.11 + - hpc-notebook-4.0.12 - hpc-ocean-notebook-latest + - hpc-ocean-notebook-22.05.11 + - hpc-ocean-notebook-4.0.12 - hpc-gpu-notebook-latest + - hpc-gpu-notebook-22.05.11 + - hpc-gpu-notebook-4.0.12 - ocean-notebook-latest + - ocean-notebook-4.0.12 - geo-notebook-latest + - geo-notebook-4.0.12 - bio-notebook-latest + - bio-notebook-4.0.12 - bio-bigdata-notebook-latest + - bio-bigdata-notebook-4.0.12 - bio-bsa-notebook-latest + - bio-bsa-notebook-4.0.12 - sme-notebook-latest + - sme-notebook-4.0.12 - jwst-notebook-latest + - jwst-notebook-4.0.12 - julia-notebook-latest + - julia-notebook-4.0.12 - cern-notebook-latest + - cern-notebook-4.0.12 format_version: 10 pipelines: - base-notebook-latest: + base-notebook-4.0.12: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -48,10 +75,10 @@ pipelines: parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' NOTEBOOK: base-notebook - NOTEBOOK_PIPELINE: base-notebook-latest + NOTEBOOK_PIPELINE: base-notebook-4.0.12 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -59,6 +86,65 @@ pipelines: timer: &id001 only_on_changes: 'no' spec: 0 0 0 1 * ? + base-notebook-latest: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: latest + EXTRA_TAG: '' + NOTEBOOK: base-notebook + NOTEBOOK_PIPELINE: base-notebook-latest + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + bio-bigdata-notebook-4.0.12: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_bio-bigdata-notebook: + pipeline: r-notebook-4.0.12 + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: bio-bigdata-notebook + NOTEBOOK_PIPELINE: bio-bigdata-notebook-4.0.12 + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 bio-bigdata-notebook-latest: display_order: -1 group: notebook_image @@ -76,13 +162,13 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_bio-bigdata-notebook: - pipeline: r-notebook-4.0.12-latest + pipeline: r-notebook-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest + EXTRA_TAG: '' NOTEBOOK: bio-bigdata-notebook NOTEBOOK_PIPELINE: bio-bigdata-notebook-latest PUSH_DIRECTORY: publish-docker-scripts @@ -90,6 +176,37 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 + bio-bsa-notebook-4.0.12: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_bio-bsa-notebook: + pipeline: r-notebook-4.0.12 + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: bio-bsa-notebook + NOTEBOOK_PIPELINE: bio-bsa-notebook-4.0.12 + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 bio-bsa-notebook-latest: display_order: -1 group: notebook_image @@ -107,13 +224,13 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_bio-bsa-notebook: - pipeline: r-notebook-4.0.12-latest + pipeline: r-notebook-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest + EXTRA_TAG: '' NOTEBOOK: bio-bsa-notebook NOTEBOOK_PIPELINE: bio-bsa-notebook-latest PUSH_DIRECTORY: publish-docker-scripts @@ -121,6 +238,37 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 + bio-notebook-4.0.12: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_bio-notebook: + pipeline: r-notebook-4.0.12 + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: bio-notebook + NOTEBOOK_PIPELINE: bio-notebook-4.0.12 + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 bio-notebook-latest: display_order: -1 group: notebook_image @@ -138,13 +286,13 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_bio-notebook: - pipeline: r-notebook-4.0.12-latest + pipeline: r-notebook-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest + EXTRA_TAG: '' NOTEBOOK: bio-notebook NOTEBOOK_PIPELINE: bio-notebook-latest PUSH_DIRECTORY: publish-docker-scripts @@ -152,6 +300,37 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 + cern-notebook-4.0.12: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_cern-notebook: + pipeline: datascience-notebook-4.0.12 + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: cern-notebook + NOTEBOOK_PIPELINE: cern-notebook-4.0.12 + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 cern-notebook-latest: display_order: -1 group: notebook_image @@ -169,13 +348,13 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_cern-notebook: - pipeline: datascience-notebook-4.0.12-latest + pipeline: datascience-notebook-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest + EXTRA_TAG: '' NOTEBOOK: cern-notebook NOTEBOOK_PIPELINE: cern-notebook-latest PUSH_DIRECTORY: publish-docker-scripts @@ -183,7 +362,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - chemistry-notebook-latest: + chemistry-notebook-4.0.12: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -200,21 +379,21 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_chemistry-notebook: - pipeline: base-notebook-4.0.12-latest + pipeline: base-notebook-4.0.12 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' NOTEBOOK: chemistry-notebook - NOTEBOOK_PIPELINE: chemistry-notebook-latest + NOTEBOOK_PIPELINE: chemistry-notebook-4.0.12 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - datascience-notebook-latest: + chemistry-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -230,22 +409,22 @@ pipelines: branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git - upstream_datascience-notebook: - pipeline: python-notebook-4.0.12-latest + upstream_chemistry-notebook: + pipeline: base-notebook-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest - NOTEBOOK: datascience-notebook - NOTEBOOK_PIPELINE: datascience-notebook-latest + EXTRA_TAG: '' + NOTEBOOK: chemistry-notebook + NOTEBOOK_PIPELINE: chemistry-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - fenics-notebook-latest: + datascience-notebook-4.0.12: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -261,22 +440,22 @@ pipelines: branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git - upstream_fenics-notebook: - pipeline: python-notebook-4.0.12-latest + upstream_datascience-notebook: + pipeline: python-notebook-4.0.12 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest - NOTEBOOK: fenics-notebook - NOTEBOOK_PIPELINE: fenics-notebook-latest + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: datascience-notebook + NOTEBOOK_PIPELINE: datascience-notebook-4.0.12 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - geo-notebook-latest: + datascience-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -292,22 +471,22 @@ pipelines: branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git - upstream_geo-notebook: - pipeline: python-notebook-4.0.12-latest + upstream_datascience-notebook: + pipeline: python-notebook-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest - NOTEBOOK: geo-notebook - NOTEBOOK_PIPELINE: geo-notebook-latest + EXTRA_TAG: '' + NOTEBOOK: datascience-notebook + NOTEBOOK_PIPELINE: datascience-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - gpu-notebook-latest: + fenics-notebook-4.0.12: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -323,22 +502,22 @@ pipelines: branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git - upstream_gpu-notebook: - pipeline: python-cuda-notebook-4.0.12-latest + upstream_fenics-notebook: + pipeline: python-notebook-4.0.12 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest - NOTEBOOK: gpu-notebook - NOTEBOOK_PIPELINE: gpu-notebook-latest + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: fenics-notebook + NOTEBOOK_PIPELINE: fenics-notebook-4.0.12 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - hpc-gpu-notebook-latest: + fenics-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -354,22 +533,22 @@ pipelines: branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git - upstream_hpc-gpu-notebook: - pipeline: hpc-notebook-4.0.12-latest + upstream_fenics-notebook: + pipeline: python-notebook-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest - NOTEBOOK: hpc-gpu-notebook - NOTEBOOK_PIPELINE: hpc-gpu-notebook-latest + EXTRA_TAG: '' + NOTEBOOK: fenics-notebook + NOTEBOOK_PIPELINE: fenics-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - hpc-notebook-latest: + geo-notebook-4.0.12: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -385,22 +564,22 @@ pipelines: branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git - upstream_hpc-notebook: - pipeline: slurm-notebook-4.0.12-latest + upstream_geo-notebook: + pipeline: python-notebook-4.0.12 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest - NOTEBOOK: hpc-notebook - NOTEBOOK_PIPELINE: hpc-notebook-latest + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: geo-notebook + NOTEBOOK_PIPELINE: geo-notebook-4.0.12 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - hpc-ocean-notebook-latest: + geo-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -416,22 +595,22 @@ pipelines: branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git - upstream_hpc-ocean-notebook: - pipeline: slurm-notebook-4.0.12-latest + upstream_geo-notebook: + pipeline: python-notebook-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest - NOTEBOOK: hpc-ocean-notebook - NOTEBOOK_PIPELINE: hpc-ocean-notebook-latest + EXTRA_TAG: '' + NOTEBOOK: geo-notebook + NOTEBOOK_PIPELINE: geo-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - julia-notebook-latest: + gpu-notebook-4.0.12: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -447,22 +626,22 @@ pipelines: branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git - upstream_julia-notebook: - pipeline: base-notebook-4.0.12-latest + upstream_gpu-notebook: + pipeline: python-cuda-notebook-4.0.12 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest - NOTEBOOK: julia-notebook - NOTEBOOK_PIPELINE: julia-notebook-latest + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: gpu-notebook + NOTEBOOK_PIPELINE: gpu-notebook-4.0.12 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - jwst-notebook-latest: + gpu-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -478,22 +657,22 @@ pipelines: branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git - upstream_jwst-notebook: - pipeline: python-notebook-4.0.12-latest + upstream_gpu-notebook: + pipeline: python-cuda-notebook-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest - NOTEBOOK: jwst-notebook - NOTEBOOK_PIPELINE: jwst-notebook-latest + EXTRA_TAG: '' + NOTEBOOK: gpu-notebook + NOTEBOOK_PIPELINE: gpu-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - ocean-notebook-latest: + hpc-gpu-notebook-22.05.11: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -509,22 +688,22 @@ pipelines: branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git - upstream_ocean-notebook: - pipeline: datascience-notebook-4.0.12-latest + upstream_hpc-gpu-notebook: + pipeline: hpc-notebook-22.05.11 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest - NOTEBOOK: ocean-notebook - NOTEBOOK_PIPELINE: ocean-notebook-latest + DEFAULT_TAG: 22.05.11 + EXTRA_TAG: '' + NOTEBOOK: hpc-gpu-notebook + NOTEBOOK_PIPELINE: hpc-gpu-notebook-22.05.11 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - python-cuda-notebook-latest: + hpc-gpu-notebook-4.0.12: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -540,22 +719,22 @@ pipelines: branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git - upstream_python-cuda-notebook: - pipeline: python-notebook-4.0.12-latest + upstream_hpc-gpu-notebook: + pipeline: hpc-notebook-4.0.12 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest - NOTEBOOK: python-cuda-notebook - NOTEBOOK_PIPELINE: python-cuda-notebook-latest + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: hpc-gpu-notebook + NOTEBOOK_PIPELINE: hpc-gpu-notebook-4.0.12 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - python-notebook-latest: + hpc-gpu-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -571,22 +750,22 @@ pipelines: branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git - upstream_python-notebook: - pipeline: base-notebook-4.0.12-latest + upstream_hpc-gpu-notebook: + pipeline: hpc-notebook-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest - NOTEBOOK: python-notebook - NOTEBOOK_PIPELINE: python-notebook-latest + EXTRA_TAG: '' + NOTEBOOK: hpc-gpu-notebook + NOTEBOOK_PIPELINE: hpc-gpu-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - qsharp-notebook-latest: + hpc-notebook-22.05.11: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -602,22 +781,22 @@ pipelines: branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git - upstream_qsharp-notebook: - pipeline: python-notebook-4.0.12-latest + upstream_hpc-notebook: + pipeline: slurm-notebook-22.05.11 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest - NOTEBOOK: qsharp-notebook - NOTEBOOK_PIPELINE: qsharp-notebook-latest + DEFAULT_TAG: 22.05.11 + EXTRA_TAG: '' + NOTEBOOK: hpc-notebook + NOTEBOOK_PIPELINE: hpc-notebook-22.05.11 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - r-notebook-latest: + hpc-notebook-4.0.12: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -633,22 +812,22 @@ pipelines: branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git - upstream_r-notebook: - pipeline: python-notebook-4.0.12-latest + upstream_hpc-notebook: + pipeline: slurm-notebook-4.0.12 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest - NOTEBOOK: r-notebook - NOTEBOOK_PIPELINE: r-notebook-latest + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: hpc-notebook + NOTEBOOK_PIPELINE: hpc-notebook-4.0.12 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - slurm-notebook-latest: + hpc-notebook-latest: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -664,22 +843,22 @@ pipelines: branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git - upstream_slurm-notebook: - pipeline: python-notebook-4.0.12-latest + upstream_hpc-notebook: + pipeline: slurm-notebook-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest - NOTEBOOK: slurm-notebook - NOTEBOOK_PIPELINE: slurm-notebook-latest + EXTRA_TAG: '' + NOTEBOOK: hpc-notebook + NOTEBOOK_PIPELINE: hpc-notebook-latest PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - sme-notebook-latest: + hpc-ocean-notebook-22.05.11: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -695,16 +874,698 @@ pipelines: branch: master destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git - upstream_sme-notebook: - pipeline: base-notebook-4.0.12-latest + upstream_hpc-ocean-notebook: + pipeline: slurm-notebook-22.05.11 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest - NOTEBOOK: sme-notebook - NOTEBOOK_PIPELINE: sme-notebook-latest + DEFAULT_TAG: 22.05.11 + EXTRA_TAG: '' + NOTEBOOK: hpc-ocean-notebook + NOTEBOOK_PIPELINE: hpc-ocean-notebook-22.05.11 + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + hpc-ocean-notebook-4.0.12: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_hpc-ocean-notebook: + pipeline: slurm-notebook-4.0.12 + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: hpc-ocean-notebook + NOTEBOOK_PIPELINE: hpc-ocean-notebook-4.0.12 + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + hpc-ocean-notebook-latest: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_hpc-ocean-notebook: + pipeline: slurm-notebook-latest + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: latest + EXTRA_TAG: '' + NOTEBOOK: hpc-ocean-notebook + NOTEBOOK_PIPELINE: hpc-ocean-notebook-latest + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + julia-notebook-4.0.12: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_julia-notebook: + pipeline: base-notebook-4.0.12 + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: julia-notebook + NOTEBOOK_PIPELINE: julia-notebook-4.0.12 + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + julia-notebook-latest: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_julia-notebook: + pipeline: base-notebook-latest + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: latest + EXTRA_TAG: '' + NOTEBOOK: julia-notebook + NOTEBOOK_PIPELINE: julia-notebook-latest + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + jwst-notebook-4.0.12: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_jwst-notebook: + pipeline: python-notebook-4.0.12 + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: jwst-notebook + NOTEBOOK_PIPELINE: jwst-notebook-4.0.12 + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + jwst-notebook-latest: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_jwst-notebook: + pipeline: python-notebook-latest + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: latest + EXTRA_TAG: '' + NOTEBOOK: jwst-notebook + NOTEBOOK_PIPELINE: jwst-notebook-latest + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + ocean-notebook-4.0.12: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_ocean-notebook: + pipeline: datascience-notebook-4.0.12 + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: ocean-notebook + NOTEBOOK_PIPELINE: ocean-notebook-4.0.12 + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + ocean-notebook-latest: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_ocean-notebook: + pipeline: datascience-notebook-latest + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: latest + EXTRA_TAG: '' + NOTEBOOK: ocean-notebook + NOTEBOOK_PIPELINE: ocean-notebook-latest + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + python-cuda-notebook-4.0.12: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_python-cuda-notebook: + pipeline: python-notebook-4.0.12 + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: python-cuda-notebook + NOTEBOOK_PIPELINE: python-cuda-notebook-4.0.12 + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + python-cuda-notebook-latest: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_python-cuda-notebook: + pipeline: python-notebook-latest + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: latest + EXTRA_TAG: '' + NOTEBOOK: python-cuda-notebook + NOTEBOOK_PIPELINE: python-cuda-notebook-latest + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + python-notebook-4.0.12: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_python-notebook: + pipeline: base-notebook-4.0.12 + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: python-notebook + NOTEBOOK_PIPELINE: python-notebook-4.0.12 + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + python-notebook-latest: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_python-notebook: + pipeline: base-notebook-latest + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: latest + EXTRA_TAG: '' + NOTEBOOK: python-notebook + NOTEBOOK_PIPELINE: python-notebook-latest + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + qsharp-notebook-4.0.12: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_qsharp-notebook: + pipeline: python-notebook-4.0.12 + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: qsharp-notebook + NOTEBOOK_PIPELINE: qsharp-notebook-4.0.12 + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + qsharp-notebook-latest: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_qsharp-notebook: + pipeline: python-notebook-latest + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: latest + EXTRA_TAG: '' + NOTEBOOK: qsharp-notebook + NOTEBOOK_PIPELINE: qsharp-notebook-latest + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + r-notebook-4.0.12: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_r-notebook: + pipeline: python-notebook-4.0.12 + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: r-notebook + NOTEBOOK_PIPELINE: r-notebook-4.0.12 + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + r-notebook-latest: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_r-notebook: + pipeline: python-notebook-latest + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: latest + EXTRA_TAG: '' + NOTEBOOK: r-notebook + NOTEBOOK_PIPELINE: r-notebook-latest + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + slurm-notebook-22.05.11: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_slurm-notebook: + pipeline: python-notebook-latest + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: 22.05.11 + EXTRA_TAG: '' + NOTEBOOK: slurm-notebook + NOTEBOOK_PIPELINE: slurm-notebook-22.05.11 + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + slurm-notebook-4.0.12: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_slurm-notebook: + pipeline: python-notebook-4.0.12 + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: slurm-notebook + NOTEBOOK_PIPELINE: slurm-notebook-4.0.12 + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + slurm-notebook-latest: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_slurm-notebook: + pipeline: python-notebook-latest + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: latest + EXTRA_TAG: '' + NOTEBOOK: slurm-notebook + NOTEBOOK_PIPELINE: slurm-notebook-latest + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + sme-notebook-4.0.12: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_sme-notebook: + pipeline: base-notebook-4.0.12 + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: sme-notebook + NOTEBOOK_PIPELINE: sme-notebook-4.0.12 + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + sme-notebook-latest: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_sme-notebook: + pipeline: base-notebook-latest + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: latest + EXTRA_TAG: '' + NOTEBOOK: sme-notebook + NOTEBOOK_PIPELINE: sme-notebook-latest + PUSH_DIRECTORY: publish-docker-scripts + SRC_DIRECTORY: nbi-jupyter-docker-stacks + TEST_DIRECTORY: nbi-jupyter-docker-stacks + template: notebook_image + timer: *id001 + statistics-notebook-4.0.12: + display_order: -1 + group: notebook_image + label_template: ${COUNT} + lock_behaviour: none + materials: + publish_docker_git: + branch: main + destination: publish-docker-scripts + git: https://github.com/rasmunk/publish-docker-scripts.git + password: '{{SECRET:[github][access_token]}}' + username: ${GIT_USER} + ucphhpc_images: + branch: master + destination: nbi-jupyter-docker-stacks + git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git + upstream_statistics-notebook: + pipeline: python-notebook-4.0.12 + stage: push + parameters: + ARGS: '' + COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES + DEFAULT_TAG: 4.0.12 + EXTRA_TAG: '' + NOTEBOOK: statistics-notebook + NOTEBOOK_PIPELINE: statistics-notebook-4.0.12 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -727,13 +1588,13 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_statistics-notebook: - pipeline: python-notebook-4.0.12-latest + pipeline: python-notebook-latest stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES DEFAULT_TAG: latest - EXTRA_TAG: 4.0.12-latest + EXTRA_TAG: '' NOTEBOOK: statistics-notebook NOTEBOOK_PIPELINE: statistics-notebook-latest PUSH_DIRECTORY: publish-docker-scripts diff --git a/Makefile b/Makefile index db0ebe6..7deb7c2 100755 --- a/Makefile +++ b/Makefile @@ -3,7 +3,6 @@ OWNER:=ucphhpc TAG:=latest -JUPYTERLAB_VERSION:=4.0.12 PACKAGE_TIMEOUT:=600 ALL_IMAGES:=base-notebook python-notebook statistics-notebook r-notebook slurm-notebook python-cuda-notebook gpu-notebook datascience-notebook chemistry-notebook fenics-notebook qsharp-notebook hpc-notebook hpc-ocean-notebook hpc-gpu-notebook ocean-notebook geo-notebook bio-notebook bio-bigdata-notebook bio-bsa-notebook sme-notebook jwst-notebook julia-notebook cern-notebook @@ -18,7 +17,7 @@ help: @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' init: - . $(VENV)/activate; python3 init-notebooks.py --branch master --tag $(TAG) --jupyterlab-version $(JUPYTERLAB_VERSION) + . $(VENV)/activate; python3 init-notebooks.py --branch master --tag $(TAG) clean: rm -fr .env diff --git a/architecture.yml b/architecture.yml index 8dfec9f..635b66b 100644 --- a/architecture.yml +++ b/architecture.yml @@ -7,33 +7,75 @@ architecture: image: base-notebook tag: lab-4.0.12 pipeline_dependent: false + 4.0.12: + parent: + owner: quay.io/jupyter + image: base-notebook + tag: lab-4.0.12 + pipeline_dependent: false python-notebook: latest: parent: owner: ucphhpc image: base-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + 4.0.12: + parent: + owner: ucphhpc + image: base-notebook + tag: 4.0.12 pipeline_dependent: true statistics-notebook: latest: parent: owner: ucphhpc image: python-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + 4.0.12: + parent: + owner: ucphhpc + image: python-notebook + tag: 4.0.12 pipeline_dependent: true r-notebook: latest: parent: owner: ucphhpc image: python-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + 4.0.12: + parent: + owner: ucphhpc + image: python-notebook + tag: 4.0.12 pipeline_dependent: true slurm-notebook: latest: parent: owner: ucphhpc image: python-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + parameters: + SLURM_VERSION: 22.05.11 + SLURM_DOWNLOAD_MD5: 44647df647e63dfbfc07dc4d35c3262e + 22.05.11: + parent: + owner: ucphhpc + image: python-notebook + tag: latest + pipeline_dependent: true + parameters: + SLURM_VERSION: 22.05.11 + SLURM_DOWNLOAD_MD5: 44647df647e63dfbfc07dc4d35c3262e + 4.0.12: + parent: + owner: ucphhpc + image: python-notebook + tag: 4.0.12 pipeline_dependent: true parameters: SLURM_VERSION: 22.05.11 @@ -43,7 +85,16 @@ architecture: parent: owner: ucphhpc image: python-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + extra_template: res/templates/cuda/Dockerfile.cuda + extra_template_files: + - res/templates/cuda/requirements.txt + 4.0.12: + parent: + owner: ucphhpc + image: python-notebook + tag: 4.0.12 pipeline_dependent: true extra_template: res/templates/cuda/Dockerfile.cuda extra_template_files: @@ -53,56 +104,144 @@ architecture: parent: owner: ucphhpc image: python-cuda-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + 4.0.12: + parent: + owner: ucphhpc + image: python-cuda-notebook + tag: 4.0.12 pipeline_dependent: true datascience-notebook: latest: parent: owner: ucphhpc image: python-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + 4.0.12: + parent: + owner: ucphhpc + image: python-notebook + tag: 4.0.12 pipeline_dependent: true chemistry-notebook: latest: parent: owner: ucphhpc image: base-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + 4.0.12: + parent: + owner: ucphhpc + image: base-notebook + tag: 4.0.12 pipeline_dependent: true fenics-notebook: latest: parent: owner: ucphhpc image: python-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + 4.0.12: + parent: + owner: ucphhpc + image: python-notebook + tag: 4.0.12 pipeline_dependent: true qsharp-notebook: latest: parent: owner: ucphhpc image: python-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + 4.0.12: + parent: + owner: ucphhpc + image: python-notebook + tag: 4.0.12 pipeline_dependent: true hpc-notebook: latest: parent: owner: ucphhpc image: slurm-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + 22.05.11: + parent: + owner: ucphhpc + image: slurm-notebook + tag: 22.05.11 + pipeline_dependent: true + 4.0.12: + parent: + owner: ucphhpc + image: slurm-notebook + tag: 4.0.12 pipeline_dependent: true hpc-ocean-notebook: latest: parent: owner: ucphhpc image: slurm-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + 22.05.11: + parent: + owner: ucphhpc + image: slurm-notebook + tag: 22.05.11 + pipeline_dependent: true + 4.0.12: + parent: + owner: ucphhpc + image: slurm-notebook + tag: 4.0.12 pipeline_dependent: true hpc-gpu-notebook: latest: parent: owner: ucphhpc image: hpc-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + parameters: + nvhome: /opt/nvidia/hpc_sdk + target: Linux_x86_64 + version: 22.2 + nvcudadir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/cuda" + nvcompdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/compilers" + nvmathdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/math_libs" + nvcommdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/comm_libs" + extra_template: res/templates/cuda/Dockerfile.cuda + extra_template_files: + - res/templates/cuda/requirements.txt + 22.05.11: + parent: + owner: ucphhpc + image: hpc-notebook + tag: 22.05.11 + pipeline_dependent: true + parameters: + nvhome: /opt/nvidia/hpc_sdk + target: Linux_x86_64 + version: 22.2 + nvcudadir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/cuda" + nvcompdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/compilers" + nvmathdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/math_libs" + nvcommdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/comm_libs" + extra_template: res/templates/cuda/Dockerfile.cuda + extra_template_files: + - res/templates/cuda/requirements.txt + 4.0.12: + parent: + owner: ucphhpc + image: hpc-notebook + tag: 4.0.12 pipeline_dependent: true parameters: nvhome: /opt/nvidia/hpc_sdk @@ -120,56 +259,108 @@ architecture: parent: owner: ucphhpc image: datascience-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + 4.0.12: + parent: + owner: ucphhpc + image: datascience-notebook + tag: 4.0.12 pipeline_dependent: true geo-notebook: latest: parent: owner: ucphhpc image: python-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + 4.0.12: + parent: + owner: ucphhpc + image: python-notebook + tag: 4.0.12 pipeline_dependent: true bio-notebook: latest: parent: owner: ucphhpc image: r-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + 4.0.12: + parent: + owner: ucphhpc + image: r-notebook + tag: 4.0.12 pipeline_dependent: true bio-bigdata-notebook: latest: parent: owner: ucphhpc image: r-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + 4.0.12: + parent: + owner: ucphhpc + image: r-notebook + tag: 4.0.12 pipeline_dependent: true bio-bsa-notebook: latest: parent: owner: ucphhpc image: r-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + 4.0.12: + parent: + owner: ucphhpc + image: r-notebook + tag: 4.0.12 pipeline_dependent: true sme-notebook: latest: parent: owner: ucphhpc image: base-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + 4.0.12: + parent: + owner: ucphhpc + image: base-notebook + tag: 4.0.12 pipeline_dependent: true jwst-notebook: latest: parent: owner: ucphhpc image: python-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + 4.0.12: + parent: + owner: ucphhpc + image: python-notebook + tag: 4.0.12 pipeline_dependent: true julia-notebook: latest: parent: owner: ucphhpc image: base-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + parameters: + JULIA_MAJOR_VERSION: "1.10" + JULIA_MINOR_VERSION: "0" + JULIA_DOWNLOAD_MD5: c16f16304cac9af1501ae71c02cb4d1e + 4.0.12: + parent: + owner: ucphhpc + image: base-notebook + tag: 4.0.12 pipeline_dependent: true parameters: JULIA_MAJOR_VERSION: "1.10" @@ -180,5 +371,11 @@ architecture: parent: owner: ucphhpc image: datascience-notebook - tag: 4.0.12-latest + tag: latest + pipeline_dependent: true + 4.0.12: + parent: + owner: ucphhpc + image: datascience-notebook + tag: 4.0.12 pipeline_dependent: true diff --git a/init-notebooks.py b/init-notebooks.py index 365b530..392cdac 100644 --- a/init-notebooks.py +++ b/init-notebooks.py @@ -109,9 +109,6 @@ def get_materials(notebook, upstream_pipeline=None, stage=None): parser.add_argument( "--tag", default="latest", help="The tag that should be built" ) - parser.add_argument( - "--jupyterlab-version", default="4.0.12", help="The version of jupyterlab" - ) parser.add_argument( "--makefile", default="Makefile", help="The makefile that defines the images" ) @@ -121,7 +118,6 @@ def get_materials(notebook, upstream_pipeline=None, stage=None): config_name = args.config_name branch = args.branch tag = args.tag - jupyterlab_version = args.jupyterlab_version makefile = args.makefile # Load the architecture file @@ -254,13 +250,6 @@ def get_materials(notebook, upstream_pipeline=None, stage=None): ) else: materials = get_materials(notebook) - - extra_tag = "" - if "publish_details" in build_data: - if "extra_tag" in build_data["publish_details"]: - extra_tag = build_data["publish_details"]["extra_tag"] - if not extra_tag: - extra_tag = "{}-{}".format(jupyterlab_version, tag) notebook_version_name = "{}-{}".format(notebook, version) notebook_pipeline = { @@ -271,7 +260,7 @@ def get_materials(notebook, upstream_pipeline=None, stage=None): "NOTEBOOK_PIPELINE": notebook_version_name, "DEFAULT_TAG": version, "COMMIT_TAG": "GO_REVISION_UCPHHPC_IMAGES", - "EXTRA_TAG": extra_tag, + "EXTRA_TAG": "", "SRC_DIRECTORY": REPO_NAME, "TEST_DIRECTORY": REPO_NAME, "PUSH_DIRECTORY": "publish-docker-scripts", From b333966853930f2bccd0cbfa102eebf3a7813fb1 Mon Sep 17 00:00:00 2001 From: Rasmus Munk Date: Mon, 12 Feb 2024 16:04:53 +0100 Subject: [PATCH 07/19] Add OpenMPI as a compiled installation to the SLURM Notebook --- architecture.yml | 9 +++++++++ slurm-notebook/Dockerfile.j2 | 29 ++++++++++++++++++++++++----- 2 files changed, 33 insertions(+), 5 deletions(-) diff --git a/architecture.yml b/architecture.yml index 635b66b..6c97213 100644 --- a/architecture.yml +++ b/architecture.yml @@ -62,6 +62,9 @@ architecture: parameters: SLURM_VERSION: 22.05.11 SLURM_DOWNLOAD_MD5: 44647df647e63dfbfc07dc4d35c3262e + OPENMPI_MAJOR_VERSION: 4.1 + OPENMPI_MINOR_VERSION: 6 + OPENMPI_DOWNLOAD_MD5: c9b1c974cfc23c77c0fbdb965cd58a1c 22.05.11: parent: owner: ucphhpc @@ -71,6 +74,9 @@ architecture: parameters: SLURM_VERSION: 22.05.11 SLURM_DOWNLOAD_MD5: 44647df647e63dfbfc07dc4d35c3262e + OPENMPI_MAJOR_VERSION: 4.1 + OPENMPI_MINOR_VERSION: 6 + OPENMPI_DOWNLOAD_MD5: c9b1c974cfc23c77c0fbdb965cd58a1c 4.0.12: parent: owner: ucphhpc @@ -80,6 +86,9 @@ architecture: parameters: SLURM_VERSION: 22.05.11 SLURM_DOWNLOAD_MD5: 44647df647e63dfbfc07dc4d35c3262e + OPENMPI_MAJOR_VERSION: 4.1 + OPENMPI_MINOR_VERSION: 6 + OPENMPI_DOWNLOAD_MD5: c9b1c974cfc23c77c0fbdb965cd58a1c python-cuda-notebook: latest: parent: diff --git a/slurm-notebook/Dockerfile.j2 b/slurm-notebook/Dockerfile.j2 index 901234b..42e1350 100755 --- a/slurm-notebook/Dockerfile.j2 +++ b/slurm-notebook/Dockerfile.j2 @@ -3,7 +3,12 @@ LABEL MAINTAINER="Rasmus Munk " ARG SLURM_VERSION={{ SLURM_VERSION }} ARG SLURM_DOWNLOAD_MD5={{ SLURM_DOWNLOAD_MD5 }} -ARG SLURM_DOWNLOAD_URL="https://download.schedmd.com/slurm/slurm-$SLURM_VERSION.tar.bz2" +ARG SLURM_DOWNLOAD_URL="https://download.schedmd.com/slurm/slurm-${SLURM_VERSION}.tar.bz2" +ARG OPENMPI_MAJOR_VERSION={{ OPENMPI_MAJOR_VERSION }} +ARG OPENMPI_MINOR_VERSION={{ OPENMPI_MINOR_VERSION }} +ARG OPENMPI_VERSION={{ OPENMPI_MAJOR_VERSION }}.{{ OPENMPI_MINOR_VERSION }} +ARG OPENMPI_DOWNLOAD_MD5={{ OPENMPI_DOWNLOAD_MD5 }} +ARG OPENMPI_DOWNLOAD_URL="https://download.open-mpi.org/release/open-mpi/v${OPENMPI_MAJOR_VERSION}/openmpi-${OPENMPI_VERSION}.tar.bz2" ARG PACKAGE_TIMEOUT=60 USER root @@ -35,11 +40,9 @@ RUN apt-get update \ libhdf5-doc \ libmunge-dev \ libnss-ldap \ - libopenmpi-dev \ libpam-ldap \ libslurm-dev \ munge \ - openmpi-bin \ python3-h5py \ supervisor \ tcsh \ @@ -58,8 +61,8 @@ WORKDIR /tmp RUN sed -i "s/\/\* #undef H5_NO_DEPRECATED_SYMBOLS \*\//#undef H5_NO_DEPRECATED_SYMBOLS/g" /usr/include/hdf5/serial/H5pubconf.h RUN cd \ - && wget -O slurm.tar.bz2 "$SLURM_DOWNLOAD_URL" \ - && echo "$SLURM_DOWNLOAD_MD5" slurm.tar.bz2 | md5sum -c - \ + && wget -O slurm.tar.bz2 "${SLURM_DOWNLOAD_URL}" \ + && echo "${SLURM_DOWNLOAD_MD5}" slurm.tar.bz2 | md5sum -c - \ && mkdir -p /usr/local/src/slurm \ && tar jxf slurm.tar.bz2 -C /usr/local/src/slurm --strip-components=1 \ && cd /usr/local/src/slurm \ @@ -69,6 +72,21 @@ RUN cd \ && cd \ && rm -f slurm.tar.bz2 +# OpenMPI +RUN cd \ + && wget -O openmpi.tar.bz2 "${OPENMPI_DOWNLOAD_URL}" \ + && echo "${OPENMPI_DOWNLOAD_MD5}" openmpi.tar.bz2 | md5sum -c - \ + && mkdir -p /opt/openmpi-${OPENMPI_VERSION} \ + && tar jxf openmpi.tar.bz2 -C /opt/openmpi-${OPENMPI_VERSION} --strip-components=1 \ + && cd /opt/openmpi-${OPENMPI_VERSION} \ + && ./configure --prefix=/opt/openmpi-${OPENMPI_VERSION} \ + && make install \ + && cd \ + && rm -f openmpi.tar.bz2 + +ENV PATH="/opt/openmpi-${OPENMPI_VERSION}/bin:${PATH}" + +# Munge # Required directories RUN mkdir -p /var/run/munge \ && chown -R munge:munge /var/run/munge \ @@ -126,6 +144,7 @@ RUN chown $NB_UID:$NB_GID /etc/supervisor/supervisord.conf \ && chmod 775 /etc/supervisor/supervisord.conf WORKDIR "${HOME}" + # Ensure that the common MPI library is loaded ENV LD_LIBRARY_PATH="/usr/lib/x86_64-linux-gnu/:${LD_LIBRARY_PATH}" From 0a6d4c51bb81f8253bd545eba40bdc1b2b8e75a6 Mon Sep 17 00:00:00 2001 From: Rasmus Munk Date: Mon, 12 Feb 2024 16:38:53 +0100 Subject: [PATCH 08/19] Include the OpenMPI library path --- slurm-notebook/Dockerfile.j2 | 1 + 1 file changed, 1 insertion(+) diff --git a/slurm-notebook/Dockerfile.j2 b/slurm-notebook/Dockerfile.j2 index 42e1350..795c810 100755 --- a/slurm-notebook/Dockerfile.j2 +++ b/slurm-notebook/Dockerfile.j2 @@ -85,6 +85,7 @@ RUN cd \ && rm -f openmpi.tar.bz2 ENV PATH="/opt/openmpi-${OPENMPI_VERSION}/bin:${PATH}" +ENV LD_LIBRARY_PATH="/opt/openmpi-${OPENMPI_VERSION}/lib:${LD_LIBRARY_PATH}" # Munge # Required directories From f842925d8fc579289bdfbb364e0c0a40748f07d1 Mon Sep 17 00:00:00 2001 From: Rasmus Munk Date: Tue, 13 Feb 2024 11:08:04 +0100 Subject: [PATCH 09/19] Ensure that the default python3 kernel also has the path to the OpenMPI binaries --- slurm-notebook/Dockerfile.j2 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/slurm-notebook/Dockerfile.j2 b/slurm-notebook/Dockerfile.j2 index 795c810..4f83f1c 100755 --- a/slurm-notebook/Dockerfile.j2 +++ b/slurm-notebook/Dockerfile.j2 @@ -86,6 +86,8 @@ RUN cd \ ENV PATH="/opt/openmpi-${OPENMPI_VERSION}/bin:${PATH}" ENV LD_LIBRARY_PATH="/opt/openmpi-${OPENMPI_VERSION}/lib:${LD_LIBRARY_PATH}" +# Update the Python3 environment path to include the OpenMPI path +RUN mamba run -n python3 python3 /usr/local/bin/update_kernel_spec.py python3 --env-kwargs PATH=$PATH # Munge # Required directories @@ -147,7 +149,7 @@ RUN chown $NB_UID:$NB_GID /etc/supervisor/supervisord.conf \ WORKDIR "${HOME}" # Ensure that the common MPI library is loaded -ENV LD_LIBRARY_PATH="/usr/lib/x86_64-linux-gnu/:${LD_LIBRARY_PATH}" +ENV LD_LIBRARY_PATH="/usr/lib/x86_64-linux-gnu:${LD_LIBRARY_PATH}" USER root # As an exception, run as root, From a6f4fafdb5fecdd01d29d4a328aba73fac4d683e Mon Sep 17 00:00:00 2001 From: Rasmus Munk Date: Tue, 13 Feb 2024 11:31:13 +0100 Subject: [PATCH 10/19] Remove redundant permission calls --- slurm-notebook/Dockerfile.j2 | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/slurm-notebook/Dockerfile.j2 b/slurm-notebook/Dockerfile.j2 index 4f83f1c..4f381a0 100755 --- a/slurm-notebook/Dockerfile.j2 +++ b/slurm-notebook/Dockerfile.j2 @@ -112,18 +112,14 @@ RUN jupyterlab_pip3 install git+https://github.com/ucphhpc/modi-helper-scripts.g # Install packages for python3 envs COPY requirements.txt /tmp/ RUN mamba run -n python3 pip install -r requirements.txt \ - && mamba clean -y --all \ - && fix-permissions $CONDA_DIR \ - && fix-permissions /home/$NB_USER + && mamba clean -y --all # Add cling kernel # https://github.com/QuantStack/xeus-cling COPY environment.yml /tmp/ RUN mamba env create -n cling -f environment.yml \ && mamba clean --all -f -y \ - && rm -fr /tmp/tmp* \ - && fix-permissions $CONDA_DIR \ - && fix-permissions /home/$NB_USER + && rm -fr /tmp/tmp* ENV CXX_PATH=$CONDA_DIR/envs/cling RUN cp -R $CXX_PATH/share/jupyter/kernels/* $CONDA_DIR/share/jupyter/kernels/ From 852e58b8591d819072045a9a06b888f13f767cc1 Mon Sep 17 00:00:00 2001 From: Rasmus Munk Date: Tue, 13 Feb 2024 19:51:28 +0100 Subject: [PATCH 11/19] Remove redundant permission calls --- hpc-notebook/Dockerfile.j2 | 8 ++------ res/templates/cuda/Dockerfile.cuda | 4 +--- 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/hpc-notebook/Dockerfile.j2 b/hpc-notebook/Dockerfile.j2 index 62fc58a..937960c 100755 --- a/hpc-notebook/Dockerfile.j2 +++ b/hpc-notebook/Dockerfile.j2 @@ -64,15 +64,11 @@ RUN mamba config --set remote_read_timeout_secs $PACKAGE_TIMEOUT COPY environment.yml /tmp/ RUN mamba env update -n python3 -f environment.yml \ - && mamba clean --all -f -y \ - && fix-permissions $CONDA_DIR \ - && fix-permissions /home/$NB_USER + && mamba clean --all -f -y COPY requirements.txt /tmp/ RUN mamba run -n python3 pip install -r requirements.txt \ - && mamba clean -y --all \ - && fix-permissions $CONDA_DIR \ - && fix-permissions /home/$NB_USER + && mamba clean -y --all WORKDIR "${HOME}" diff --git a/res/templates/cuda/Dockerfile.cuda b/res/templates/cuda/Dockerfile.cuda index 4b9458b..0ff21d1 100644 --- a/res/templates/cuda/Dockerfile.cuda +++ b/res/templates/cuda/Dockerfile.cuda @@ -74,6 +74,4 @@ USER $NB_UID COPY requirements.txt /tmp/ RUN mamba run -n python3 pip install -r /tmp/requirements.txt \ - && mamba clean --all -f -y \ - && fix-permissions $CONDA_DIR \ - && fix-permissions /home/$NB_USER \ No newline at end of file + && mamba clean --all -f -y \ No newline at end of file From cb9bcf471551dbd0f3a4b186ab02b339a45b8568 Mon Sep 17 00:00:00 2001 From: Rasmus Munk Date: Tue, 13 Feb 2024 20:00:22 +0100 Subject: [PATCH 12/19] Remove redundant permission calls --- hpc-ocean-notebook/Dockerfile.j2 | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/hpc-ocean-notebook/Dockerfile.j2 b/hpc-ocean-notebook/Dockerfile.j2 index 27907f6..3f8aed9 100755 --- a/hpc-ocean-notebook/Dockerfile.j2 +++ b/hpc-ocean-notebook/Dockerfile.j2 @@ -20,9 +20,7 @@ USER $NB_UID COPY requirements.txt /tmp/ RUN mamba run -n python3 pip install -r requirements.txt \ - && mamba clean -y --all \ - && fix-permissions $CONDA_DIR \ - && fix-permissions /home/$NB_USER + && mamba clean -y --all WORKDIR "${HOME}" # As an exception, run as root, From fb5e4aa83297a55f74053962f5d7d0307adb8193 Mon Sep 17 00:00:00 2001 From: Rasmus Date: Tue, 27 Feb 2024 11:58:15 +0100 Subject: [PATCH 13/19] Update README.rst --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 74e07ce..43eca5b 100755 --- a/README.rst +++ b/README.rst @@ -17,7 +17,7 @@ To ensure that the nessesary libraries are installed to generate the Notebooks, and install the associated requiremnets:: username@hostname:~/jupyter/nbi-jupyter-docker-stacks$ python3 -m virtualenv venv - username@hostname:~/jupyter/nbi-jupyter-docker-stacks$ source venv + username@hostname:~/jupyter/nbi-jupyter-docker-stacks$ source venv/bin/activate (venv) username@hostname:~/jupyter/nbi-jupyter-docker-stacks$ pip install -r requirements.txt Afterwards, you should now be able to use the ``init-notebooks.py`` script to generate template and render the Jinja2 template files:: From 4521e7711f5128732ff17ec547f59354ac3e7186 Mon Sep 17 00:00:00 2001 From: Rasmus Date: Tue, 27 Feb 2024 12:01:21 +0100 Subject: [PATCH 14/19] Update README.rst --- README.rst | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index 43eca5b..c08c09c 100755 --- a/README.rst +++ b/README.rst @@ -13,7 +13,13 @@ Getting Started Before any of the images can be built, the Dockerfiles for each Notebook has to be generated first. The reason for this is that by default each notebook defined by a `Jinja2 `__ template. -To ensure that the nessesary libraries are installed to generate the Notebooks, we recommend that you create a virtual environment +This entire process can also be simplified by simply executing ``make`` in the root directory, which will create an initial Python virtual environment and use the current `architecture.yml` file setup to generate the Dockerfiles and the associated GOCD configuration:: + + make + +Alternatively, you can also setup the environment manually with the following steps. + +To start with, you should ensure that the nessesary libraries are installed to generate the Notebooks, we recommend that you create a virtual environment and install the associated requiremnets:: username@hostname:~/jupyter/nbi-jupyter-docker-stacks$ python3 -m virtualenv venv @@ -44,10 +50,6 @@ pipelines as part of the UCPH CI/CD infrastructure. The Notebooks and the associated GOCD configuration file are generated based on the definitions specified in the ``architecture.yml`` file. -This entire process can also be simplified by simply executing ``make`` in the root directory, which will create an initial Python virtual environment and use the current `architecture.yml` file setup to generate the Dockerfiles and the associated GOCD configuration:: - - make - -------- Building -------- From 4a23d1c43772d1e90a4d174969a03f69cdf89755 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 20 Mar 2024 16:59:07 +0000 Subject: [PATCH 15/19] Bump black from 22.3.0 to 24.3.0 Bumps [black](https://github.com/psf/black) from 22.3.0 to 24.3.0. - [Release notes](https://github.com/psf/black/releases) - [Changelog](https://github.com/psf/black/blob/main/CHANGES.md) - [Commits](https://github.com/psf/black/compare/22.3.0...24.3.0) --- updated-dependencies: - dependency-name: black dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- requirements-dev.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index 4f5ee86..ed07c5a 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,4 +1,4 @@ -black==22.3.0 +black==24.3.0 black[jupyter]==22.3.0 docutils==0.18.1 flake8==4.0.1 \ No newline at end of file From 4bda1bbc2e2525521143bcb69e3fb890e3149913 Mon Sep 17 00:00:00 2001 From: Rasmus Date: Wed, 27 Mar 2024 18:22:38 +0100 Subject: [PATCH 16/19] Update requirements-dev.txt --- requirements-dev.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/requirements-dev.txt b/requirements-dev.txt index ed07c5a..b3435e1 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -1,4 +1,4 @@ black==24.3.0 -black[jupyter]==22.3.0 +black[jupyter]==24.3.0 docutils==0.18.1 -flake8==4.0.1 \ No newline at end of file +flake8==4.0.1 From 56eef561844061a63a92948fff87cab9f9a5a3d8 Mon Sep 17 00:00:00 2001 From: Rasmus Munk Date: Fri, 12 Apr 2024 13:46:20 +0200 Subject: [PATCH 17/19] Merge dev branch to bump jupyterlab version 4.1.5, OpenMPI to 5.0.2 and Nvidia HPC SDK to 24.3 --- 1.gocd.yml | 228 +++++++++--------- architecture.yml | 145 +++++------ base-notebook/Dockerfile.j2 | 6 +- base-notebook/tests/requirements.txt | 6 +- bio-bigdata-notebook/tests/requirements.txt | 6 +- bio-bsa-notebook/tests/requirements.txt | 6 +- bio-notebook/Dockerfile.j2 | 12 +- bio-notebook/requirements.txt | 1 + bio-notebook/tests/requirements.txt | 6 +- cern-notebook/tests/notebooks/root.ipynb | 4 +- cern-notebook/tests/requirements.txt | 6 +- chemistry-notebook/Dockerfile.j2 | 2 +- chemistry-notebook/tests/requirements.txt | 6 +- datascience-notebook/Dockerfile.j2 | 2 +- datascience-notebook/requirements.txt | 5 +- .../tests/notebooks/pomegrante.ipynb | 8 +- datascience-notebook/tests/requirements.txt | 6 +- fenics-notebook/Dockerfile.j2 | 15 +- fenics-notebook/requirements.txt | 4 +- fenics-notebook/tests/notebooks/fenics.ipynb | 5 +- fenics-notebook/tests/requirements.txt | 6 +- fenics-notebook/tests/test_notebook.py | 10 +- geo-notebook/Dockerfile.j2 | 2 +- geo-notebook/environment.yml | 3 +- geo-notebook/tests/notebooks/rioxarray.ipynb | 14 +- geo-notebook/tests/requirements.txt | 6 +- gpu-notebook/Dockerfile.j2 | 2 +- gpu-notebook/requirements.txt | 5 +- gpu-notebook/tests/notebooks/lightgbm.ipynb | 5 +- gpu-notebook/tests/requirements.txt | 6 +- hpc-gpu-notebook/Dockerfile.j2 | 4 +- hpc-gpu-notebook/requirements.txt | 2 +- hpc-gpu-notebook/tests/requirements.txt | 6 +- hpc-notebook/Dockerfile.j2 | 2 +- hpc-notebook/requirements.txt | 6 +- hpc-notebook/tests/requirements.txt | 6 +- hpc-ocean-notebook/requirements.txt | 4 +- hpc-ocean-notebook/tests/requirements.txt | 6 +- julia-notebook/tests/requirements.txt | 6 +- jwst-notebook/Dockerfile.j2 | 15 +- jwst-notebook/environment.yml | 3 +- jwst-notebook/requirements.txt | 12 +- .../tests/notebooks/pomegrante.ipynb | 8 +- jwst-notebook/tests/requirements.txt | 6 +- ocean-notebook/tests/requirements.txt | 6 +- python-cuda-notebook/requirements.txt | 2 +- python-cuda-notebook/tests/requirements.txt | 6 +- python-notebook/Dockerfile.j2 | 2 +- python-notebook/environment.yml | 4 +- python-notebook/tests/requirements.txt | 6 +- qsharp-notebook/tests/requirements.txt | 6 +- r-notebook/Dockerfile.j2 | 18 +- r-notebook/environment.yml | 4 +- r-notebook/tests/requirements.txt | 6 +- res/templates/cuda/Dockerfile.cuda | 17 +- res/templates/cuda/requirements.txt | 2 +- res/tests/requirements.txt | 6 +- slurm-notebook/Dockerfile.j2 | 2 +- slurm-notebook/tests/requirements.txt | 6 +- sme-notebook/Dockerfile.j2 | 2 +- sme-notebook/tests/requirements.txt | 6 +- statistics-notebook/Dockerfile.j2 | 2 +- statistics-notebook/requirements.txt | 1 + statistics-notebook/tests/requirements.txt | 6 +- tomography-notebook/Dockerfile.j2 | 2 +- tomography-notebook/requirements.txt | 1 + tomography-notebook/tests/requirements.txt | 6 +- 67 files changed, 390 insertions(+), 353 deletions(-) create mode 100644 bio-notebook/requirements.txt diff --git a/1.gocd.yml b/1.gocd.yml index 77fc614..fbd6900 100644 --- a/1.gocd.yml +++ b/1.gocd.yml @@ -5,58 +5,58 @@ environments: DOCKERHUB_USERNAME: '{{SECRET:[dockerhub][username]}}' pipelines: - base-notebook-latest - - base-notebook-4.0.12 + - base-notebook-4.1.5 - python-notebook-latest - - python-notebook-4.0.12 + - python-notebook-4.1.5 - statistics-notebook-latest - - statistics-notebook-4.0.12 + - statistics-notebook-4.1.5 - r-notebook-latest - - r-notebook-4.0.12 + - r-notebook-4.1.5 - slurm-notebook-latest - slurm-notebook-22.05.11 - - slurm-notebook-4.0.12 + - slurm-notebook-4.1.5 - python-cuda-notebook-latest - - python-cuda-notebook-4.0.12 + - python-cuda-notebook-4.1.5 - gpu-notebook-latest - - gpu-notebook-4.0.12 + - gpu-notebook-4.1.5 - datascience-notebook-latest - - datascience-notebook-4.0.12 + - datascience-notebook-4.1.5 - chemistry-notebook-latest - - chemistry-notebook-4.0.12 + - chemistry-notebook-4.1.5 - fenics-notebook-latest - - fenics-notebook-4.0.12 + - fenics-notebook-4.1.5 - qsharp-notebook-latest - - qsharp-notebook-4.0.12 + - qsharp-notebook-4.1.5 - hpc-notebook-latest - hpc-notebook-22.05.11 - - hpc-notebook-4.0.12 + - hpc-notebook-4.1.5 - hpc-ocean-notebook-latest - hpc-ocean-notebook-22.05.11 - - hpc-ocean-notebook-4.0.12 + - hpc-ocean-notebook-4.1.5 - hpc-gpu-notebook-latest - hpc-gpu-notebook-22.05.11 - - hpc-gpu-notebook-4.0.12 + - hpc-gpu-notebook-4.1.5 - ocean-notebook-latest - - ocean-notebook-4.0.12 + - ocean-notebook-4.1.5 - geo-notebook-latest - - geo-notebook-4.0.12 + - geo-notebook-4.1.5 - bio-notebook-latest - - bio-notebook-4.0.12 + - bio-notebook-4.1.5 - bio-bigdata-notebook-latest - - bio-bigdata-notebook-4.0.12 + - bio-bigdata-notebook-4.1.5 - bio-bsa-notebook-latest - - bio-bsa-notebook-4.0.12 + - bio-bsa-notebook-4.1.5 - sme-notebook-latest - - sme-notebook-4.0.12 + - sme-notebook-4.1.5 - jwst-notebook-latest - - jwst-notebook-4.0.12 + - jwst-notebook-4.1.5 - julia-notebook-latest - - julia-notebook-4.0.12 + - julia-notebook-4.1.5 - cern-notebook-latest - - cern-notebook-4.0.12 + - cern-notebook-4.1.5 format_version: 10 pipelines: - base-notebook-4.0.12: + base-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -75,10 +75,10 @@ pipelines: parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: base-notebook - NOTEBOOK_PIPELINE: base-notebook-4.0.12 + NOTEBOOK_PIPELINE: base-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -114,7 +114,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - bio-bigdata-notebook-4.0.12: + bio-bigdata-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -131,15 +131,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_bio-bigdata-notebook: - pipeline: r-notebook-4.0.12 + pipeline: r-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: bio-bigdata-notebook - NOTEBOOK_PIPELINE: bio-bigdata-notebook-4.0.12 + NOTEBOOK_PIPELINE: bio-bigdata-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -176,7 +176,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - bio-bsa-notebook-4.0.12: + bio-bsa-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -193,15 +193,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_bio-bsa-notebook: - pipeline: r-notebook-4.0.12 + pipeline: r-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: bio-bsa-notebook - NOTEBOOK_PIPELINE: bio-bsa-notebook-4.0.12 + NOTEBOOK_PIPELINE: bio-bsa-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -238,7 +238,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - bio-notebook-4.0.12: + bio-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -255,15 +255,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_bio-notebook: - pipeline: r-notebook-4.0.12 + pipeline: r-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: bio-notebook - NOTEBOOK_PIPELINE: bio-notebook-4.0.12 + NOTEBOOK_PIPELINE: bio-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -300,7 +300,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - cern-notebook-4.0.12: + cern-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -317,15 +317,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_cern-notebook: - pipeline: datascience-notebook-4.0.12 + pipeline: datascience-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: cern-notebook - NOTEBOOK_PIPELINE: cern-notebook-4.0.12 + NOTEBOOK_PIPELINE: cern-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -362,7 +362,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - chemistry-notebook-4.0.12: + chemistry-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -379,15 +379,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_chemistry-notebook: - pipeline: base-notebook-4.0.12 + pipeline: base-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: chemistry-notebook - NOTEBOOK_PIPELINE: chemistry-notebook-4.0.12 + NOTEBOOK_PIPELINE: chemistry-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -424,7 +424,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - datascience-notebook-4.0.12: + datascience-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -441,15 +441,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_datascience-notebook: - pipeline: python-notebook-4.0.12 + pipeline: python-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: datascience-notebook - NOTEBOOK_PIPELINE: datascience-notebook-4.0.12 + NOTEBOOK_PIPELINE: datascience-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -486,7 +486,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - fenics-notebook-4.0.12: + fenics-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -503,15 +503,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_fenics-notebook: - pipeline: python-notebook-4.0.12 + pipeline: python-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: fenics-notebook - NOTEBOOK_PIPELINE: fenics-notebook-4.0.12 + NOTEBOOK_PIPELINE: fenics-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -548,7 +548,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - geo-notebook-4.0.12: + geo-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -565,15 +565,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_geo-notebook: - pipeline: python-notebook-4.0.12 + pipeline: python-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: geo-notebook - NOTEBOOK_PIPELINE: geo-notebook-4.0.12 + NOTEBOOK_PIPELINE: geo-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -610,7 +610,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - gpu-notebook-4.0.12: + gpu-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -627,15 +627,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_gpu-notebook: - pipeline: python-cuda-notebook-4.0.12 + pipeline: python-cuda-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: gpu-notebook - NOTEBOOK_PIPELINE: gpu-notebook-4.0.12 + NOTEBOOK_PIPELINE: gpu-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -703,7 +703,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - hpc-gpu-notebook-4.0.12: + hpc-gpu-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -720,15 +720,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_hpc-gpu-notebook: - pipeline: hpc-notebook-4.0.12 + pipeline: hpc-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: hpc-gpu-notebook - NOTEBOOK_PIPELINE: hpc-gpu-notebook-4.0.12 + NOTEBOOK_PIPELINE: hpc-gpu-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -796,7 +796,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - hpc-notebook-4.0.12: + hpc-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -813,15 +813,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_hpc-notebook: - pipeline: slurm-notebook-4.0.12 + pipeline: slurm-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: hpc-notebook - NOTEBOOK_PIPELINE: hpc-notebook-4.0.12 + NOTEBOOK_PIPELINE: hpc-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -889,7 +889,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - hpc-ocean-notebook-4.0.12: + hpc-ocean-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -906,15 +906,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_hpc-ocean-notebook: - pipeline: slurm-notebook-4.0.12 + pipeline: slurm-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: hpc-ocean-notebook - NOTEBOOK_PIPELINE: hpc-ocean-notebook-4.0.12 + NOTEBOOK_PIPELINE: hpc-ocean-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -951,7 +951,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - julia-notebook-4.0.12: + julia-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -968,15 +968,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_julia-notebook: - pipeline: base-notebook-4.0.12 + pipeline: base-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: julia-notebook - NOTEBOOK_PIPELINE: julia-notebook-4.0.12 + NOTEBOOK_PIPELINE: julia-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -1013,7 +1013,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - jwst-notebook-4.0.12: + jwst-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -1030,15 +1030,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_jwst-notebook: - pipeline: python-notebook-4.0.12 + pipeline: python-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: jwst-notebook - NOTEBOOK_PIPELINE: jwst-notebook-4.0.12 + NOTEBOOK_PIPELINE: jwst-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -1075,7 +1075,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - ocean-notebook-4.0.12: + ocean-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -1092,15 +1092,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_ocean-notebook: - pipeline: datascience-notebook-4.0.12 + pipeline: datascience-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: ocean-notebook - NOTEBOOK_PIPELINE: ocean-notebook-4.0.12 + NOTEBOOK_PIPELINE: ocean-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -1137,7 +1137,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - python-cuda-notebook-4.0.12: + python-cuda-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -1154,15 +1154,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_python-cuda-notebook: - pipeline: python-notebook-4.0.12 + pipeline: python-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: python-cuda-notebook - NOTEBOOK_PIPELINE: python-cuda-notebook-4.0.12 + NOTEBOOK_PIPELINE: python-cuda-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -1199,7 +1199,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - python-notebook-4.0.12: + python-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -1216,15 +1216,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_python-notebook: - pipeline: base-notebook-4.0.12 + pipeline: base-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: python-notebook - NOTEBOOK_PIPELINE: python-notebook-4.0.12 + NOTEBOOK_PIPELINE: python-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -1261,7 +1261,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - qsharp-notebook-4.0.12: + qsharp-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -1278,15 +1278,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_qsharp-notebook: - pipeline: python-notebook-4.0.12 + pipeline: python-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: qsharp-notebook - NOTEBOOK_PIPELINE: qsharp-notebook-4.0.12 + NOTEBOOK_PIPELINE: qsharp-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -1323,7 +1323,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - r-notebook-4.0.12: + r-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -1340,15 +1340,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_r-notebook: - pipeline: python-notebook-4.0.12 + pipeline: python-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: r-notebook - NOTEBOOK_PIPELINE: r-notebook-4.0.12 + NOTEBOOK_PIPELINE: r-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -1416,7 +1416,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - slurm-notebook-4.0.12: + slurm-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -1433,15 +1433,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_slurm-notebook: - pipeline: python-notebook-4.0.12 + pipeline: python-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: slurm-notebook - NOTEBOOK_PIPELINE: slurm-notebook-4.0.12 + NOTEBOOK_PIPELINE: slurm-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -1478,7 +1478,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - sme-notebook-4.0.12: + sme-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -1495,15 +1495,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_sme-notebook: - pipeline: base-notebook-4.0.12 + pipeline: base-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: sme-notebook - NOTEBOOK_PIPELINE: sme-notebook-4.0.12 + NOTEBOOK_PIPELINE: sme-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks @@ -1540,7 +1540,7 @@ pipelines: TEST_DIRECTORY: nbi-jupyter-docker-stacks template: notebook_image timer: *id001 - statistics-notebook-4.0.12: + statistics-notebook-4.1.5: display_order: -1 group: notebook_image label_template: ${COUNT} @@ -1557,15 +1557,15 @@ pipelines: destination: nbi-jupyter-docker-stacks git: https://github.com/ucphhpc/nbi-jupyter-docker-stacks.git upstream_statistics-notebook: - pipeline: python-notebook-4.0.12 + pipeline: python-notebook-4.1.5 stage: push parameters: ARGS: '' COMMIT_TAG: GO_REVISION_UCPHHPC_IMAGES - DEFAULT_TAG: 4.0.12 + DEFAULT_TAG: 4.1.5 EXTRA_TAG: '' NOTEBOOK: statistics-notebook - NOTEBOOK_PIPELINE: statistics-notebook-4.0.12 + NOTEBOOK_PIPELINE: statistics-notebook-4.1.5 PUSH_DIRECTORY: publish-docker-scripts SRC_DIRECTORY: nbi-jupyter-docker-stacks TEST_DIRECTORY: nbi-jupyter-docker-stacks diff --git a/architecture.yml b/architecture.yml index 6c97213..e92ad6a 100644 --- a/architecture.yml +++ b/architecture.yml @@ -5,13 +5,13 @@ architecture: parent: owner: quay.io/jupyter image: base-notebook - tag: lab-4.0.12 + tag: lab-4.1.5 pipeline_dependent: false - 4.0.12: + 4.1.5: parent: owner: quay.io/jupyter image: base-notebook - tag: lab-4.0.12 + tag: lab-4.1.5 pipeline_dependent: false python-notebook: latest: @@ -20,11 +20,11 @@ architecture: image: base-notebook tag: latest pipeline_dependent: true - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: base-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true statistics-notebook: latest: @@ -33,11 +33,11 @@ architecture: image: python-notebook tag: latest pipeline_dependent: true - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: python-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true r-notebook: latest: @@ -46,11 +46,11 @@ architecture: image: python-notebook tag: latest pipeline_dependent: true - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: python-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true slurm-notebook: latest: @@ -62,9 +62,9 @@ architecture: parameters: SLURM_VERSION: 22.05.11 SLURM_DOWNLOAD_MD5: 44647df647e63dfbfc07dc4d35c3262e - OPENMPI_MAJOR_VERSION: 4.1 - OPENMPI_MINOR_VERSION: 6 - OPENMPI_DOWNLOAD_MD5: c9b1c974cfc23c77c0fbdb965cd58a1c + OPENMPI_MAJOR_VERSION: 5.0 + OPENMPI_MINOR_VERSION: 2 + OPENMPI_DOWNLOAD_MD5: 047ea0985b79d30d5a24ee72cbf5f4bf 22.05.11: parent: owner: ucphhpc @@ -74,21 +74,21 @@ architecture: parameters: SLURM_VERSION: 22.05.11 SLURM_DOWNLOAD_MD5: 44647df647e63dfbfc07dc4d35c3262e - OPENMPI_MAJOR_VERSION: 4.1 - OPENMPI_MINOR_VERSION: 6 - OPENMPI_DOWNLOAD_MD5: c9b1c974cfc23c77c0fbdb965cd58a1c - 4.0.12: + OPENMPI_MAJOR_VERSION: 5.0 + OPENMPI_MINOR_VERSION: 2 + OPENMPI_DOWNLOAD_MD5: 047ea0985b79d30d5a24ee72cbf5f4bf + 4.1.5: parent: owner: ucphhpc image: python-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true parameters: SLURM_VERSION: 22.05.11 SLURM_DOWNLOAD_MD5: 44647df647e63dfbfc07dc4d35c3262e - OPENMPI_MAJOR_VERSION: 4.1 - OPENMPI_MINOR_VERSION: 6 - OPENMPI_DOWNLOAD_MD5: c9b1c974cfc23c77c0fbdb965cd58a1c + OPENMPI_MAJOR_VERSION: 5.0 + OPENMPI_MINOR_VERSION: 2 + OPENMPI_DOWNLOAD_MD5: 047ea0985b79d30d5a24ee72cbf5f4bf python-cuda-notebook: latest: parent: @@ -99,11 +99,11 @@ architecture: extra_template: res/templates/cuda/Dockerfile.cuda extra_template_files: - res/templates/cuda/requirements.txt - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: python-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true extra_template: res/templates/cuda/Dockerfile.cuda extra_template_files: @@ -115,11 +115,11 @@ architecture: image: python-cuda-notebook tag: latest pipeline_dependent: true - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: python-cuda-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true datascience-notebook: latest: @@ -128,11 +128,11 @@ architecture: image: python-notebook tag: latest pipeline_dependent: true - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: python-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true chemistry-notebook: latest: @@ -141,11 +141,11 @@ architecture: image: base-notebook tag: latest pipeline_dependent: true - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: base-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true fenics-notebook: latest: @@ -154,11 +154,11 @@ architecture: image: python-notebook tag: latest pipeline_dependent: true - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: python-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true qsharp-notebook: latest: @@ -167,11 +167,11 @@ architecture: image: python-notebook tag: latest pipeline_dependent: true - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: python-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true hpc-notebook: latest: @@ -186,11 +186,11 @@ architecture: image: slurm-notebook tag: 22.05.11 pipeline_dependent: true - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: slurm-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true hpc-ocean-notebook: latest: @@ -205,11 +205,11 @@ architecture: image: slurm-notebook tag: 22.05.11 pipeline_dependent: true - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: slurm-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true hpc-gpu-notebook: latest: @@ -221,11 +221,12 @@ architecture: parameters: nvhome: /opt/nvidia/hpc_sdk target: Linux_x86_64 - version: 22.2 - nvcudadir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/cuda" - nvcompdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/compilers" - nvmathdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/math_libs" - nvcommdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/comm_libs" + major_version: 24 + minor_version: 3 + nvcudadir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/cuda" + nvcompdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/compilers" + nvmathdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/math_libs" + nvcommdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/comm_libs" extra_template: res/templates/cuda/Dockerfile.cuda extra_template_files: - res/templates/cuda/requirements.txt @@ -238,28 +239,30 @@ architecture: parameters: nvhome: /opt/nvidia/hpc_sdk target: Linux_x86_64 - version: 22.2 - nvcudadir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/cuda" - nvcompdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/compilers" - nvmathdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/math_libs" - nvcommdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/comm_libs" + major_version: 24 + minor_version: 3 + nvcudadir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/cuda" + nvcompdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/compilers" + nvmathdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/math_libs" + nvcommdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/comm_libs" extra_template: res/templates/cuda/Dockerfile.cuda extra_template_files: - res/templates/cuda/requirements.txt - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: hpc-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true parameters: nvhome: /opt/nvidia/hpc_sdk target: Linux_x86_64 - version: 22.2 - nvcudadir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/cuda" - nvcompdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/compilers" - nvmathdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/math_libs" - nvcommdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/opt/nvidia/hpc_sdk/Linux_x86_64/22.2/comm_libs" + major_version: 24 + minor_version: 3 + nvcudadir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/cuda" + nvcompdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/compilers" + nvmathdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/math_libs" + nvcommdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/comm_libs" extra_template: res/templates/cuda/Dockerfile.cuda extra_template_files: - res/templates/cuda/requirements.txt @@ -270,11 +273,11 @@ architecture: image: datascience-notebook tag: latest pipeline_dependent: true - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: datascience-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true geo-notebook: latest: @@ -283,11 +286,11 @@ architecture: image: python-notebook tag: latest pipeline_dependent: true - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: python-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true bio-notebook: latest: @@ -296,11 +299,11 @@ architecture: image: r-notebook tag: latest pipeline_dependent: true - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: r-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true bio-bigdata-notebook: latest: @@ -309,11 +312,11 @@ architecture: image: r-notebook tag: latest pipeline_dependent: true - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: r-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true bio-bsa-notebook: latest: @@ -322,11 +325,11 @@ architecture: image: r-notebook tag: latest pipeline_dependent: true - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: r-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true sme-notebook: latest: @@ -335,11 +338,11 @@ architecture: image: base-notebook tag: latest pipeline_dependent: true - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: base-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true jwst-notebook: latest: @@ -348,11 +351,11 @@ architecture: image: python-notebook tag: latest pipeline_dependent: true - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: python-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true julia-notebook: latest: @@ -365,11 +368,11 @@ architecture: JULIA_MAJOR_VERSION: "1.10" JULIA_MINOR_VERSION: "0" JULIA_DOWNLOAD_MD5: c16f16304cac9af1501ae71c02cb4d1e - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: base-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true parameters: JULIA_MAJOR_VERSION: "1.10" @@ -382,9 +385,9 @@ architecture: image: datascience-notebook tag: latest pipeline_dependent: true - 4.0.12: + 4.1.5: parent: owner: ucphhpc image: datascience-notebook - tag: 4.0.12 + tag: 4.1.5 pipeline_dependent: true diff --git a/base-notebook/Dockerfile.j2 b/base-notebook/Dockerfile.j2 index f55bafb..e543b78 100644 --- a/base-notebook/Dockerfile.j2 +++ b/base-notebook/Dockerfile.j2 @@ -67,7 +67,7 @@ RUN chown $NB_UID:$NB_GID -R /tmp /home/$NB_USER $CONDA_DIR USER $NB_UID WORKDIR /tmp -RUN mamba config --set remote_read_timeout_secs $PACKAGE_TIMEOUT +RUN conda config --set remote_read_timeout_secs $PACKAGE_TIMEOUT # Update mamba, npm, yarn RUN mamba update --quiet -n base conda \ @@ -122,8 +122,8 @@ RUN mamba run -n base pip3 install \ # Don't activate the base environment by default # This is instead set via the DEFAULT_CONDA_ENVIRONMENT environment variable -RUN mamba init \ - && mamba config --set auto_activate_base false +RUN conda init \ + && conda config --set auto_activate_base false # Disable the JupyterLab news announcements # https://jupyterlab.readthedocs.io/en/stable/privacy_policies.html diff --git a/base-notebook/tests/requirements.txt b/base-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/base-notebook/tests/requirements.txt +++ b/base-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/bio-bigdata-notebook/tests/requirements.txt b/bio-bigdata-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/bio-bigdata-notebook/tests/requirements.txt +++ b/bio-bigdata-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/bio-bsa-notebook/tests/requirements.txt b/bio-bsa-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/bio-bsa-notebook/tests/requirements.txt +++ b/bio-bsa-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/bio-notebook/Dockerfile.j2 b/bio-notebook/Dockerfile.j2 index 0ec96ca..31f86e0 100755 --- a/bio-notebook/Dockerfile.j2 +++ b/bio-notebook/Dockerfile.j2 @@ -20,7 +20,7 @@ WORKDIR /tmp USER $NB_UID -RUN mamba config --set remote_read_timeout_secs $PACKAGE_TIMEOUT +RUN conda config --set remote_read_timeout_secs $PACKAGE_TIMEOUT # Standard CRAN packages, etc. RUN mamba install -qy -n r \ @@ -66,6 +66,9 @@ RUN mamba install -qy -n r \ # NOTE: install BioConductor packages requested e.g. in erda ticket #18198 and #25320 ## BioConductor packages, etc. +# Removed 'cutadapt' via conda for now and moved it to pypi installation +# via the requirements.txt file. This is because the current version does not support +# Python 3.11 (https://bioconda.github.io/recipes/cutadapt/README.html) RUN mamba install -qy -c bioconda -n r \ 'r-phytools' \ 'bioconductor-deseq2' \ @@ -90,7 +93,6 @@ RUN mamba install -qy -c bioconda -n r \ 'bioconductor-camera' \ 'bioconductor-pcamethods' \ 'bioconductor-apeglm' \ - 'cutadapt' \ 'mafft' \ 'fasttree' \ && mamba clean --all -f -y \ @@ -98,6 +100,12 @@ RUN mamba install -qy -c bioconda -n r \ && fix-permissions $CONDA_DIR \ && fix-permissions /home/$NB_USER +COPY requirements.txt /tmp/ +RUN mamba run -n r pip install -r requirements.txt \ + && mamba clean --all -f -y \ + && fix-permissions $CONDA_DIR \ + && fix-permissions /home/$NB_USER + ENV PATH="$R_PATH/bin:$PATH" # NOTE: install extras directly from github and CRAN as requested in erda ticket #18198 diff --git a/bio-notebook/requirements.txt b/bio-notebook/requirements.txt new file mode 100644 index 0000000..8ae48c3 --- /dev/null +++ b/bio-notebook/requirements.txt @@ -0,0 +1 @@ +cutadapt \ No newline at end of file diff --git a/bio-notebook/tests/requirements.txt b/bio-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/bio-notebook/tests/requirements.txt +++ b/bio-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/cern-notebook/tests/notebooks/root.ipynb b/cern-notebook/tests/notebooks/root.ipynb index 0aa4edd..9ede229 100644 --- a/cern-notebook/tests/notebooks/root.ipynb +++ b/cern-notebook/tests/notebooks/root.ipynb @@ -17,7 +17,7 @@ "metadata": {}, "outputs": [], "source": [ - "h = ROOT.TH1F(\"gauss\",\"Example histogram\",100,-4,4)\n", + "h = ROOT.TH1F(\"gauss\", \"Example histogram\", 100, -4, 4)\n", "h.FillRandom(\"gaus\")" ] }, @@ -28,7 +28,7 @@ "metadata": {}, "outputs": [], "source": [ - "c = ROOT.TCanvas(\"myCanvasName\",\"The Canvas Title\",800,600)\n", + "c = ROOT.TCanvas(\"myCanvasName\", \"The Canvas Title\", 800, 600)\n", "h.Draw()" ] }, diff --git a/cern-notebook/tests/requirements.txt b/cern-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100644 --- a/cern-notebook/tests/requirements.txt +++ b/cern-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/chemistry-notebook/Dockerfile.j2 b/chemistry-notebook/Dockerfile.j2 index 984831c..1c8e6b5 100755 --- a/chemistry-notebook/Dockerfile.j2 +++ b/chemistry-notebook/Dockerfile.j2 @@ -12,7 +12,7 @@ USER $NB_UID WORKDIR /tmp -RUN mamba config --set remote_read_timeout_secs $PACKAGE_TIMEOUT +RUN conda config --set remote_read_timeout_secs $PACKAGE_TIMEOUT ENV PYTHON3_PATH=$CONDA_DIR/envs/python3 # Install diffpy into python2 env diff --git a/chemistry-notebook/tests/requirements.txt b/chemistry-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/chemistry-notebook/tests/requirements.txt +++ b/chemistry-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/datascience-notebook/Dockerfile.j2 b/datascience-notebook/Dockerfile.j2 index 7ac0377..38e3c0b 100755 --- a/datascience-notebook/Dockerfile.j2 +++ b/datascience-notebook/Dockerfile.j2 @@ -39,7 +39,7 @@ WORKDIR /tmp USER $NB_UID -RUN mamba config --set remote_read_timeout_secs $PACKAGE_TIMEOUT +RUN conda config --set remote_read_timeout_secs $PACKAGE_TIMEOUT # Proj4 is required for cartopy COPY environment.yml /tmp/ diff --git a/datascience-notebook/requirements.txt b/datascience-notebook/requirements.txt index 1300147..681a925 100755 --- a/datascience-notebook/requirements.txt +++ b/datascience-notebook/requirements.txt @@ -9,8 +9,8 @@ graphviz h5py iminuit ipywidgets -jax==0.4.3 -jaxlib==0.4.3 +jax==0.4.26 +jaxlib==0.4.26 joblib lightgbm mlxtend @@ -23,6 +23,7 @@ numdifftools numpy opencv-python pandas +pyarrow pillow pims pomegranate diff --git a/datascience-notebook/tests/notebooks/pomegrante.ipynb b/datascience-notebook/tests/notebooks/pomegrante.ipynb index f3c9a30..c4dead7 100755 --- a/datascience-notebook/tests/notebooks/pomegrante.ipynb +++ b/datascience-notebook/tests/notebooks/pomegrante.ipynb @@ -7,7 +7,9 @@ "outputs": [], "source": [ "# From https://pomegranate.readthedocs.io/en/latest/tutorials/B_Model_Tutorial_6_Bayesian_Networks.html\n", - "import seaborn; seaborn.set_style('whitegrid')\n", + "import seaborn\n", + "\n", + "seaborn.set_style(\"whitegrid\")\n", "import torch\n", "import numpy" ] @@ -52,7 +54,7 @@ "metadata": {}, "outputs": [], "source": [ - "model.distributions[0].probs, X[:,0].mean()" + "model.distributions[0].probs, X[:, 0].mean()" ] }, { @@ -61,7 +63,7 @@ "metadata": {}, "outputs": [], "source": [ - "model.distributions[1].probs[0], (X[X[:,0] == 0][:,1]).mean()" + "model.distributions[1].probs[0], (X[X[:, 0] == 0][:, 1]).mean()" ] }, { diff --git a/datascience-notebook/tests/requirements.txt b/datascience-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/datascience-notebook/tests/requirements.txt +++ b/datascience-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/fenics-notebook/Dockerfile.j2 b/fenics-notebook/Dockerfile.j2 index 5170f20..8bd6cbd 100755 --- a/fenics-notebook/Dockerfile.j2 +++ b/fenics-notebook/Dockerfile.j2 @@ -21,37 +21,42 @@ USER $NB_UID ENV PKG_CONFIG_PATH=$PYTHON3_PATH/lib/pkgconfig -RUN mamba config --set remote_read_timeout_secs $PACKAGE_TIMEOUT +RUN conda config --set remote_read_timeout_secs $PACKAGE_TIMEOUT # Clone the python3 enviornment into fenicsx to enable the installation # of two seperate fenics installations, namely the old fenics and the new fenicsx -RUN mamba create --name fenicsx --clone python3 +RUN mamba create --name fenics +ENV FENICS_PATH=$CONDA_DIR/envs/fenics COPY environment.yml /tmp/ -RUN mamba env update -n python3 -f environment.yml \ +RUN mamba env update -n fenics -f environment.yml \ && mamba clean --all -f -y \ && fix-permissions $CONDA_DIR \ && fix-permissions /home/$NB_USER COPY requirements.txt /tmp/ -RUN mamba run -n python3 pip install -r requirements.txt \ +RUN mamba run -n fenics pip install -r requirements.txt \ && mamba clean --all -f -y \ && fix-permissions $CONDA_DIR \ && fix-permissions /home/$NB_USER +# Add the fenicsx kernel to Jupyter +RUN mamba run -n fenics python -m ipykernel install --user --name=fenics +RUN mamba create --name fenicsx ENV FENICSX_PATH=$CONDA_DIR/envs/fenicsx + COPY environment-fenicsx.yml /tmp/ RUN mamba env update -n fenicsx -f /tmp/environment-fenicsx.yml \ && mamba run -n fenicsx pip install -r requirements.txt \ && mamba clean --all -f -y \ && fix-permissions $CONDA_DIR \ && fix-permissions /home/$NB_USER - # Add the fenicsx kernel to Jupyter RUN mamba run -n fenicsx python -m ipykernel install --user --name=fenicsx # Ensure that the pkg config can be found in in the Jupyter kernels RUN mamba run -n python3 python3 /usr/local/bin/update_kernel_spec.py python3 --env-kwargs PATH=$PYTHON3_PATH/bin:$PATH \ + && mamba run -n fenics python3 /usr/local/bin/update_kernel_spec.py fenics --env-kwargs PATH=$FENICS_PATH/bin:$PATH \ && mamba run -n fenicsx python3 /usr/local/bin/update_kernel_spec.py fenicsx --env-kwargs PATH=$FENICSX_PATH/bin:$PATH WORKDIR "${HOME}" diff --git a/fenics-notebook/requirements.txt b/fenics-notebook/requirements.txt index 5248045..922b9cb 100755 --- a/fenics-notebook/requirements.txt +++ b/fenics-notebook/requirements.txt @@ -1,2 +1,4 @@ gmsh -pygmsh \ No newline at end of file +pygmsh +matplotlib +ipykernel \ No newline at end of file diff --git a/fenics-notebook/tests/notebooks/fenics.ipynb b/fenics-notebook/tests/notebooks/fenics.ipynb index bce556f..4be08b3 100755 --- a/fenics-notebook/tests/notebooks/fenics.ipynb +++ b/fenics-notebook/tests/notebooks/fenics.ipynb @@ -6,7 +6,7 @@ "metadata": {}, "outputs": [], "source": [ - "import fenics" + "from fenics import *" ] }, { @@ -24,7 +24,7 @@ }, { "data": { - "image/png": "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\n", + "image/png": "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", "text/plain": [ "
" ] @@ -37,7 +37,6 @@ ], "source": [ "from __future__ import print_function\n", - "from fenics import *\n", "import matplotlib.pyplot as plt\n", "\n", "# Create mesh and define function space\n", diff --git a/fenics-notebook/tests/requirements.txt b/fenics-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/fenics-notebook/tests/requirements.txt +++ b/fenics-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/fenics-notebook/tests/test_notebook.py b/fenics-notebook/tests/test_notebook.py index 29aab0d..0876e85 100755 --- a/fenics-notebook/tests/test_notebook.py +++ b/fenics-notebook/tests/test_notebook.py @@ -5,7 +5,6 @@ cur_path = os.path.abspath(".") notebooks_path = os.path.join(cur_path, "notebooks") -kernels = ["python3"] def _notebook_run(path, kernel="python3", timeout=300): @@ -45,8 +44,13 @@ def _notebook_run(path, kernel="python3", timeout=300): def test_notebooks(): for f_notebook in os.listdir(notebooks_path): - for kernel in kernels: + if f_notebook.startswith("fenics"): _, errors = _notebook_run( - os.path.join(notebooks_path, f_notebook), kernel=kernel + os.path.join(notebooks_path, f_notebook), kernel="fenics" + ) + assert errors == [] + if f_notebook.startswith("fenicsx"): + _, errors = _notebook_run( + os.path.join(notebooks_path, f_notebook), kernel="fenicsx" ) assert errors == [] diff --git a/geo-notebook/Dockerfile.j2 b/geo-notebook/Dockerfile.j2 index 2f76002..9f06549 100755 --- a/geo-notebook/Dockerfile.j2 +++ b/geo-notebook/Dockerfile.j2 @@ -12,7 +12,7 @@ WORKDIR /tmp USER $NB_UID -RUN mamba config --set remote_read_timeout_secs $PACKAGE_TIMEOUT +RUN conda config --set remote_read_timeout_secs $PACKAGE_TIMEOUT # Python3: use mamba since several geo packages are only packaged there COPY environment.yml /tmp/ diff --git a/geo-notebook/environment.yml b/geo-notebook/environment.yml index 592795c..c95d9ed 100755 --- a/geo-notebook/environment.yml +++ b/geo-notebook/environment.yml @@ -18,7 +18,7 @@ dependencies: - datashader - distributed - eofs - - esmpy<8.4 + - esmpy - fastparquet - flake8 - gdal @@ -43,6 +43,7 @@ dependencies: - numpy - palettable - pandas + - pyarrow - panel - plotly - python-blosc diff --git a/geo-notebook/tests/notebooks/rioxarray.ipynb b/geo-notebook/tests/notebooks/rioxarray.ipynb index 810ab11..8afcce8 100644 --- a/geo-notebook/tests/notebooks/rioxarray.ipynb +++ b/geo-notebook/tests/notebooks/rioxarray.ipynb @@ -16,12 +16,16 @@ "metadata": {}, "outputs": [], "source": [ - "\n", - "fname = 'https://sid.erda.dk/share_redirect/D67kSJ8fSX/Optical/greenland-modis-median-julyaugust-250m-jpg.tif'\n", + "fname = \"https://sid.erda.dk/share_redirect/D67kSJ8fSX/Optical/greenland-modis-median-julyaugust-250m-jpg.tif\"\n", "greenland = rio.open_rasterio(fname, masked=True)\n", - "greenland = greenland.coarsen(x=10, boundary='trim').mean().coarsen(y=10, boundary='trim').mean() # downsample to make plotting faster\n", - "(greenland/255).plot.imshow()\n", - "plt.axis('equal')" + "greenland = (\n", + " greenland.coarsen(x=10, boundary=\"trim\")\n", + " .mean()\n", + " .coarsen(y=10, boundary=\"trim\")\n", + " .mean()\n", + ") # downsample to make plotting faster\n", + "(greenland / 255).plot.imshow()\n", + "plt.axis(\"equal\")" ] } ], diff --git a/geo-notebook/tests/requirements.txt b/geo-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/geo-notebook/tests/requirements.txt +++ b/geo-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/gpu-notebook/Dockerfile.j2 b/gpu-notebook/Dockerfile.j2 index 84c41f4..d8e969b 100755 --- a/gpu-notebook/Dockerfile.j2 +++ b/gpu-notebook/Dockerfile.j2 @@ -19,7 +19,7 @@ WORKDIR /tmp USER $NB_UID -RUN mamba config --set remote_read_timeout_secs $PACKAGE_TIMEOUT +RUN conda config --set remote_read_timeout_secs $PACKAGE_TIMEOUT # Packages COPY requirements.txt /tmp/requirements.txt diff --git a/gpu-notebook/requirements.txt b/gpu-notebook/requirements.txt index ab43898..e082a78 100755 --- a/gpu-notebook/requirements.txt +++ b/gpu-notebook/requirements.txt @@ -7,8 +7,8 @@ datashader graphviz h5py git+https://github.com/scikit-learn-contrib/hdbscan -jax==0.4.3 -jaxlib==0.4.3 +jax==0.4.26 +jaxlib==0.4.26 joblib lightgbm mlxtend @@ -21,6 +21,7 @@ numba numdifftools opencv-python pandas +pyarrow pillow pims pomegranate diff --git a/gpu-notebook/tests/notebooks/lightgbm.ipynb b/gpu-notebook/tests/notebooks/lightgbm.ipynb index dd99441..b9d75db 100755 --- a/gpu-notebook/tests/notebooks/lightgbm.ipynb +++ b/gpu-notebook/tests/notebooks/lightgbm.ipynb @@ -42,7 +42,10 @@ "print(\"Starting training...\")\n", "# train\n", "gbm = lgb.train(\n", - " params, lgb_train, num_boost_round=20, valid_sets=lgb_eval,\n", + " params,\n", + " lgb_train,\n", + " num_boost_round=20,\n", + " valid_sets=lgb_eval,\n", ")\n", "\n", "print(\"Saving model...\")\n", diff --git a/gpu-notebook/tests/requirements.txt b/gpu-notebook/tests/requirements.txt index 580d750..c6b1dff 100755 --- a/gpu-notebook/tests/requirements.txt +++ b/gpu-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 \ No newline at end of file +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 \ No newline at end of file diff --git a/hpc-gpu-notebook/Dockerfile.j2 b/hpc-gpu-notebook/Dockerfile.j2 index a60f211..8d2e440 100644 --- a/hpc-gpu-notebook/Dockerfile.j2 +++ b/hpc-gpu-notebook/Dockerfile.j2 @@ -12,13 +12,13 @@ USER root RUN echo 'deb [trusted=yes] https://developer.download.nvidia.com/hpc-sdk/ubuntu/amd64 /' | tee /etc/apt/sources.list.d/nvhpc.list \ && apt-get update \ && apt-get install -y --no-install-recommends \ - nvhpc-22-2-cuda-multi \ + nvhpc-{{ version_major }}-{{ version_minor }}-cuda-multi \ && apt-get clean \ && rm -fr /var/lib/apt/lists/* # Setup the Nvidia HPC Compiler environment vars ENV NVHPC="{{ nvhome }}" -ENV NVHPC_ROOT="{{ nvhome }}/{{ target }}/{{ version }}" +ENV NVHPC_ROOT="{{ nvhome }}/{{ target }}/{{ version_major }}.{{ version_minor }}" ENV PATH="{{ nvcompdir }}/extras/qd/bin:{{ nvcompdir }}/bin:{{ nvcudadir }}/bin:$PATH" ENV LD_LIBRARY_PATH="{{ nvcommdir }}/nvshmem/lib:{{ nvcommdir }}/nccl/lib:{{ nvmathdir }}/lib64:{{ nvcompdir }}/lib:{{ nvcompdir }}/extras/qd/lib:{{ nvcudadir }}/extras/CUPTI/lib64:{{ nvcudadir }}/lib64" diff --git a/hpc-gpu-notebook/requirements.txt b/hpc-gpu-notebook/requirements.txt index 309d6bc..12eeb00 100644 --- a/hpc-gpu-notebook/requirements.txt +++ b/hpc-gpu-notebook/requirements.txt @@ -3,7 +3,7 @@ # Tensorflow > 2.10.0 has issues with the PATH setup that needs # cumbersome fixes. https://github.com/keras-team/keras/issues/17422 # Instead we pin to tensorflow 2.10.0 for now until they fix this. -tensorflow==2.11.1 +tensorflow==2.16.1 torch==2.0.0 torchvision==0.15.1 torchtext==0.15.1 diff --git a/hpc-gpu-notebook/tests/requirements.txt b/hpc-gpu-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/hpc-gpu-notebook/tests/requirements.txt +++ b/hpc-gpu-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/hpc-notebook/Dockerfile.j2 b/hpc-notebook/Dockerfile.j2 index 937960c..c323b34 100755 --- a/hpc-notebook/Dockerfile.j2 +++ b/hpc-notebook/Dockerfile.j2 @@ -60,7 +60,7 @@ RUN cat /etc/supervisor/hpc-supervisord.conf >> /etc/supervisor/supervisord.conf USER $NB_UID -RUN mamba config --set remote_read_timeout_secs $PACKAGE_TIMEOUT +RUN conda config --set remote_read_timeout_secs $PACKAGE_TIMEOUT COPY environment.yml /tmp/ RUN mamba env update -n python3 -f environment.yml \ diff --git a/hpc-notebook/requirements.txt b/hpc-notebook/requirements.txt index 2d0c961..2bbb638 100755 --- a/hpc-notebook/requirements.txt +++ b/hpc-notebook/requirements.txt @@ -1,4 +1,4 @@ h5py -jax==0.4.3 -jaxlib==0.4.3 -papermill \ No newline at end of file +jax==0.4.26 +jaxlib==0.4.26 +papermill diff --git a/hpc-notebook/tests/requirements.txt b/hpc-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/hpc-notebook/tests/requirements.txt +++ b/hpc-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/hpc-ocean-notebook/requirements.txt b/hpc-ocean-notebook/requirements.txt index c70374a..ccfb1b3 100755 --- a/hpc-ocean-notebook/requirements.txt +++ b/hpc-ocean-notebook/requirements.txt @@ -1,6 +1,6 @@ botorch -jax==0.4.3 -jaxlib==0.4.3 +jax==0.4.26 +jaxlib==0.4.26 netCDF4 numpy scipy diff --git a/hpc-ocean-notebook/tests/requirements.txt b/hpc-ocean-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/hpc-ocean-notebook/tests/requirements.txt +++ b/hpc-ocean-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/julia-notebook/tests/requirements.txt b/julia-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100644 --- a/julia-notebook/tests/requirements.txt +++ b/julia-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/jwst-notebook/Dockerfile.j2 b/jwst-notebook/Dockerfile.j2 index 0e88e49..3b743cd 100755 --- a/jwst-notebook/Dockerfile.j2 +++ b/jwst-notebook/Dockerfile.j2 @@ -42,7 +42,7 @@ WORKDIR /tmp USER $NB_UID -RUN mamba config --set remote_read_timeout_secs $PACKAGE_TIMEOUT +RUN conda config --set remote_read_timeout_secs $PACKAGE_TIMEOUT # Proj4 is required for cartopy COPY environment.yml /tmp/ @@ -60,7 +60,7 @@ RUN mamba run -n python3 pip install -r requirements.txt RUN git clone https://github.com/gbrammer/grizli.git WORKDIR /tmp/grizli -RUN git checkout tags/1.7 +RUN git checkout tags/1.11.2 RUN mamba env update -n python3 -f environment.yml \ && mamba clean --all -f -y \ && fix-permissions $CONDA_DIR \ @@ -78,25 +78,19 @@ RUN mamba run -n python3 pip install . -r requirements.txt WORKDIR /tmp/ # Conda install hstcal -RUN mamba config --add channels http://ssb.stsci.edu/astroconda -RUN mamba config --add channels conda-forge +RUN conda config --add channels http://ssb.stsci.edu/astroconda +RUN conda config --add channels conda-forge RUN mamba install -n python3 hstcal \ && mamba clean --all -f -y \ && fix-permissions $CONDA_DIR \ && fix-permissions /home/$NB_USER # Patch for photutils / drizzlepac -COPY photutils.patch /tmp/ RUN mamba run -n python3 pip install drizzlepac photutils --upgrade \ && mamba clean --all -f -y \ && fix-permissions $CONDA_DIR \ && fix-permissions /home/$NB_USER -RUN mamba run -n python3 python /tmp/photutils.patch \ - && mamba clean --all -f -y \ - && fix-permissions $CONDA_DIR \ - && fix-permissions /home/$NB_USER - # JWST tools RUN mamba run -n python3 pip install jwst-backgrounds RUN mamba run -n python3 pip install jwst-gtvt @@ -105,6 +99,7 @@ RUN mamba run -n python3 pip install pandeia.engine # MIRAGE RUN mamba run -n python3 pip install mirage grismconf nircam_gsim +RUN mamba run -n python3 pip install shapely==1.8.5 WORKDIR "${HOME}" diff --git a/jwst-notebook/environment.yml b/jwst-notebook/environment.yml index 9eb31c8..164d4f2 100755 --- a/jwst-notebook/environment.yml +++ b/jwst-notebook/environment.yml @@ -1,3 +1,4 @@ name: jwst-notebook dependencies: - - proj4 \ No newline at end of file + - proj + - proj-data \ No newline at end of file diff --git a/jwst-notebook/requirements.txt b/jwst-notebook/requirements.txt index 67afc52..96eedf0 100755 --- a/jwst-notebook/requirements.txt +++ b/jwst-notebook/requirements.txt @@ -2,17 +2,17 @@ astropy git+https://github.com/fmfn/BayesianOptimization bokeh Bottleneck -cartopy==0.21.0 +cartopy cython datashader graphviz healpy h5py ipywidgets -jax==0.4.3 -jaxlib==0.4.3 +jax==0.4.26 +jaxlib==0.4.26 joblib -jwst==1.3.2 +jwst==1.14.0 lightgbm mlxtend nbconvert @@ -24,10 +24,12 @@ numdifftools numpy opencv-python pandas +pyarrow pillow pims pomegranate pydotplus +pyparsing pymc pyproj PyQt5 @@ -45,4 +47,4 @@ tqdm trackpy uncertainties xarray -xgboost \ No newline at end of file +xgboost diff --git a/jwst-notebook/tests/notebooks/pomegrante.ipynb b/jwst-notebook/tests/notebooks/pomegrante.ipynb index f3c9a30..c4dead7 100755 --- a/jwst-notebook/tests/notebooks/pomegrante.ipynb +++ b/jwst-notebook/tests/notebooks/pomegrante.ipynb @@ -7,7 +7,9 @@ "outputs": [], "source": [ "# From https://pomegranate.readthedocs.io/en/latest/tutorials/B_Model_Tutorial_6_Bayesian_Networks.html\n", - "import seaborn; seaborn.set_style('whitegrid')\n", + "import seaborn\n", + "\n", + "seaborn.set_style(\"whitegrid\")\n", "import torch\n", "import numpy" ] @@ -52,7 +54,7 @@ "metadata": {}, "outputs": [], "source": [ - "model.distributions[0].probs, X[:,0].mean()" + "model.distributions[0].probs, X[:, 0].mean()" ] }, { @@ -61,7 +63,7 @@ "metadata": {}, "outputs": [], "source": [ - "model.distributions[1].probs[0], (X[X[:,0] == 0][:,1]).mean()" + "model.distributions[1].probs[0], (X[X[:, 0] == 0][:, 1]).mean()" ] }, { diff --git a/jwst-notebook/tests/requirements.txt b/jwst-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/jwst-notebook/tests/requirements.txt +++ b/jwst-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/ocean-notebook/tests/requirements.txt b/ocean-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/ocean-notebook/tests/requirements.txt +++ b/ocean-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/python-cuda-notebook/requirements.txt b/python-cuda-notebook/requirements.txt index 309d6bc..12eeb00 100755 --- a/python-cuda-notebook/requirements.txt +++ b/python-cuda-notebook/requirements.txt @@ -3,7 +3,7 @@ # Tensorflow > 2.10.0 has issues with the PATH setup that needs # cumbersome fixes. https://github.com/keras-team/keras/issues/17422 # Instead we pin to tensorflow 2.10.0 for now until they fix this. -tensorflow==2.11.1 +tensorflow==2.16.1 torch==2.0.0 torchvision==0.15.1 torchtext==0.15.1 diff --git a/python-cuda-notebook/tests/requirements.txt b/python-cuda-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/python-cuda-notebook/tests/requirements.txt +++ b/python-cuda-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/python-notebook/Dockerfile.j2 b/python-notebook/Dockerfile.j2 index 76bad81..a7023e8 100755 --- a/python-notebook/Dockerfile.j2 +++ b/python-notebook/Dockerfile.j2 @@ -12,7 +12,7 @@ WORKDIR /tmp USER $NB_UID -RUN mamba config --set remote_read_timeout_secs $PACKAGE_TIMEOUT +RUN conda config --set remote_read_timeout_secs $PACKAGE_TIMEOUT ENV PYTHON3_PATH=$CONDA_DIR/envs/python3 # Create user python3 environement diff --git a/python-notebook/environment.yml b/python-notebook/environment.yml index 819ff5b..4038008 100755 --- a/python-notebook/environment.yml +++ b/python-notebook/environment.yml @@ -1,4 +1,4 @@ name: python-notebook dependencies: - - python=3.10 - - ipykernel \ No newline at end of file + - python=3.11 + - ipykernel diff --git a/python-notebook/tests/requirements.txt b/python-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/python-notebook/tests/requirements.txt +++ b/python-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/qsharp-notebook/tests/requirements.txt b/qsharp-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/qsharp-notebook/tests/requirements.txt +++ b/qsharp-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/r-notebook/Dockerfile.j2 b/r-notebook/Dockerfile.j2 index 89132b8..c22991e 100755 --- a/r-notebook/Dockerfile.j2 +++ b/r-notebook/Dockerfile.j2 @@ -1,14 +1,14 @@ FROM {{ parent }} LABEL MAINTAINER="Rasmus Munk " ARG PACKAGE_TIMEOUT=60 -ARG RSTUDIO_VERSION=2023.06.1-524 -ARG SHINY_VERSION=1.5.20.1002 +ARG RSTUDIO_VERSION=2023.12.1-402 +ARG SHINY_VERSION=1.5.21.1012 ARG UBUNTU_VERSION=18.04 ARG UBUNTU_DISTRO=jammy ARG RSTUDIO_ARCH=amd64 ARG SHINY_ARCH=x86_64 ARG KERAS_VERSION=2.13.0 -ARG TENSORFLOW_VERSION=2.14.0 +ARG TENSORFLOW_VERSION=2.15.0 USER root @@ -16,11 +16,8 @@ USER root RUN echo "[global]" > /etc/pip.conf \ && echo "timeout=$PACKAGE_TIMEOUT" >> /etc/pip.conf -# Ubuntu 22.04 does not come with libssl1.1 which is required by rstudio server RUN apt-get update \ && apt-get install -y libterm-readline-gnu-perl \ - && wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb -O /tmp/libssl1.1.deb \ - && dpkg -i /tmp/libssl1.1.deb \ && apt-get clean \ && rm -fr /var/lib/apt/lists/* @@ -42,7 +39,7 @@ WORKDIR /tmp USER $NB_UID -RUN mamba config --set remote_read_timeout_secs $PACKAGE_TIMEOUT +RUN conda config --set remote_read_timeout_secs $PACKAGE_TIMEOUT # Provide rstudio and shiny launcher icons RUN jupyterlab_pip3 install jupyter-rsession-proxy \ @@ -75,7 +72,6 @@ RUN mamba install -yq -n r \ 'r-htmltools=0.*' \ 'r-htmlwidgets=1.*' \ 'r-irkernel=1.*' \ - 'r-keras=2.*' \ 'r-leaps=3.*' \ 'r-nycflights13=1.0*' \ 'r-pheatmap=1.0*' \ @@ -101,7 +97,7 @@ RUN mamba install -yq -n r \ && fix-permissions $CONDA_DIR \ && fix-permissions /home/$NB_USER -RUN mamba config --set remote_read_timeout_secs $PACKAGE_TIMEOUT +RUN conda config --set remote_read_timeout_secs $PACKAGE_TIMEOUT ENV PYTHON3_PATH=$CONDA_DIR/envs/python3 # Freetype is in the incorrect directory for some old libraries @@ -132,6 +128,10 @@ RUN echo "PATH=\"$R_PATH/bin:$PATH\"" >> /home/$NB_USER/.bashrc \ && ln -s $R_PATH/bin/R /usr/local/bin/R RUN python3 /usr/local/bin/update_kernel_spec.py ir --env-kwargs PATH=$R_PATH/bin:$PATH +# Fix LD library path for RStudio +# https://github.com/rstudio/rstudio/issues/14060#issuecomment-1911329450 +RUN echo "rsession-ld-library-path=/opt/conda/lib" >> /etc/rstudio/rserver.conf + # Rstudio version 1.4 has permissions problems as per. # https://community.rstudio.com/t/permissions-related-to-upgrade-to-rstudio-server-open-source-1-4/94256/3 RUN chown -R $NB_USER:$NB_GID /var/lib/rstudio-server \ diff --git a/r-notebook/environment.yml b/r-notebook/environment.yml index ed56fff..9a13ab0 100755 --- a/r-notebook/environment.yml +++ b/r-notebook/environment.yml @@ -1,4 +1,6 @@ name: r-notebook dependencies: - - python=3.10 +# Until the latest supported version of tensorflow for R +# reached >= 2.16.0, 3.12 is not supported + - python=3.11 - ipykernel \ No newline at end of file diff --git a/r-notebook/tests/requirements.txt b/r-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/r-notebook/tests/requirements.txt +++ b/r-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/res/templates/cuda/Dockerfile.cuda b/res/templates/cuda/Dockerfile.cuda index 0ff21d1..bc6b2c6 100644 --- a/res/templates/cuda/Dockerfile.cuda +++ b/res/templates/cuda/Dockerfile.cuda @@ -3,17 +3,17 @@ WORKDIR /tmp ARG CUDA_OS_DIST=ubuntu2204 ARG CUDA_KEYRING_VERSION=1.0-1 ARG CUDA_CPU=x86_64 -ARG CUDA_MAJOR_VERSION=11 -ARG CUDA_MIN_VERSION=8 +ARG CUDA_MAJOR_VERSION=12 +ARG CUDA_MIN_VERSION=3 ARG CUDA_VERSION=${CUDA_MAJOR_VERSION}.${CUDA_MIN_VERSION} -ARG CUDA_PKG_VERSION=11-8 +ARG CUDA_PKG_VERSION=12-3 -ARG NCCL_VERSION=2.16.5 -ARG CUDNN_VERSION=8.9.1.23-1+cuda${CUDA_VERSION} +ARG NCCL_VERSION=2.20.3 +ARG CUDNN_VERSION=9 ENV CUDA_VERSION=${CUDA_VERSION} ENV CUDA_PATH="/usr/local/cuda" -ENV CUDA_11_0_PATH="/usr/local/cuda-${CUDA_VERSION}" +ENV CUDA_VERSION_PATH="/usr/local/cuda-${CUDA_VERSION}" # Install the CUDA keyring for automating the signature public key rotation # as per https://developer.nvidia.com/blog/updating-the-cuda-linux-gpg-repository-key/ @@ -50,8 +50,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ # CUDNN RUN apt-get update && apt-get install -y --no-install-recommends \ - libcudnn8=${CUDNN_VERSION} \ - && apt-mark hold libcudnn8 && \ + cudnn${CUDNN_VERSION}-cuda-${CUDA_MAJOR_VERSION} && \ rm -rf /var/lib/apt/lists/* # Add CUDA symlink and missing symlink for libcusolver @@ -74,4 +73,4 @@ USER $NB_UID COPY requirements.txt /tmp/ RUN mamba run -n python3 pip install -r /tmp/requirements.txt \ - && mamba clean --all -f -y \ No newline at end of file + && mamba clean --all -f -y diff --git a/res/templates/cuda/requirements.txt b/res/templates/cuda/requirements.txt index 309d6bc..12eeb00 100755 --- a/res/templates/cuda/requirements.txt +++ b/res/templates/cuda/requirements.txt @@ -3,7 +3,7 @@ # Tensorflow > 2.10.0 has issues with the PATH setup that needs # cumbersome fixes. https://github.com/keras-team/keras/issues/17422 # Instead we pin to tensorflow 2.10.0 for now until they fix this. -tensorflow==2.11.1 +tensorflow==2.16.1 torch==2.0.0 torchvision==0.15.1 torchtext==0.15.1 diff --git a/res/tests/requirements.txt b/res/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/res/tests/requirements.txt +++ b/res/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/slurm-notebook/Dockerfile.j2 b/slurm-notebook/Dockerfile.j2 index 4f381a0..0db57e1 100755 --- a/slurm-notebook/Dockerfile.j2 +++ b/slurm-notebook/Dockerfile.j2 @@ -102,7 +102,7 @@ RUN mkdir -p /var/spool/slurmd \ USER $NB_UID -RUN mamba config --set remote_read_timeout_secs $PACKAGE_TIMEOUT +RUN conda config --set remote_read_timeout_secs $PACKAGE_TIMEOUT ENV CLING_PATH=$CONDA_DIR/envs/cling # Install the MODI-Helper-Scripts systemwide such that every environment and diff --git a/slurm-notebook/tests/requirements.txt b/slurm-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/slurm-notebook/tests/requirements.txt +++ b/slurm-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/sme-notebook/Dockerfile.j2 b/sme-notebook/Dockerfile.j2 index 71410d5..9d2c162 100755 --- a/sme-notebook/Dockerfile.j2 +++ b/sme-notebook/Dockerfile.j2 @@ -32,7 +32,7 @@ WORKDIR /tmp USER $NB_UID -RUN mamba config --set remote_read_timeout_secs $PACKAGE_TIMEOUT \ +RUN conda config --set remote_read_timeout_secs $PACKAGE_TIMEOUT \ && mkdir -p /home/$NB_USER/.local/bin/icsharp # Clone and install csharp kernel diff --git a/sme-notebook/tests/requirements.txt b/sme-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/sme-notebook/tests/requirements.txt +++ b/sme-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/statistics-notebook/Dockerfile.j2 b/statistics-notebook/Dockerfile.j2 index 14da450..0bb9dd4 100755 --- a/statistics-notebook/Dockerfile.j2 +++ b/statistics-notebook/Dockerfile.j2 @@ -18,7 +18,7 @@ WORKDIR /tmp USER $NB_UID -RUN mamba config --set remote_read_timeout_secs $PACKAGE_TIMEOUT +RUN conda config --set remote_read_timeout_secs $PACKAGE_TIMEOUT COPY environment.yml /tmp/ RUN mamba env update -n python3 -f environment.yml \ diff --git a/statistics-notebook/requirements.txt b/statistics-notebook/requirements.txt index 5863f6c..0cf31f9 100755 --- a/statistics-notebook/requirements.txt +++ b/statistics-notebook/requirements.txt @@ -4,6 +4,7 @@ iminuit ipywidgets numpy pandas +pyarrow pymc scipy seaborn diff --git a/statistics-notebook/tests/requirements.txt b/statistics-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/statistics-notebook/tests/requirements.txt +++ b/statistics-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 diff --git a/tomography-notebook/Dockerfile.j2 b/tomography-notebook/Dockerfile.j2 index 2770ec3..373306b 100755 --- a/tomography-notebook/Dockerfile.j2 +++ b/tomography-notebook/Dockerfile.j2 @@ -13,7 +13,7 @@ WORKDIR /tmp # Run container as USER $NB_UID -RUN mamba config --set remote_read_timeout_secs $PACKAGE_TIMEOUT +RUN conda config --set remote_read_timeout_secs $PACKAGE_TIMEOUT COPY environment.yml /tmp/ RUN mamba env update -n python3 -f environment.yml \ diff --git a/tomography-notebook/requirements.txt b/tomography-notebook/requirements.txt index 8df9cf1..e9da968 100755 --- a/tomography-notebook/requirements.txt +++ b/tomography-notebook/requirements.txt @@ -7,6 +7,7 @@ nbformat netCDF4 numpy pandas +pyarrow pillow scipy seaborn diff --git a/tomography-notebook/tests/requirements.txt b/tomography-notebook/tests/requirements.txt index 07a0dc3..bd2a178 100755 --- a/tomography-notebook/tests/requirements.txt +++ b/tomography-notebook/tests/requirements.txt @@ -1,3 +1,3 @@ -pytest==7.1.2 -pytest-xdist==2.2.1 -nbformat==5.4.0 +pytest==8.1.1 +pytest-xdist==3.5.0 +nbformat==5.10.4 From 616be29a0f302a5b0b069301229f0ed742a2048a Mon Sep 17 00:00:00 2001 From: Rasmus Date: Sun, 14 Apr 2024 23:39:58 +0200 Subject: [PATCH 18/19] Update architecture.yml Correct the HPC SDK version definitions --- architecture.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/architecture.yml b/architecture.yml index e92ad6a..6dd9347 100644 --- a/architecture.yml +++ b/architecture.yml @@ -221,8 +221,8 @@ architecture: parameters: nvhome: /opt/nvidia/hpc_sdk target: Linux_x86_64 - major_version: 24 - minor_version: 3 + version_major: 24 + version_minor: 3 nvcudadir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/cuda" nvcompdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/compilers" nvmathdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/math_libs" @@ -239,8 +239,8 @@ architecture: parameters: nvhome: /opt/nvidia/hpc_sdk target: Linux_x86_64 - major_version: 24 - minor_version: 3 + version_major: 24 + version_minor: 3 nvcudadir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/cuda" nvcompdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/compilers" nvmathdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/math_libs" @@ -257,8 +257,8 @@ architecture: parameters: nvhome: /opt/nvidia/hpc_sdk target: Linux_x86_64 - major_version: 24 - minor_version: 3 + version_major: 24 + version_minor: 3 nvcudadir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/cuda" nvcompdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/compilers" nvmathdir: "/opt/nvidia/hpc_sdk/Linux_x86_64/24.3/math_libs" From 9dd9c3f232ca119c385cd486032e10e63af84ac1 Mon Sep 17 00:00:00 2001 From: Rasmus Date: Thu, 6 Jun 2024 15:26:25 +0200 Subject: [PATCH 19/19] Update Dockerfile.cuda --- res/templates/cuda/Dockerfile.cuda | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/res/templates/cuda/Dockerfile.cuda b/res/templates/cuda/Dockerfile.cuda index bc6b2c6..ec20d2c 100644 --- a/res/templates/cuda/Dockerfile.cuda +++ b/res/templates/cuda/Dockerfile.cuda @@ -74,3 +74,9 @@ USER $NB_UID COPY requirements.txt /tmp/ RUN mamba run -n python3 pip install -r /tmp/requirements.txt \ && mamba clean --all -f -y + +# Set the CUDNN_PATH and include it to the LD_LIBRARY_PATH such +# that tensorflow can correctly open the required libraries +# to discover the host GPU devices +ENV CUDNN_PATH=$PYTHON3_PATH/lib/python3.11/site-packages/nvidia/cudnn +ENV LD_LIBRARY_PATH="${CUDNN_PATH}/lib:${LD_LIBRARY_PATH}"