diff --git a/.github/ISSUE_TEMPLATE/update-base-ubi-rust-builders.md b/.github/ISSUE_TEMPLATE/update-base-ubi-rust-builders.md
index cb552e447..ad112752f 100644
--- a/.github/ISSUE_TEMPLATE/update-base-ubi-rust-builders.md
+++ b/.github/ISSUE_TEMPLATE/update-base-ubi-rust-builders.md
@@ -51,7 +51,7 @@ Add/Change/Remove anything that isn't applicable anymore
> This list should be completed by the assignee(s), once respective PRs have been merged. Once all items have been
> checked, the issue can be moved into _Development: Done_.
-- [ ] Done for [ubi9-rust-builder/Dockerfile](https://github.com/stackabletech/docker-images/blob/main/ubi9-rust-builder/Dockerfile)
+- [ ] Done for [ubi10-rust-builder/Dockerfile](https://github.com/stackabletech/docker-images/blob/main/ubi10-rust-builder/Dockerfile)
- [ ] Can build the image locally
- [ ] Can build an operator image
@@ -59,7 +59,7 @@ Add/Change/Remove anything that isn't applicable anymore
Testing instructions
```shell
-docker build -t oci.stackable.tech/sdp/ubi9-rust-builder . -f ubi9-rust-builder/Dockerfile
+docker build -t oci.stackable.tech/sdp/ubi10-rust-builder . -f ubi10-rust-builder/Dockerfile
# Change directory into the an operator repository and ensure the image can build
docker build . -f docker/Dockerfile
diff --git a/.github/workflows/ubi-rust-builder.yml b/.github/workflows/ubi-rust-builder.yml
index 7f8f580f5..5afef7bba 100644
--- a/.github/workflows/ubi-rust-builder.yml
+++ b/.github/workflows/ubi-rust-builder.yml
@@ -8,7 +8,6 @@ on:
branches:
- main
paths:
- - ubi9-rust-builder/**
- ubi10-rust-builder/**
- .github/actions/**
- .github/workflows/ubi-rust-builder.yml
@@ -25,7 +24,7 @@ jobs:
fail-fast: false
matrix:
runner: ["ubuntu-latest", "ubicloud-standard-8-arm-ubuntu-2404"]
- ubi-version: ["ubi9"]
+ ubi-version: ["ubi10"]
runs-on: ${{ matrix.runner }}
steps:
- uses: actions/checkout@08c6903cd8c0fde910a37f88322edcfb5dd907a8 # v5.0.0
@@ -65,7 +64,7 @@ jobs:
strategy:
fail-fast: false
matrix:
- ubi-version: ["ubi9"]
+ ubi-version: ["ubi10"]
runs-on: ubuntu-latest
needs: ["build"]
steps:
diff --git a/.scripts/upload_new_maven_version.sh b/.scripts/upload_new_maven_version.sh
index 9b8e21ec3..fbd25d350 100755
--- a/.scripts/upload_new_maven_version.sh
+++ b/.scripts/upload_new_maven_version.sh
@@ -71,4 +71,4 @@ curl --fail -o /dev/null --progress-bar -u "$NEXUS_USER:$NEXUS_PASSWORD" --uploa
echo "Successfully uploaded Maven $VERSION to Nexus"
echo "https://repo.stackable.tech/service/rest/repository/browse/packages/maven/"
-echo "https://github.com/prometheus/maven/releases/tag/$VERSION"
+echo "https://github.com/apache/maven/releases/tag/maven-$VERSION"
diff --git a/.scripts/upload_new_nvm_version.sh b/.scripts/upload_new_nvm_version.sh
new file mode 100755
index 000000000..6eddd22fe
--- /dev/null
+++ b/.scripts/upload_new_nvm_version.sh
@@ -0,0 +1,50 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+VERSION=${1:?"Missing version number argument (arg 1)"}
+NEXUS_USER=${2:?"Missing Nexus username argument (arg 2)"}
+
+read -r -s -p "Nexus Password: " NEXUS_PASSWORD
+echo
+
+# https://stackoverflow.com/questions/4632028/how-to-create-a-temporary-directory
+# Find the directory name of the script
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+
+# the temp directory used, within $DIR
+WORK_DIR=$(mktemp -d -p "$DIR")
+
+# check if tmp dir was created
+if [[ ! "$WORK_DIR" || ! -d "$WORK_DIR" ]]; then
+ echo "Could not create temp dir"
+ exit 1
+fi
+
+# deletes the temp directory
+function cleanup {
+ rm -rf "$WORK_DIR"
+}
+
+# register the cleanup function to be called on the EXIT signal
+trap cleanup EXIT
+
+cd "$WORK_DIR" || exit
+
+# https://github.com/nvm-sh/nvm/archive/refs/tags/v0.40.3.tar.gz
+BASE_URL="https://github.com/nvm-sh/nvm/archive/refs/tags"
+ARCHIVE_FILE="v$VERSION.tar.gz"
+ARCHIVE_URL="$BASE_URL/$ARCHIVE_FILE"
+
+echo "Downloading nvm $VERSION"
+curl --fail -LO --progress-bar "$ARCHIVE_URL"
+
+# nvm maintainers don't produce sum files
+
+echo "Uploading to Nexus"
+
+curl --fail -o /dev/null --progress-bar -u "$NEXUS_USER:$NEXUS_PASSWORD" --upload-file "$ARCHIVE_FILE" 'https://repo.stackable.tech/repository/packages/nvm/'
+
+echo "Successfully uploaded nvm $VERSION to Nexus"
+echo "https://repo.stackable.tech/service/rest/repository/browse/packages/nvm/"
+echo "https://github.com/nvm-sh/nvm/releases/tag/v$VERSION"
diff --git a/airflow/Dockerfile b/airflow/Dockerfile
index f518903fc..e585b4948 100644
--- a/airflow/Dockerfile
+++ b/airflow/Dockerfile
@@ -23,10 +23,10 @@ WORKDIR /tmp/opa-auth-manager
RUN < 0 {if (!seen[$0]++) print $0}' | tr '\n' ',' | sed 's/,$//')
-python${PYTHON_VERSION} -m venv --system-site-packages /stackable/app
-
-source /stackable/app/bin/activate
-
+# TODO: Use uv ${UV_VERSION} from Nexus instead of pip
# Upgrade pip to the latest version
-# Also install uv to get support for build constraints
+# Also install uv to get support for build constraints and venv for a given python version
pip install --no-cache-dir --upgrade pip
pip install --no-cache-dir uv==${UV_VERSION}
+
+uv venv --python "${PYTHON_VERSION}" --system-site-packages /stackable/app
+source /stackable/app/bin/activate
+
+# Another project manager
uv tool install hatch
cd "$(/stackable/patchable --images-repo-root=src checkout airflow ${PRODUCT_VERSION})"
@@ -200,6 +201,7 @@ ARG TINI_VERSION
ARG TARGETARCH
ARG SHARED_STATSD_EXPORTER_VERSION
ARG STACKABLE_USER_UID
+ARG UV_VERSION
LABEL name="Apache Airflow" \
maintainer="info@stackable.tech" \
@@ -225,6 +227,9 @@ COPY --from=gitsync-image --chown=${STACKABLE_USER_UID}:0 /git-sync ${HOME}/git-
COPY airflow/licenses /licenses
+# TODO (@NickLarsenNZ): Get the image into our registry
+COPY --from=ghcr.io/astral-sh/uv:0.9.10 --chown=${STACKABLE_USER_UID}:0 /uv /uvx /bin/
+
# Update image and install needed packages
RUN <