Skip to content
Open
2 changes: 1 addition & 1 deletion features/src/cccl-dev/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "NVIDIA CCCL development utilities",
"id": "cccl-dev",
"version": "26.2.0",
"version": "26.2.1",
"description": "A feature to install NVIDIA CCCL development utilities",
"options": {
"litVersion": {
Expand Down
2 changes: 1 addition & 1 deletion features/src/cccl-dev/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ DOXYGEN_URL="https://github.com/doxygen/doxygen/releases/download/Release_${DOXY

(
TEMPDEST=$(mktemp -d)
wget --no-hsts -q "$DOXYGEN_URL" -O "$TEMPDEST/doxygen.tar.gz"
wget --no-hsts -q --tries=3 --timeout=30 "$DOXYGEN_URL" -O "$TEMPDEST/doxygen.tar.gz"
cd "$TEMPDEST"
tar --strip-components=1 -xf doxygen.tar.gz
make install -j
Expand Down
2 changes: 1 addition & 1 deletion features/src/cmake/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "CMake",
"id": "cmake",
"version": "26.2.0",
"version": "26.2.1",
"description": "A feature to install CMake",
"options": {
"version": {
Expand Down
4 changes: 2 additions & 2 deletions features/src/cmake/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ echo "Downloading CMake...";

if [[ "${CMAKE_VERSION}" == "latest" ]]; then
find_version_from_git_tags CMAKE_VERSION https://github.com/Kitware/CMake;
while ! wget --no-hsts -q -O /tmp/cmake_${CMAKE_VERSION}.sh https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-$(uname -p).sh; do
while ! wget --no-hsts -q --tries=3 --timeout=30 -O /tmp/cmake_${CMAKE_VERSION}.sh https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-$(uname -p).sh; do
echo "(!) cmake version ${CMAKE_VERSION} failed to download. Attempting to fall back one version to retry...";
find_prev_version_from_git_tags CMAKE_VERSION https://github.com/Kitware/CMake;
done
else
wget --no-hsts -q -O /tmp/cmake_${CMAKE_VERSION}.sh https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-$(uname -p).sh;
wget --no-hsts -q --tries=3 --timeout=30 -O /tmp/cmake_${CMAKE_VERSION}.sh https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-$(uname -p).sh;
fi

echo "Installing CMake...";
Expand Down
2 changes: 1 addition & 1 deletion features/src/cuda/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "CUDA Toolkit",
"id": "cuda",
"version": "26.2.0",
"version": "26.2.1",
"description": "A feature to install the NVIDIA CUDA Toolkit",
"options": {
"version": {
Expand Down
4 changes: 2 additions & 2 deletions features/src/cuda/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -38,15 +38,15 @@ fi

get_cuda_deb() {
local deb="$( \
wget --no-hsts -q -O- "${1}/Packages" \
wget --no-hsts -q --tries=3 --timeout=30 -O- "${1}/Packages" \
| grep -P "^Filename: \./${2}(.*)\.deb$" \
| sort -Vr | head -n1 | cut -d' ' -f2 \
)";
if [ -z "$deb" ]; then
echo "Error: No matching .deb found for '${1}' and '${2}'" >&2
return 1
fi
wget --no-hsts -q -O "/tmp/${deb#./}" "${1}/${deb#./}";
wget --no-hsts -q --tries=3 --timeout=30 -O "/tmp/${deb#./}" "${1}/${deb#./}";
echo -n "/tmp/${deb#./}";
}

Expand Down
2 changes: 1 addition & 1 deletion features/src/gcc/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "GCC",
"id": "gcc",
"version": "26.2.0",
"version": "26.2.1",
"description": "A feature to install gcc",
"options": {
"version": {
Expand Down
2 changes: 1 addition & 1 deletion features/src/gitlab-cli/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"id": "gitlab-cli",
"version": "26.2.0",
"version": "26.2.1",
"name": "GitLab CLI",
"documentationURL": "https://github.com/rapidsai/devcontainers/features/tree/main/src/gitlab-cli",
"description": "Installs the GitLab CLI. Auto-detects latest version and installs needed dependencies.",
Expand Down
2 changes: 1 addition & 1 deletion features/src/gitlab-cli/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ gitlab_cli_file_name() {
download_gitlab_cli_deb() {
local -;
set -euo pipefail;
wget --no-hsts -q -O /tmp/gitlab-cli.deb \
wget --no-hsts -q --tries=3 --timeout=30 -O /tmp/gitlab-cli.deb \
"https://gitlab.com/gitlab-org/cli/-/releases/v${CLI_VERSION}/downloads/$(gitlab_cli_file_name)";
}

Expand Down
2 changes: 1 addition & 1 deletion features/src/llvm/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "LLVM compilers and tools",
"id": "llvm",
"version": "26.2.1",
"version": "26.2.2",
"description": "A feature to install LLVM compilers and tools",
"options": {
"version": {
Expand Down
6 changes: 3 additions & 3 deletions features/src/llvm/llvm.sh
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ if [[ -n "${CODENAME}" ]]; then

retry_count=0;

while ! wget --no-hsts -q --method=HEAD \
while ! wget --no-hsts -q --tries=3 --timeout=30 --method=HEAD \
"${BASE_URL}/${CODENAME}/dists/llvm-toolchain${LINKNAME}${LLVM_VERSION_PATTERNS[$LLVM_VERSION]}/Release" >/dev/null 2>&1; do
if test $(( retry_count++ )) -ge 5; then
LLVM_VERSION_STRING=
Expand All @@ -145,7 +145,7 @@ if [[ -n "${CODENAME}" ]]; then
REPO_NAME="deb ${BASE_URL}/${CODENAME}/ llvm-toolchain${LINKNAME}${LLVM_VERSION_STRING} main"

# check if the repository exists for the distro and version
if ! wget --no-hsts -q --method=HEAD "${BASE_URL}/${CODENAME}" >/dev/null 2>&1; then
if ! wget --no-hsts -q --tries=3 --timeout=30 --method=HEAD "${BASE_URL}/${CODENAME}" >/dev/null 2>&1; then
if [[ -n "${CODENAME_FROM_ARGUMENTS}" ]]; then
echo "Specified codename '${CODENAME}' is not supported by this script."
else
Expand All @@ -160,7 +160,7 @@ fi

if [ ! -f /etc/apt/trusted.gpg.d/apt.llvm.org.asc ]; then
# download GPG key once
wget --no-hsts -qO- https://apt.llvm.org/llvm-snapshot.gpg.key | tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
wget --no-hsts -q --tries=3 --timeout=30 -O- https://apt.llvm.org/llvm-snapshot.gpg.key | tee /etc/apt/trusted.gpg.d/apt.llvm.org.asc
fi

if [[ -z "`apt-key list 2> /dev/null | grep -i llvm`" ]]; then
Expand Down
2 changes: 1 addition & 1 deletion features/src/mambaforge/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "Mambaforge",
"id": "mambaforge",
"version": "26.2.1",
"version": "26.2.2",
"description": "A feature to install mambaforge",
"options": {
"version": {
Expand Down
2 changes: 1 addition & 1 deletion features/src/mambaforge/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ if [[ "$MINIFORGE_VERSION" == latest ]]; then
find_version_from_git_tags MINIFORGE_VERSION https://github.com/conda-forge/miniforge "tags/" "." "-[0-9]+" "true";
fi

wget --no-hsts -q -O /tmp/miniforge.sh \
wget --no-hsts -q --tries=3 --timeout=30 -O /tmp/miniforge.sh \
"https://github.com/conda-forge/miniforge/releases/download/${MINIFORGE_VERSION}/Miniforge3-${MINIFORGE_VERSION}-Linux-$(uname -p).sh";
echo "Installing Miniforge...";

Expand Down
2 changes: 1 addition & 1 deletion features/src/ninja/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "Ninja build",
"id": "ninja",
"version": "26.2.0",
"version": "26.2.1",
"description": "A feature to install ninja-build",
"options": {
"version": {
Expand Down
18 changes: 12 additions & 6 deletions features/src/ninja/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,21 @@ if test "$(uname -p)" = "aarch64"; then
_name+="-aarch64";
fi

# Install Ninja
wget --no-hsts -q -O /tmp/ninja-linux.zip \
"https://github.com/ninja-build/ninja/releases/download/v${NINJA_VERSION}/${_name}.zip";
# Install Ninja with retries for network reliability
echo "Downloading ninja v${NINJA_VERSION}...";
wget --no-hsts -q --tries=3 --timeout=30 -O /tmp/ninja-linux.zip \
"https://github.com/ninja-build/ninja/releases/download/v${NINJA_VERSION}/${_name}.zip" || {
echo "ERROR: Failed to download ninja after 3 attempts";
exit 1;
};
unzip -d /usr/bin /tmp/ninja-linux.zip;
chmod +x /usr/bin/ninja;

# Install Ninja bash completions
wget --no-hsts -q -O /usr/share/bash-completion/completions/ninja \
"https://github.com/ninja-build/ninja/raw/v${NINJA_VERSION}/misc/bash-completion";
# Install Ninja bash completions (non-fatal if it fails)
echo "Downloading ninja bash-completion...";
wget --no-hsts -q --tries=3 --timeout=30 -O /usr/share/bash-completion/completions/ninja \
"https://github.com/ninja-build/ninja/raw/v${NINJA_VERSION}/misc/bash-completion" || \
echo "Warning: Failed to download ninja bash-completion (non-fatal)";

# Clean up
rm -rf /var/tmp/*;
Expand Down
2 changes: 1 addition & 1 deletion features/src/nvhpc/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "NVHPC SDK",
"id": "nvhpc",
"version": "26.2.1",
"version": "26.2.2",
"description": "A feature to install the NVHPC SDK",
"options": {
"version": {
Expand Down
2 changes: 1 addition & 1 deletion features/src/nvhpc/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ fi

echo "Downloading NVHPC gpg key...";

wget --no-hsts -q -O- https://developer.download.nvidia.com/hpc-sdk/ubuntu/DEB-GPG-KEY-NVIDIA-HPC-SDK \
wget --no-hsts -q --tries=3 --timeout=30 -O- https://developer.download.nvidia.com/hpc-sdk/ubuntu/DEB-GPG-KEY-NVIDIA-HPC-SDK \
| gpg --dearmor -o /etc/apt/trusted.gpg.d/nvidia-hpcsdk-archive-keyring.gpg;

chmod 0644 /etc/apt/trusted.gpg.d/*.gpg || true;
Expand Down
2 changes: 1 addition & 1 deletion features/src/oneapi/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "Intel oneapi toolchain",
"id": "oneapi",
"version": "26.2.0",
"version": "26.2.1",
"description": "A feature to install the Intel oneapi toolchain",
"options": {
"version": {
Expand Down
2 changes: 1 addition & 1 deletion features/src/oneapi/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ if [ -f /etc/profile.d/lmod.sh ]; then
fi

# Add Intel repo signing key
wget --no-hsts -q -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2023.PUB \
wget --no-hsts -q --tries=3 --timeout=30 -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS-2023.PUB \
| gpg --dearmor -o /etc/apt/trusted.gpg.d/oneapi-archive-keyring.gpg;

chmod 0644 /etc/apt/trusted.gpg.d/*.gpg || true;
Expand Down
2 changes: 1 addition & 1 deletion features/src/openmpi/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "OpenMPI",
"id": "openmpi",
"version": "26.2.0",
"version": "26.2.1",
"description": "A feature to install OpenMPI with optional CUDA and UCX support",
"options": {
"version": {
Expand Down
2 changes: 1 addition & 1 deletion features/src/openmpi/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ build_and_install_openmpi() {

local -r major_minor="$(grep -o '^[0-9]*.[0-9]*' <<< "${OPENMPI_VERSION}")";

wget --no-hsts -q -O- "https://download.open-mpi.org/release/open-mpi/v${major_minor}/openmpi-${OPENMPI_VERSION}.tar.gz" \
wget --no-hsts -q --tries=3 --timeout=30 -O- "https://download.open-mpi.org/release/open-mpi/v${major_minor}/openmpi-${OPENMPI_VERSION}.tar.gz" \
| tar -C /tmp/ompi -zf - --strip-components=1 -x;

(
Expand Down
2 changes: 1 addition & 1 deletion features/src/rapids-build-utils/devcontainer-feature.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "NVIDIA RAPIDS devcontainer build utilities",
"id": "rapids-build-utils",
"version": "26.2.2",
"version": "26.2.4",
"description": "A feature to install the RAPIDS devcontainer build utilities",
"containerEnv": {
"BASH_ENV": "/etc/bash.bash_env"
Expand Down
2 changes: 1 addition & 1 deletion features/src/rapids-build-utils/install.sh
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ if ! command -V yq >/dev/null 2>&1; then

YQ_VERSION=4.46.1;
find_version_from_git_tags YQ_VERSION https://github.com/mikefarah/yq;
while ! wget --no-hsts -q -O- "https://github.com/mikefarah/yq/releases/download/v${YQ_VERSION}/${YQ_BINARY}.tar.gz" | tar -C /usr/bin -zf - -x ./${YQ_BINARY} --transform="s/${YQ_BINARY}/yq/"; do
while ! wget --no-hsts -q --tries=3 --timeout=30 -O- "https://github.com/mikefarah/yq/releases/download/v${YQ_VERSION}/${YQ_BINARY}.tar.gz" | tar -C /usr/bin -zf - -x ./${YQ_BINARY} --transform="s/${YQ_BINARY}/yq/"; do
echo "(!) YQ version ${YQ_VERSION} failed to download. Attempting to fall back one version to retry...";
find_prev_version_from_git_tags YQ_VERSION https://github.com/mikefarah/yq;
done
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ generate_script() {
if test -n "${bin:+x}"; then
(
cat - \
| envsubst '$HOME $NAME $SRC_PATH $PY_ENV $PY_SRC $PY_LIB $BIN_DIR $CPP_ENV $CPP_LIB $CPP_SRC $CPP_CMAKE_ARGS $CPP_CPACK_ARGS $CPP_DEPS $CPP_MAX_TOTAL_SYSTEM_MEMORY $CPP_MAX_DEVICE_OBJ_MEMORY_USAGE $CPP_MAX_DEVICE_OBJ_TO_COMPILE_IN_PARALLEL $GIT_TAG $GIT_SSH_URL $GIT_HTTPS_URL $GIT_REPO $GIT_HOST $GIT_UPSTREAM $PIP_WHEEL_ARGS $PIP_INSTALL_ARGS' \
| envsubst '$HOME $NAME $SRC_PATH $PY_ENV $PY_SRC $PY_LIB $PY_TEST $BIN_DIR $CPP_ENV $CPP_LIB $CPP_SRC $CPP_TEST $CPP_CMAKE_ARGS $CPP_CPACK_ARGS $CPP_DEPS $CPP_MAX_TOTAL_SYSTEM_MEMORY $CPP_MAX_DEVICE_OBJ_MEMORY_USAGE $CPP_MAX_DEVICE_OBJ_TO_COMPILE_IN_PARALLEL $GIT_TAG $GIT_SSH_URL $GIT_HTTPS_URL $GIT_REPO $GIT_HOST $GIT_UPSTREAM $PIP_WHEEL_ARGS $PIP_INSTALL_ARGS' \
| tee "${TMP_SCRIPT_DIR}/${bin}" >/dev/null;

chmod +x "${TMP_SCRIPT_DIR}/${bin}";
Expand Down Expand Up @@ -150,6 +150,33 @@ generate_python_scripts() {
done
}

generate_cpp_test_script() {
if test -n "${CPP_TEST:-}" && test -f "${TEMPLATES}/cpp.test.tmpl.sh"; then (
# shellcheck disable=SC2002
cat "${TEMPLATES}/cpp.test.tmpl.sh" \
| generate_script "test-${CPP_LIB}-cpp";
) || true;
fi
}

generate_python_test_script() {
if test -n "${PY_TEST:-}" && test -f "${TEMPLATES}/python.test.tmpl.sh"; then (
# shellcheck disable=SC2002
cat "${TEMPLATES}/python.test.tmpl.sh" \
| generate_script "test-${PY_LIB}-python";
) || true;
fi
}

generate_repo_test_script() {
if test -f "${TEMPLATES}/repo.test.tmpl.sh"; then (
# shellcheck disable=SC2002
cat "${TEMPLATES}/repo.test.tmpl.sh" \
| generate_script "test-${NAME}";
) || true;
fi
}

generate_scripts() {
local -;
set -euo pipefail;
Expand Down Expand Up @@ -185,6 +212,7 @@ generate_scripts() {
local cpp_name;
local cpp_path;
local cpp_sub_dir;
local cpp_test;
local cpp_cmake_args;
local cpp_cpack_args;
local cpp_depends_length;
Expand All @@ -195,6 +223,7 @@ generate_scripts() {
local py_env;
local py_path;
local py_name;
local py_test;
local py_cmake_args;
local pip_wheel_args;
local pip_install_args;
Expand Down Expand Up @@ -254,6 +283,7 @@ generate_scripts() {
cpp_env="${repo}_cpp_${j}_env";
cpp_name="${repo}_cpp_${j}_name";
cpp_sub_dir="${repo}_cpp_${j}_sub_dir";
cpp_test="${repo}_cpp_${j}_test";
cpp_cmake_args="${repo}_cpp_${j}_args_cmake";
cpp_cpack_args="${repo}_cpp_${j}_args_cpack";
cpp_depends_length="${repo}_cpp_${j}_depends_length";
Expand Down Expand Up @@ -295,13 +325,19 @@ generate_scripts() {
CPP_ENV="${!cpp_env:-}" \
CPP_LIB="${cpp_name:-}" \
CPP_SRC="${!cpp_sub_dir:-}" \
CPP_TEST="${!cpp_test:-}" \
CPP_DEPS="${cpp_deps[*]}" \
CPP_CMAKE_ARGS="${!cpp_cmake_args:-}" \
CPP_CPACK_ARGS="${!cpp_cpack_args:-}" \
CPP_MAX_TOTAL_SYSTEM_MEMORY="${!cpp_max_total_system_memory:-}" \
CPP_MAX_DEVICE_OBJ_MEMORY_USAGE="${!cpp_max_device_obj_memory_usage:-}" \
CPP_MAX_DEVICE_OBJ_TO_COMPILE_IN_PARALLEL="${!cpp_max_device_obj_to_compile_in_parallel:-}" \
generate_cpp_scripts ;
NAME="${repo_name:-}" \
SRC_PATH=~/"${!repo_path:-}" \
CPP_LIB="${cpp_name:-}" \
CPP_TEST="${!cpp_test:-}" \
generate_cpp_test_script ;
fi
done

Expand All @@ -310,6 +346,7 @@ generate_scripts() {
for ((j=0; j < ${!py_length:-0}; j+=1)); do
py_env="${repo}_python_${j}_env";
py_name="${repo}_python_${j}_name";
py_test="${repo}_python_${j}_test";
py_cmake_args="${repo}_python_${j}_args_cmake";
pip_wheel_args="${repo}_python_${j}_args_wheel";
pip_install_args="${repo}_python_${j}_args_install";
Expand Down Expand Up @@ -352,6 +389,11 @@ generate_scripts() {
PIP_WHEEL_ARGS="${!pip_wheel_args:-}" \
PIP_INSTALL_ARGS="${!pip_install_args:-}" \
generate_python_scripts ;
NAME="${repo_name:-}" \
SRC_PATH=~/"${!repo_path:-}" \
PY_LIB="${py_name}" \
PY_TEST="${!py_test:-}" \
generate_python_test_script ;
fi
done

Expand All @@ -362,6 +404,10 @@ generate_scripts() {
PY_LIB="${py_libs[*]@Q}" \
CPP_LIB="${cpp_libs[*]@Q}" \
generate_repo_scripts ;
NAME="${repo_name:-}" \
PY_LIB="${py_libs[*]@Q}" \
CPP_LIB="${cpp_libs[*]@Q}" \
generate_repo_test_script ;
fi

# Generate a clone script for each repo
Expand All @@ -383,7 +429,7 @@ generate_scripts() {
unset cpp_name_to_path;

if ((${#repo_names[@]} > 0)); then
for script in "clone" "clean" "configure" "build" "cpack" "install" "uninstall"; do
for script in "clone" "clean" "configure" "build" "cpack" "install" "uninstall" "test"; do
# Generate a script to run a script for all repos
NAME="${cloned_repos[0]:-${repo_names[0]:-}}" \
NAMES="${repo_names[*]@Q}" \
Expand All @@ -392,7 +438,7 @@ generate_scripts() {
generate_all_script ;
done

for script in "clean" "build"; do
for script in "clean" "build" "test"; do
# Generate a script to run C++ builds for all repos
NAME="${cpp_names[0]:-${repo_names[0]:-}}" \
NAMES="${cpp_names[*]@Q}" \
Expand Down
Loading
Loading