From 8f59bc3da4e6a9fb673c6ce38771116d05f3e250 Mon Sep 17 00:00:00 2001 From: Venkumahanti Subhankar Date: Mon, 22 Jun 2026 16:29:50 +0000 Subject: [PATCH 1/4] [universal]- fix smoke test (Restore setuptools install for default Python) --- .../.devcontainer/local-features/patch-python/install.sh | 5 +++++ src/universal/README.md | 2 +- src/universal/manifest.json | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/universal/.devcontainer/local-features/patch-python/install.sh b/src/universal/.devcontainer/local-features/patch-python/install.sh index ff9604ca91..13393c0587 100644 --- a/src/universal/.devcontainer/local-features/patch-python/install.sh +++ b/src/universal/.devcontainer/local-features/patch-python/install.sh @@ -38,3 +38,8 @@ update_package() { sudo_if "$PYTHON_PATH -m pip install --upgrade --no-cache-dir $PACKAGE==$VERSION" sudo_if "$PYTHON_PATH -m pip show --no-python-version-warning $PACKAGE" } + +# Python 3.12+ no longer bundles setuptools, so install/pin it for the default interpreter. +# Use the version-agnostic "current" symlink so this survives future Python version bumps. (https://github.com/advisories/GHSA-5rjg-fvgr-3xxf) +sudo_if /usr/local/python/current/bin/python -m pip install --upgrade pip +update_package /usr/local/python/current/bin/python setuptools "78.1.1" \ No newline at end of file diff --git a/src/universal/README.md b/src/universal/README.md index 2e46a46004..0bbb3b7b09 100644 --- a/src/universal/README.md +++ b/src/universal/README.md @@ -29,7 +29,7 @@ For example: - `mcr.microsoft.com/devcontainers/universal:6-noble` - `mcr.microsoft.com/devcontainers/universal:6.0-noble` -- `mcr.microsoft.com/devcontainers/universal:6.0.6-noble` +- `mcr.microsoft.com/devcontainers/universal:6.0.7-noble` See [history](history) for information on the contents of each version and [here for a complete list of available tags](https://mcr.microsoft.com/v2/devcontainers/universal/tags/list). diff --git a/src/universal/manifest.json b/src/universal/manifest.json index 84cdc91435..38ee1ae11e 100644 --- a/src/universal/manifest.json +++ b/src/universal/manifest.json @@ -1,5 +1,5 @@ { - "version": "6.0.6", + "version": "6.0.7", "build": { "latest": true, "rootDistro": "debian", From ea7b6b042eec8b6f836d6fc7781dc3d5f10bc81f Mon Sep 17 00:00:00 2001 From: Venkumahanti Subhankar Date: Tue, 23 Jun 2026 05:24:05 +0000 Subject: [PATCH 2/4] [universal]- fix smoke test (remove test for setuptools thats no more default bundled in python) --- .../.devcontainer/local-features/patch-python/install.sh | 5 ----- src/universal/README.md | 2 +- src/universal/manifest.json | 2 +- src/universal/test-project/test.sh | 1 - 4 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/universal/.devcontainer/local-features/patch-python/install.sh b/src/universal/.devcontainer/local-features/patch-python/install.sh index 13393c0587..ff9604ca91 100644 --- a/src/universal/.devcontainer/local-features/patch-python/install.sh +++ b/src/universal/.devcontainer/local-features/patch-python/install.sh @@ -38,8 +38,3 @@ update_package() { sudo_if "$PYTHON_PATH -m pip install --upgrade --no-cache-dir $PACKAGE==$VERSION" sudo_if "$PYTHON_PATH -m pip show --no-python-version-warning $PACKAGE" } - -# Python 3.12+ no longer bundles setuptools, so install/pin it for the default interpreter. -# Use the version-agnostic "current" symlink so this survives future Python version bumps. (https://github.com/advisories/GHSA-5rjg-fvgr-3xxf) -sudo_if /usr/local/python/current/bin/python -m pip install --upgrade pip -update_package /usr/local/python/current/bin/python setuptools "78.1.1" \ No newline at end of file diff --git a/src/universal/README.md b/src/universal/README.md index 0bbb3b7b09..2e46a46004 100644 --- a/src/universal/README.md +++ b/src/universal/README.md @@ -29,7 +29,7 @@ For example: - `mcr.microsoft.com/devcontainers/universal:6-noble` - `mcr.microsoft.com/devcontainers/universal:6.0-noble` -- `mcr.microsoft.com/devcontainers/universal:6.0.7-noble` +- `mcr.microsoft.com/devcontainers/universal:6.0.6-noble` See [history](history) for information on the contents of each version and [here for a complete list of available tags](https://mcr.microsoft.com/v2/devcontainers/universal/tags/list). diff --git a/src/universal/manifest.json b/src/universal/manifest.json index 38ee1ae11e..84cdc91435 100644 --- a/src/universal/manifest.json +++ b/src/universal/manifest.json @@ -1,5 +1,5 @@ { - "version": "6.0.7", + "version": "6.0.6", "build": { "latest": true, "rootDistro": "debian", diff --git a/src/universal/test-project/test.sh b/src/universal/test-project/test.sh index 75991efc8c..8efb073e54 100755 --- a/src/universal/test-project/test.sh +++ b/src/universal/test-project/test.sh @@ -172,7 +172,6 @@ check "php-version-on-path-is-8.1.30" php --version | grep 8.1.30 ls -la /home/codespace ## Python - current -checkPythonPackageVersion "python" "setuptools" "78.1.1" checkPythonPackageVersion "python" "requests" "2.31.0" ## Conda Python From b8200d378d5634b96ca80b737ded6bc895354b7c Mon Sep 17 00:00:00 2001 From: Venkumahanti Subhankar Date: Tue, 23 Jun 2026 08:32:34 +0000 Subject: [PATCH 3/4] [actions]: fix false "Invalid variants" failures due to Docker Hub rate limiting --- .github/actions/smoke-test/validate-tags.sh | 68 +++++++++++++++++---- 1 file changed, 57 insertions(+), 11 deletions(-) diff --git a/.github/actions/smoke-test/validate-tags.sh b/.github/actions/smoke-test/validate-tags.sh index 7187f8797e..22d3b53cbd 100755 --- a/.github/actions/smoke-test/validate-tags.sh +++ b/.github/actions/smoke-test/validate-tags.sh @@ -29,19 +29,41 @@ VARIANTS=$(jq -r '.variants[]?' "$MANIFEST_FILE" 2>/dev/null || true) # Track validation results INVALID_TAGS=() VALID_TAGS=() +UNVERIFIED_TAGS=() -# Function to check if a Docker image tag exists +# Function to check if a Docker image tag exists upstream. +# Returns: 0 = exists, 1 = genuinely missing, 2 = could not verify (transient/rate-limit) check_image_exists() { local image_tag="$1" + local max_attempts=3 + local attempt=1 + local output + echo " Checking: $image_tag" - - if docker manifest inspect "$image_tag" > /dev/null 2>&1; then - echo " ✓ Valid" - return 0 - else - echo " ✗ Invalid - tag does not exist" - return 1 - fi + + while (( attempt <= max_attempts )); do + if output=$(docker manifest inspect "$image_tag" 2>&1); then + echo " ✓ Valid" + return 0 + fi + + # Only a genuinely missing tag reports "manifest unknown"/"not found". + # Anything else (HTTP 429 rate limiting, DNS, TLS, 5xx) is transient and + # must not be misreported as "tag does not exist". + if echo "$output" | grep -qiE 'manifest unknown|manifest for .* not found|no such manifest'; then + echo " ✗ Invalid - tag does not exist" + return 1 + fi + + echo " ! Transient error (attempt ${attempt}/${max_attempts}): $(printf '%s' "$output" | tr '\n' ' ' | cut -c1-200)" + attempt=$(( attempt + 1 )) + if (( attempt <= max_attempts )); then + sleep $(( (attempt - 1) * 5 )) + fi + done + + echo " ! Could not verify tag after ${max_attempts} attempts (likely Docker Hub rate limiting); not treating as missing" + return 2 } # Check if this image has variants @@ -75,7 +97,11 @@ if [[ -n "$VARIANTS" ]]; then if check_image_exists "$image_tag"; then VALID_TAGS+=("$variant") else - INVALID_TAGS+=("$variant") + if [[ $? -eq 1 ]]; then + INVALID_TAGS+=("$variant") + else + UNVERIFIED_TAGS+=("$variant") + fi fi done else @@ -83,7 +109,11 @@ else if check_image_exists "$BASE_IMAGE"; then VALID_TAGS+=("base") else - INVALID_TAGS+=("base") + if [[ $? -eq 1 ]]; then + INVALID_TAGS+=("base") + else + UNVERIFIED_TAGS+=("base") + fi fi fi @@ -117,5 +147,21 @@ if [[ ${#INVALID_TAGS[@]} -gt 0 ]]; then exit 1 fi +if [[ ${#UNVERIFIED_TAGS[@]} -gt 0 ]]; then + echo "" + echo "WARNING: Could not verify $(if [[ -n "$VARIANTS" ]]; then echo "variants"; else echo "base images"; fi) (${#UNVERIFIED_TAGS[@]}) due to transient errors (e.g. Docker Hub rate limiting):" + for tag in "${UNVERIFIED_TAGS[@]}"; do + if [[ "$tag" == "base" ]]; then + echo " ! $BASE_IMAGE" + else + echo " ! $tag" + fi + done + echo "These were not treated as missing; the build will continue." + echo "" + echo "✓ No invalid tags found (${#UNVERIFIED_TAGS[@]} could not be verified and were skipped)." + exit 0 +fi + echo "" echo "✓ All base image tags are valid!" \ No newline at end of file From 5cfd26fe671f6d6bdfdec59910aede06476c5ed9 Mon Sep 17 00:00:00 2001 From: Venkumahanti Subhankar Date: Tue, 23 Jun 2026 09:22:45 +0000 Subject: [PATCH 4/4] [actions]: fix false "Invalid variants" failures due to Docker Hub rate limiting --- .github/actions/smoke-test/validate-tags.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/smoke-test/validate-tags.sh b/.github/actions/smoke-test/validate-tags.sh index 22d3b53cbd..e2cfcb9db2 100755 --- a/.github/actions/smoke-test/validate-tags.sh +++ b/.github/actions/smoke-test/validate-tags.sh @@ -58,7 +58,7 @@ check_image_exists() { echo " ! Transient error (attempt ${attempt}/${max_attempts}): $(printf '%s' "$output" | tr '\n' ' ' | cut -c1-200)" attempt=$(( attempt + 1 )) if (( attempt <= max_attempts )); then - sleep $(( (attempt - 1) * 5 )) + sleep $(( (attempt - 1) * 10 )) fi done