diff --git a/ci/utils/build_docker_image.sh b/ci/utils/build_docker_image.sh
index b027dbb5a90cfc81aab341c89f6d5b8f5532dbc5..da9408dfac03eabb4c481ee41dc9ea64ec111033 100755
--- a/ci/utils/build_docker_image.sh
+++ b/ci/utils/build_docker_image.sh
@@ -18,5 +18,6 @@ set -feu -o pipefail
 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
 NTHREADS="$(nproc)"
 UBUNTU_RELEASE=${1:-jammy}
+GRICAD_REGISTRY_URL='gricad-registry.univ-grenoble-alpes.fr'
 
-docker build --rm=true --build-arg "NTHREADS=$NTHREADS" -t "gricad-registry.univ-grenoble-alpes.fr/particle_methods/hysop:${UBUNTU_RELEASE}" -f "${SCRIPT_DIR}/../docker_images/ubuntu/${UBUNTU_RELEASE}/Dockerfile" "${SCRIPT_DIR}/../.."
+docker build --rm=true --build-arg "NTHREADS=$NTHREADS" -t "${GRICAD_REGISTRY_URL}/particle_methods/hysop:${UBUNTU_RELEASE}" -f "${SCRIPT_DIR}/../docker_images/ubuntu/${UBUNTU_RELEASE}/Dockerfile" "${SCRIPT_DIR}/../.."
diff --git a/ci/utils/pull_docker_image.sh b/ci/utils/pull_docker_image.sh
index 1973a2b0f7885af8cf375af24aa0240209a6a832..c77068138f910ce51891b1a16d25780030509f36 100755
--- a/ci/utils/pull_docker_image.sh
+++ b/ci/utils/pull_docker_image.sh
@@ -16,5 +16,11 @@
 ##
 set -euf -o pipefail
 UBUNTU_RELEASE=${1:-jammy}
+GRICAD_REGISTRY_URL='gricad-registry.univ-grenoble-alpes.fr'
 docker logout
-docker pull "gricad-registry.univ-grenoble-alpes.fr/particle_methods/hysop:${UBUNTU_RELEASE}"
+if [[ -z "${GRICAD_USERNAME}" ]] || [[ -z "${GRICAD_REGISTRY_TOKEN}" ]]; then
+    docker login "${GRICAD_REGISTRY_URL}"
+else
+    echo "${GRICAD_REGISTRY_TOKEN}" | docker login "${GRICAD_REGISTRY_URL}" --username "${GRICAD_USERNAME}" --password-stdin
+fi
+docker pull "${GRICAD_REGISTRY_URL}/particle_methods/hysop:${UBUNTU_RELEASE}"
diff --git a/ci/utils/push_docker_image.sh b/ci/utils/push_docker_image.sh
index d7e66df59b66f98d7bf888174e3d4511956ca856..06d50ffaeb1162dbe69dc82e5ccdfc722732b758 100755
--- a/ci/utils/push_docker_image.sh
+++ b/ci/utils/push_docker_image.sh
@@ -16,6 +16,12 @@
 ##
 set -euf -o pipefail
 UBUNTU_RELEASE=${1:-jammy}
-docker login gricad-registry.univ-grenoble-alpes.fr
-docker push "gricad-registry.univ-grenoble-alpes.fr/particle_methods/hysop:${UBUNTU_RELEASE}"
+GRICAD_REGISTRY_URL='gricad-registry.univ-grenoble-alpes.fr'
+docker logout
+if [[ -z "${GRICAD_USERNAME}" ]] || [[ -z "${GRICAD_REGISTRY_TOKEN}" ]]; then
+    docker login "${GRICAD_REGISTRY_URL}"
+else
+    echo "${GRICAD_REGISTRY_TOKEN}" | docker login "${GRICAD_REGISTRY_URL}" --username "${GRICAD_USERNAME}" --password-stdin
+fi
+docker push "${GRICAD_REGISTRY_URL}/particle_methods/hysop:${UBUNTU_RELEASE}"
 docker logout
diff --git a/ci/utils/run_ci.sh b/ci/utils/run_ci.sh
index 6a122bece22ea12d4576be6d87ecd7a5ba5dc718..bc9f751400120bdccde48d9e22d37b75c6018728 100755
--- a/ci/utils/run_ci.sh
+++ b/ci/utils/run_ci.sh
@@ -17,9 +17,16 @@
 set -feu -o pipefail
 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
 UBUNTU_RELEASE=${1:-jammy}
-DOCKER_IMG="gricad-registry.univ-grenoble-alpes.fr/particle_methods/hysop:${UBUNTU_RELEASE}"
+GRICAD_REGISTRY_URL='gricad-registry.univ-grenoble-alpes.fr'
+DOCKER_IMG="${GRICAD_REGISTRY_URL}/particle_methods/hysop:${UBUNTU_RELEASE}"
 CONTAINER_ID='hysop_build_and_test'
 
+if [[ $UBUNTU_RELEASE == *_cuda ]]; then
+    EXTRA_ARGS="--gpus all"
+else
+    EXTRA_ARGS=""
+fi
+
 function remove_img() {
     docker stop "${CONTAINER_ID}" || true
     docker rm "${CONTAINER_ID}" || true
@@ -28,7 +35,7 @@ trap remove_img INT TERM EXIT KILL
 
 remove_img
 
-docker create --cap-add=SYS_PTRACE -v "${SCRIPT_DIR}/../..:/hysop:ro" --name="${CONTAINER_ID}" -it "${DOCKER_IMG}"
+docker create --cap-add=SYS_PTRACE ${EXTRA_ARGS} -v "${SCRIPT_DIR}/../..:/hysop:ro" --name="${CONTAINER_ID}" -it "${DOCKER_IMG}"
 
 docker start "${CONTAINER_ID}"
 
diff --git a/ci/utils/run_debug.sh b/ci/utils/run_debug.sh
index d9e3519d188d2b8cb4cfd3d5abbb960009edea86..7bf8c66921b9df907906ffae4b7524b099b4ab1f 100755
--- a/ci/utils/run_debug.sh
+++ b/ci/utils/run_debug.sh
@@ -17,9 +17,16 @@
 set -feu -o pipefail
 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
 UBUNTU_RELEASE=${1:-jammy}
-DOCKER_IMG="gricad-registry.univ-grenoble-alpes.fr/particle_methods/hysop:${UBUNTU_RELEASE}"
+GRICAD_REGISTRY_URL='gricad-registry.univ-grenoble-alpes.fr'
+DOCKER_IMG="${GRICAD_REGISTRY_URL}/particle_methods/hysop:${UBUNTU_RELEASE}"
 CONTAINER_ID='hysop_build_and_debug'
 
+if [[ $UBUNTU_RELEASE == *_cuda ]]; then
+    EXTRA_ARGS="--gpus all"
+else
+    EXTRA_ARGS=""
+fi
+
 function remove_img() {
     docker stop "${CONTAINER_ID}" || true
     docker rm "${CONTAINER_ID}" || true
@@ -28,7 +35,7 @@ trap remove_img INT TERM EXIT KILL
 
 remove_img
 
-docker create --cap-add=SYS_PTRACE -v "${SCRIPT_DIR}/../..:/hysop:ro" --name="${CONTAINER_ID}" -it "${DOCKER_IMG}"
+docker create --cap-add=SYS_PTRACE ${EXTRA_ARGS} -v "${SCRIPT_DIR}/../..:/hysop:ro" --name="${CONTAINER_ID}" -it "${DOCKER_IMG}"
 
 docker start "${CONTAINER_ID}"
 
diff --git a/ci/utils/run_docker_image.sh b/ci/utils/run_docker_image.sh
index c563b4378ed7604741da1392814d5955c89342c3..2372adf32483b5b4ddab14fc6d0ae15e07c8e5f8 100755
--- a/ci/utils/run_docker_image.sh
+++ b/ci/utils/run_docker_image.sh
@@ -17,4 +17,12 @@
 set -feu -o pipefail
 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
 UBUNTU_RELEASE=${1:-jammy}
-docker run --cap-add=SYS_PTRACE -it -v "${SCRIPT_DIR}/../..:/hysop:ro" "gricad-registry.univ-grenoble-alpes.fr/particle_methods/hysop:${UBUNTU_RELEASE}"
+GRICAD_REGISTRY_URL='gricad-registry.univ-grenoble-alpes.fr'
+
+if [[ $UBUNTU_RELEASE == *_cuda ]]; then
+    EXTRA_ARGS="--gpus all"
+else
+    EXTRA_ARGS=""
+fi
+
+docker run --cap-add=SYS_PTRACE ${EXTRA_ARGS} -it -v "${SCRIPT_DIR}/../..:/hysop:ro" "${GRICAD_REGISTRY_URL}/particle_methods/hysop:${UBUNTU_RELEASE}"