Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 18 additions & 8 deletions config/golden-image-container-integration.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ schema_version: 1

image:
type: container
alias: nddev-u24-amd64-ctr-docker-runner-2.336.0-r20260801-b16
alias: nddev-u24-amd64-ctr-docker-runner-2.336.0-r20260801-b17
current_alias: nddev-ubuntu-24.04-amd64-container-docker-current
previous_alias: nddev-ubuntu-24.04-amd64-container-docker-previous
source_alias: nddev-source-ubuntu-24.04-amd64-container-r20260801
Expand Down Expand Up @@ -49,20 +49,20 @@ go_cache_seed:

toolchains:
- name: bun
version: 1.3.14
version: 1.4.0
archive: bun-linux-x64.zip
download_url: https://github.com/oven-sh/bun/releases/download/bun-v1.3.14/bun-linux-x64.zip
archive_sha256: 951ee2aee855f08595aeec6225226a298d3fea83a3dcd6465c09cbccdf7e848f
download_url: https://github.com/oven-sh/bun/releases/download/bun-v1.4.0/bun-linux-x64.zip
archive_sha256: 2d03fb5fb83ac8b567aca0a281b2ce1a1a19d488f56c2968d88c3f25e92fe452
- name: codeql
version: 2.26.4
archive: codeql-bundle-linux64.tar.gz
download_url: https://github.com/github/codeql-action/releases/download/codeql-bundle-v2.26.4/codeql-bundle-linux64.tar.gz
archive_sha256: 48e1ab8b874d57bd6fd7c90fefee75addc5a45e9bd063982df9beb45a62dd5d3
- name: go
version: 1.26.6
archive: go1.26.6.linux-amd64.tar.gz
download_url: https://go.dev/dl/go1.26.6.linux-amd64.tar.gz
archive_sha256: 708effb774be8237570d0add163225abbdfaf4fca28b2611df167beba4feef89
version: 1.26.7
archive: go1.26.7.linux-amd64.tar.gz
download_url: https://go.dev/dl/go1.26.7.linux-amd64.tar.gz
archive_sha256: ffb5f8de10c62550dfddab66b36b57030721e0a44a3218e9e1181d7b59f121ca
- name: gh
version: 2.97.0
archive: gh_2.97.0_linux_amd64.tar.gz
Expand All @@ -83,11 +83,21 @@ toolchains:
archive: node-v25.9.0-linux-x64.tar.xz
download_url: https://nodejs.org/dist/v25.9.0/node-v25.9.0-linux-x64.tar.xz
archive_sha256: 1d8db7d6e291d167e8c467ae4094be175e1a0b3969c7ae1f8955b9f7824f7b2e
- name: node26
version: 26.8.1
archive: node-v26.8.1-linux-x64.tar.xz
download_url: https://nodejs.org/dist/v26.8.1/node-v26.8.1-linux-x64.tar.xz
archive_sha256: 3e301118d7df53d563b7e96c1617545f26e2f76f9724be668d6cab65c15dda5d
- name: pnpm
version: 11.22.0
archive: pnpm-11.22.0.tgz
download_url: https://registry.npmjs.org/pnpm/-/pnpm-11.22.0.tgz
archive_sha256: 57a97e6f23a3faffc03153a4ef8c770a0552612b8640aebe39bfdd5754d0ebdc
- name: python314
version: 3.14.7
archive: python-3.14.7-linux-24.04-x64.tar.gz
download_url: https://github.com/actions/python-versions/releases/download/3.14.7-31064857500/python-3.14.7-linux-24.04-x64.tar.gz
archive_sha256: 76d5ddab6d2dd89a39c06220f6efeda486a48ed481eae97bfc596c74ac3623db
- name: rustup
version: 1.29.0
archive: rustup-init
Expand Down
26 changes: 18 additions & 8 deletions config/golden-image-container.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ schema_version: 1

image:
type: container
alias: nddev-ubuntu-24.04-amd64-container-runner-2.336.0-r20260801-b22
alias: nddev-ubuntu-24.04-amd64-container-runner-2.336.0-r20260801-b23
current_alias: nddev-ubuntu-24.04-amd64-container-current
previous_alias: nddev-ubuntu-24.04-amd64-container-previous
source_alias: nddev-source-ubuntu-24.04-amd64-container-r20260801
Expand Down Expand Up @@ -49,20 +49,20 @@ go_cache_seed:

toolchains:
- name: bun
version: 1.3.14
version: 1.4.0
archive: bun-linux-x64.zip
download_url: https://github.com/oven-sh/bun/releases/download/bun-v1.3.14/bun-linux-x64.zip
archive_sha256: 951ee2aee855f08595aeec6225226a298d3fea83a3dcd6465c09cbccdf7e848f
download_url: https://github.com/oven-sh/bun/releases/download/bun-v1.4.0/bun-linux-x64.zip
archive_sha256: 2d03fb5fb83ac8b567aca0a281b2ce1a1a19d488f56c2968d88c3f25e92fe452
- name: codeql
version: 2.26.4
archive: codeql-bundle-linux64.tar.gz
download_url: https://github.com/github/codeql-action/releases/download/codeql-bundle-v2.26.4/codeql-bundle-linux64.tar.gz
archive_sha256: 48e1ab8b874d57bd6fd7c90fefee75addc5a45e9bd063982df9beb45a62dd5d3
- name: go
version: 1.26.6
archive: go1.26.6.linux-amd64.tar.gz
download_url: https://go.dev/dl/go1.26.6.linux-amd64.tar.gz
archive_sha256: 708effb774be8237570d0add163225abbdfaf4fca28b2611df167beba4feef89
version: 1.26.7
archive: go1.26.7.linux-amd64.tar.gz
download_url: https://go.dev/dl/go1.26.7.linux-amd64.tar.gz
archive_sha256: ffb5f8de10c62550dfddab66b36b57030721e0a44a3218e9e1181d7b59f121ca
- name: flutter
version: 3.44.9
archive: flutter_linux_3.44.9-stable.tar.xz
Expand All @@ -88,11 +88,21 @@ toolchains:
archive: node-v25.9.0-linux-x64.tar.xz
download_url: https://nodejs.org/dist/v25.9.0/node-v25.9.0-linux-x64.tar.xz
archive_sha256: 1d8db7d6e291d167e8c467ae4094be175e1a0b3969c7ae1f8955b9f7824f7b2e
- name: node26
version: 26.8.1
archive: node-v26.8.1-linux-x64.tar.xz
download_url: https://nodejs.org/dist/v26.8.1/node-v26.8.1-linux-x64.tar.xz
archive_sha256: 3e301118d7df53d563b7e96c1617545f26e2f76f9724be668d6cab65c15dda5d
- name: pnpm
version: 11.22.0
archive: pnpm-11.22.0.tgz
download_url: https://registry.npmjs.org/pnpm/-/pnpm-11.22.0.tgz
archive_sha256: 57a97e6f23a3faffc03153a4ef8c770a0552612b8640aebe39bfdd5754d0ebdc
- name: python314
version: 3.14.7
archive: python-3.14.7-linux-24.04-x64.tar.gz
download_url: https://github.com/actions/python-versions/releases/download/3.14.7-31064857500/python-3.14.7-linux-24.04-x64.tar.gz
archive_sha256: 76d5ddab6d2dd89a39c06220f6efeda486a48ed481eae97bfc596c74ac3623db
- name: rustup
version: 1.29.0
archive: rustup-init
Expand Down
26 changes: 18 additions & 8 deletions config/golden-image-integration.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
schema_version: 1

image:
alias: nddev-ubuntu-24.04-amd64-docker-runner-2.336.0-r20260801-b17
alias: nddev-ubuntu-24.04-amd64-docker-runner-2.336.0-r20260801-b18
current_alias: nddev-ubuntu-24.04-amd64-docker-current
previous_alias: nddev-ubuntu-24.04-amd64-docker-previous
source_alias: nddev-source-ubuntu-24.04-amd64-r20260801
Expand Down Expand Up @@ -48,20 +48,20 @@ go_cache_seed:

toolchains:
- name: bun
version: 1.3.14
version: 1.4.0
archive: bun-linux-x64.zip
download_url: https://github.com/oven-sh/bun/releases/download/bun-v1.3.14/bun-linux-x64.zip
archive_sha256: 951ee2aee855f08595aeec6225226a298d3fea83a3dcd6465c09cbccdf7e848f
download_url: https://github.com/oven-sh/bun/releases/download/bun-v1.4.0/bun-linux-x64.zip
archive_sha256: 2d03fb5fb83ac8b567aca0a281b2ce1a1a19d488f56c2968d88c3f25e92fe452
- name: codeql
version: 2.26.4
archive: codeql-bundle-linux64.tar.gz
download_url: https://github.com/github/codeql-action/releases/download/codeql-bundle-v2.26.4/codeql-bundle-linux64.tar.gz
archive_sha256: 48e1ab8b874d57bd6fd7c90fefee75addc5a45e9bd063982df9beb45a62dd5d3
- name: go
version: 1.26.6
archive: go1.26.6.linux-amd64.tar.gz
download_url: https://go.dev/dl/go1.26.6.linux-amd64.tar.gz
archive_sha256: 708effb774be8237570d0add163225abbdfaf4fca28b2611df167beba4feef89
version: 1.26.7
archive: go1.26.7.linux-amd64.tar.gz
download_url: https://go.dev/dl/go1.26.7.linux-amd64.tar.gz
archive_sha256: ffb5f8de10c62550dfddab66b36b57030721e0a44a3218e9e1181d7b59f121ca
- name: gh
version: 2.97.0
archive: gh_2.97.0_linux_amd64.tar.gz
Expand All @@ -82,11 +82,21 @@ toolchains:
archive: node-v25.9.0-linux-x64.tar.xz
download_url: https://nodejs.org/dist/v25.9.0/node-v25.9.0-linux-x64.tar.xz
archive_sha256: 1d8db7d6e291d167e8c467ae4094be175e1a0b3969c7ae1f8955b9f7824f7b2e
- name: node26
version: 26.8.1
archive: node-v26.8.1-linux-x64.tar.xz
download_url: https://nodejs.org/dist/v26.8.1/node-v26.8.1-linux-x64.tar.xz
archive_sha256: 3e301118d7df53d563b7e96c1617545f26e2f76f9724be668d6cab65c15dda5d
- name: pnpm
version: 11.22.0
archive: pnpm-11.22.0.tgz
download_url: https://registry.npmjs.org/pnpm/-/pnpm-11.22.0.tgz
archive_sha256: 57a97e6f23a3faffc03153a4ef8c770a0552612b8640aebe39bfdd5754d0ebdc
- name: python314
version: 3.14.7
archive: python-3.14.7-linux-24.04-x64.tar.gz
download_url: https://github.com/actions/python-versions/releases/download/3.14.7-31064857500/python-3.14.7-linux-24.04-x64.tar.gz
archive_sha256: 76d5ddab6d2dd89a39c06220f6efeda486a48ed481eae97bfc596c74ac3623db
- name: rustup
version: 1.29.0
archive: rustup-init
Expand Down
26 changes: 18 additions & 8 deletions config/golden-image.yaml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
schema_version: 1

image:
alias: nddev-ubuntu-24.04-amd64-runner-2.336.0-r20260801-b18
alias: nddev-ubuntu-24.04-amd64-runner-2.336.0-r20260801-b19
current_alias: nddev-ubuntu-24.04-amd64-current
previous_alias: nddev-ubuntu-24.04-amd64-previous
source_alias: nddev-source-ubuntu-24.04-amd64-r20260801
Expand Down Expand Up @@ -48,20 +48,20 @@ go_cache_seed:

toolchains:
- name: bun
version: 1.3.14
version: 1.4.0
archive: bun-linux-x64.zip
download_url: https://github.com/oven-sh/bun/releases/download/bun-v1.3.14/bun-linux-x64.zip
archive_sha256: 951ee2aee855f08595aeec6225226a298d3fea83a3dcd6465c09cbccdf7e848f
download_url: https://github.com/oven-sh/bun/releases/download/bun-v1.4.0/bun-linux-x64.zip
archive_sha256: 2d03fb5fb83ac8b567aca0a281b2ce1a1a19d488f56c2968d88c3f25e92fe452
- name: codeql
version: 2.26.4
archive: codeql-bundle-linux64.tar.gz
download_url: https://github.com/github/codeql-action/releases/download/codeql-bundle-v2.26.4/codeql-bundle-linux64.tar.gz
archive_sha256: 48e1ab8b874d57bd6fd7c90fefee75addc5a45e9bd063982df9beb45a62dd5d3
- name: go
version: 1.26.6
archive: go1.26.6.linux-amd64.tar.gz
download_url: https://go.dev/dl/go1.26.6.linux-amd64.tar.gz
archive_sha256: 708effb774be8237570d0add163225abbdfaf4fca28b2611df167beba4feef89
version: 1.26.7
archive: go1.26.7.linux-amd64.tar.gz
download_url: https://go.dev/dl/go1.26.7.linux-amd64.tar.gz
archive_sha256: ffb5f8de10c62550dfddab66b36b57030721e0a44a3218e9e1181d7b59f121ca
- name: gh
version: 2.97.0
archive: gh_2.97.0_linux_amd64.tar.gz
Expand All @@ -82,11 +82,21 @@ toolchains:
archive: node-v25.9.0-linux-x64.tar.xz
download_url: https://nodejs.org/dist/v25.9.0/node-v25.9.0-linux-x64.tar.xz
archive_sha256: 1d8db7d6e291d167e8c467ae4094be175e1a0b3969c7ae1f8955b9f7824f7b2e
- name: node26
version: 26.8.1
archive: node-v26.8.1-linux-x64.tar.xz
download_url: https://nodejs.org/dist/v26.8.1/node-v26.8.1-linux-x64.tar.xz
archive_sha256: 3e301118d7df53d563b7e96c1617545f26e2f76f9724be668d6cab65c15dda5d
- name: pnpm
version: 11.22.0
archive: pnpm-11.22.0.tgz
download_url: https://registry.npmjs.org/pnpm/-/pnpm-11.22.0.tgz
archive_sha256: 57a97e6f23a3faffc03153a4ef8c770a0552612b8640aebe39bfdd5754d0ebdc
- name: python314
version: 3.14.7
archive: python-3.14.7-linux-24.04-x64.tar.gz
download_url: https://github.com/actions/python-versions/releases/download/3.14.7-31064857500/python-3.14.7-linux-24.04-x64.tar.gz
archive_sha256: 76d5ddab6d2dd89a39c06220f6efeda486a48ed481eae97bfc596c74ac3623db
- name: rustup
version: 1.29.0
archive: rustup-init
Expand Down
41 changes: 38 additions & 3 deletions internal/imagebuild/assets/provision.sh
Original file line number Diff line number Diff line change
Expand Up @@ -288,8 +288,8 @@ jq -e 'type == "array"' <<<"${toolchain_manifest}" >/dev/null
mapfile -t toolchain_names < <(jq -r '.[].name' <<<"${toolchain_manifest}")
toolchain_set="$(printf '%s\n' "${toolchain_names[@]}" | LC_ALL=C sort | paste -sd, -)"
if [[ "${toolchain_set}" != bun,codeql,gh,go,rustup,uv \
&& "${toolchain_set}" != bun,codeql,gh,go,node22,node24,node25,pnpm,rustup,uv,yarn \
&& "${toolchain_set}" != bun,codeql,flutter,gh,go,node22,node24,node25,pnpm,rustup,uv,yarn ]]; then
&& "${toolchain_set}" != bun,codeql,gh,go,node22,node24,node25,node26,pnpm,python314,rustup,uv,yarn \
&& "${toolchain_set}" != bun,codeql,flutter,gh,go,node22,node24,node25,node26,pnpm,python314,rustup,uv,yarn ]]; then
echo "toolchain manifest does not pin the exact baked set" >&2
exit 1
fi
Expand Down Expand Up @@ -383,7 +383,7 @@ for toolchain_name in "${toolchain_names[@]}"; do
ln -sfn "${runner_tool_cache}/go/${toolchain_version}/x64/bin/gofmt" /usr/local/bin/gofmt
[[ "$(go version)" == "go version go${toolchain_version} linux/amd64" ]]
;;
node22|node24|node25)
node22|node24|node25|node26)
tar --extract --xz --file "${toolchain_archive}" \
--directory "${toolchain_scratch}" --no-same-owner --no-same-permissions
node_root="${runner_tool_cache}/node/${toolchain_version}"
Expand All @@ -402,6 +402,41 @@ for toolchain_name in "${toolchain_names[@]}"; do
corepack --version >/dev/null
fi
;;
python314)
# The official actions/python-versions archive is linked for
# /opt/hostedtoolcache. Install it there and expose that exact tree through
# this runner's tool cache so actions/setup-python resolves it locally.
python_hosted_root="/opt/hostedtoolcache/Python/${toolchain_version}/x64"
python_runner_root="${runner_tool_cache}/Python/${toolchain_version}"
install -d -o runner -g runner -m 0755 \
/opt/hostedtoolcache/Python "${python_hosted_root}" \
"${runner_tool_cache}/Python"
tar --extract --gzip --file "${toolchain_archive}" \
--directory "${python_hosted_root}" --no-same-owner --no-same-permissions
rm -f -- "${python_hosted_root}/setup.sh"
chown -R runner:runner "/opt/hostedtoolcache/Python/${toolchain_version}"
runuser -u runner -- env HOME=/home/runner \
"${python_hosted_root}/bin/python3.14" -m ensurepip --upgrade >/dev/null
ln -sfn "${python_hosted_root}/bin/python3.14" "${python_hosted_root}/python"
install -o runner -g runner -m 0644 /dev/null \
"/opt/hostedtoolcache/Python/${toolchain_version}/x64.complete"
ln -sfn "/opt/hostedtoolcache/Python/${toolchain_version}" "${python_runner_root}"
chown -h runner:runner "${python_runner_root}"
for executable in python python3 pip pip3; do
target="${python_hosted_root}/bin/${executable}"
if [[ ! -e "${target}" ]]; then
case "${executable}" in
python) target="${python_hosted_root}/bin/python3.14" ;;
python3) target="${python_hosted_root}/bin/python3.14" ;;
pip) target="${python_hosted_root}/bin/pip3.14" ;;
pip3) target="${python_hosted_root}/bin/pip3.14" ;;
esac
fi
ln -sfn "${target}" "/usr/local/bin/${executable}"
done
[[ "$(python --version)" == "Python ${toolchain_version}" ]]
python -m pip --version >/dev/null
;;
pnpm)
package_root="/usr/local/libexec/gha-toolchains/pnpm-${toolchain_version}"
install -d -o root -g root -m 0755 "${package_root}"
Expand Down
15 changes: 13 additions & 2 deletions internal/imagebuild/assets/smoke-integration.sh
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ runner_tool_cache="$(jq -er .runner_tool_cache /etc/nddev/image-build.json)"
[[ "${runner_tool_cache}" == /home/runner/actions-runner/_work/_tool ]]
smoke_toolchains="$(printf '%s' "${GHA_TOOLCHAINS_B64}" | base64 --decode)"
mapfile -t smoke_toolchain_names < <(jq -r '.[].name' <<<"${smoke_toolchains}")
[[ "$(printf '%s\n' "${smoke_toolchain_names[@]}" | LC_ALL=C sort | paste -sd, -)" == bun,codeql,gh,go,node22,node24,node25,pnpm,rustup,uv,yarn ]]
[[ "$(printf '%s\n' "${smoke_toolchain_names[@]}" | LC_ALL=C sort | paste -sd, -)" == bun,codeql,gh,go,node22,node24,node25,node26,pnpm,python314,rustup,uv,yarn ]]
for smoke_toolchain in "${smoke_toolchain_names[@]}"; do
entry="$(jq -ce --arg name "${smoke_toolchain}" '.[] | select(.name == $name)' <<<"${smoke_toolchains}")"
expected_version="$(jq -er .version <<<"${entry}")"
Expand Down Expand Up @@ -139,7 +139,7 @@ for smoke_toolchain in "${smoke_toolchain_names[@]}"; do
[[ "$("${go_root}/bin/go" version)" == "go version go${expected_version} linux/amd64" ]]
[[ "$(go version)" == "go version go${expected_version} linux/amd64" ]]
;;
node22|node24|node25)
node22|node24|node25|node26)
node_root="${runner_tool_cache}/node/${expected_version}"
test -f "${node_root}/x64.complete"
test -x "${node_root}/x64/bin/node"
Expand All @@ -151,6 +151,17 @@ for smoke_toolchain in "${smoke_toolchain_names[@]}"; do
corepack --version >/dev/null
fi
;;
python314)
python_hosted_root="/opt/hostedtoolcache/Python/${expected_version}/x64"
python_runner_root="${runner_tool_cache}/Python/${expected_version}"
test -f "/opt/hostedtoolcache/Python/${expected_version}/x64.complete"
test -x "${python_hosted_root}/bin/python3.14"
test -L "${python_runner_root}"
[[ "$(readlink -f -- "${python_runner_root}")" == "/opt/hostedtoolcache/Python/${expected_version}" ]]
[[ "$(runuser -u runner -- env HOME=/home/runner "${python_hosted_root}/bin/python3.14" --version)" == "Python ${expected_version}" ]]
runuser -u runner -- env HOME=/home/runner "${python_hosted_root}/bin/python3.14" -m pip --version >/dev/null
[[ "$(python --version)" == "Python ${expected_version}" ]]
;;
pnpm) [[ "$(pnpm --version)" == "${expected_version}" ]] ;;
rustup)
# Verified exactly as a job sees it: through the runner user, whose
Expand Down
17 changes: 14 additions & 3 deletions internal/imagebuild/assets/smoke.sh
Original file line number Diff line number Diff line change
Expand Up @@ -94,8 +94,8 @@ smoke_toolchains="$(printf '%s' "${GHA_TOOLCHAINS_B64}" | base64 --decode)"
mapfile -t smoke_toolchain_names < <(jq -r '.[].name' <<<"${smoke_toolchains}")
smoke_toolchain_set="$(printf '%s\n' "${smoke_toolchain_names[@]}" | LC_ALL=C sort | paste -sd, -)"
[[ "${smoke_toolchain_set}" == bun,codeql,gh,go,rustup,uv \
|| "${smoke_toolchain_set}" == bun,codeql,gh,go,node22,node24,node25,pnpm,rustup,uv,yarn \
|| "${smoke_toolchain_set}" == bun,codeql,flutter,gh,go,node22,node24,node25,pnpm,rustup,uv,yarn ]]
|| "${smoke_toolchain_set}" == bun,codeql,gh,go,node22,node24,node25,node26,pnpm,python314,rustup,uv,yarn \
|| "${smoke_toolchain_set}" == bun,codeql,flutter,gh,go,node22,node24,node25,node26,pnpm,python314,rustup,uv,yarn ]]
for smoke_toolchain in "${smoke_toolchain_names[@]}"; do
entry="$(jq -ce --arg name "${smoke_toolchain}" '.[] | select(.name == $name)' <<<"${smoke_toolchains}")"
expected_version="$(jq -er .version <<<"${entry}")"
Expand Down Expand Up @@ -137,7 +137,7 @@ for smoke_toolchain in "${smoke_toolchain_names[@]}"; do
[[ "$("${go_root}/bin/go" version)" == "go version go${expected_version} linux/amd64" ]]
[[ "$(go version)" == "go version go${expected_version} linux/amd64" ]]
;;
node22|node24|node25)
node22|node24|node25|node26)
node_root="${runner_tool_cache}/node/${expected_version}"
test -f "${node_root}/x64.complete"
test -x "${node_root}/x64/bin/node"
Expand All @@ -149,6 +149,17 @@ for smoke_toolchain in "${smoke_toolchain_names[@]}"; do
corepack --version >/dev/null
fi
;;
python314)
python_hosted_root="/opt/hostedtoolcache/Python/${expected_version}/x64"
python_runner_root="${runner_tool_cache}/Python/${expected_version}"
test -f "/opt/hostedtoolcache/Python/${expected_version}/x64.complete"
test -x "${python_hosted_root}/bin/python3.14"
test -L "${python_runner_root}"
[[ "$(readlink -f -- "${python_runner_root}")" == "/opt/hostedtoolcache/Python/${expected_version}" ]]
[[ "$(runuser -u runner -- env HOME=/home/runner "${python_hosted_root}/bin/python3.14" --version)" == "Python ${expected_version}" ]]
runuser -u runner -- env HOME=/home/runner "${python_hosted_root}/bin/python3.14" -m pip --version >/dev/null
[[ "$(python --version)" == "Python ${expected_version}" ]]
;;
pnpm) [[ "$(pnpm --version)" == "${expected_version}" ]] ;;
rustup)
# Verified exactly as a job sees it: through the runner user, whose
Expand Down
Loading