Compare commits

..
Author SHA1 Message Date
Paulo Santos 38a1da19ee add image version check script 2025-12-12 16:57:07 +00:00
2 changed files with 327 additions and 17 deletions
+294
View File
@@ -0,0 +1,294 @@
#!/usr/bin/env bash
################################################################################
## File: diff-image-versions.sh
## Desc: Compare software versions between two runner image releases
## Usage: ./diff-image-versions.sh <os-name> <version1> <version2>
##
## Example:
## ./diff-image-versions.sh ubuntu22 20251102.127 20251125.163
## ./diff-image-versions.sh win25 20251102.77 20251125.122
## ./diff-image-versions.sh macos-14 20251102.0024 20251125.0031
################################################################################
set -euo pipefail
usage() {
cat <<EOF
Usage: $(basename "${0}") <os-name> <version1> <version2>
Compare runner image versions and display software changes.
Arguments:
os-name OS identifier (ubuntu22, ubuntu24, win19, win22, win25,
macos-13, macos-14, macos-15, or arm64 variants)
version1 Earlier version (YYYYMMDD.NNN)
version2 Later version (YYYYMMDD.NNN)
Examples:
$(basename "${0}") ubuntu22 20251102.127 20251125.163
$(basename "${0}") win25 20251102.77 20251125.122
EOF
}
get_readme_path() {
local os_name="${1}"
local os_folder=""
local pattern=""
# Determine OS folder and readme filename pattern
case "${os_name}" in
ubuntu*)
os_folder="ubuntu"
local version="${os_name#ubuntu}"
pattern="Ubuntu${version}04-Readme.md"
;;
win*)
os_folder="windows"
local version="${os_name#win}"
pattern="Windows20${version}-Readme.md"
;;
macos*)
os_folder="macos"
pattern="${os_name}-Readme.md"
;;
*)
echo "Error: Unknown OS '${os_name}'" >&2
echo "Valid: ubuntu*, win*, macos-*" >&2
return 1
;;
esac
local readme_path="images/${os_folder}/${pattern}"
# Verify file exists in git repository
if ! git cat-file -e "HEAD:${readme_path}" 2>/dev/null; then
echo "Error: Readme not found: ${readme_path}" >&2
return 1
fi
echo "${readme_path}"
}
validate_version() {
local version="${1}"
if [[ ! "${version}" =~ ^[0-9]{8}\.[0-9]+$ ]]; then
echo "Error: Invalid version '${version}'" >&2
echo "Format: YYYYMMDD.NNN (e.g., 20251102.127)" >&2
return 1
fi
return 0
}
tag_exists() {
local tag="${1}"
if git rev-parse "${tag}" >/dev/null 2>&1; then
return 0
else
echo "Error: Tag '${tag}' not found" >&2
return 1
fi
}
main() {
# Check arguments
if [[ $# -ne 3 ]]; then
usage
return 1
fi
local os_name="${1}"
local version1="${2}"
local version2="${3}"
# Validate inputs
validate_version "${version1}" || return 1
validate_version "${version2}" || return 1
# Get readme path
local readme_path
readme_path="$(get_readme_path "${os_name}")" || return 1
# Construct git tags
local tag1="${os_name}/${version1}"
local tag2="${os_name}/${version2}"
# Verify tags exist
tag_exists "${tag1}" || return 1
tag_exists "${tag2}" || return 1
# Get release dates
local date1
local date2
date1=$(git log -1 --format="%ci" "${tag1}" | cut -d' ' -f1)
date2=$(git log -1 --format="%ci" "${tag2}" | cut -d' ' -f1)
# Calculate days between releases
local days_diff
days_diff=$(( ($(date -d "${date2}" +%s) - $(date -d "${date1}" +%s)) / 86400 ))
# Display header
echo "================================================================================"
echo "Comparing: ${os_name}"
echo " From: ${version1} (${date1})"
echo " To: ${version2} (${date2})"
echo " Span: ${days_diff} days"
echo "================================================================================"
echo ""
# Perform diff with minimal context (only changed lines with colors)
# ANSI codes: ^[[31m (red for -), ^[[32m (green for +), ^[[36m (cyan for @@)
# Filter to show only lines starting with red/green (additions/deletions)
local diff_output
diff_output=$(git diff --color=always --unified=0 "${tag1}:${readme_path}" "${tag2}:${readme_path}" | \
grep -E $'^\x1b\\[(31|32)m' | \
grep -v -E $'^\x1b\\[1m(---|\\+\\+\\+)')
if [[ -n "${diff_output}" ]]; then
# Extract announcements from both versions
local announcements1
local announcements2
announcements1=$(git show "${tag1}:${readme_path}" | sed -n '/| Announcements |/,/^\*\*\*$/p' | grep -E '^\| \[' | sed 's/^| \[/• [/' | sed 's/ |$//' || true)
announcements2=$(git show "${tag2}:${readme_path}" | sed -n '/| Announcements |/,/^\*\*\*$/p' | grep -E '^\| \[' | sed 's/^| \[/• [/' | sed 's/ |$//' || true)
# Show announcement changes
if [[ "${announcements1}" != "${announcements2}" ]]; then
echo "📢 Announcement Changes:"
echo "────────────────────────────────────────────────────────────────────────────────"
if [[ -n "${announcements2}" ]]; then
echo "${announcements2}"
else
echo "(no announcements)"
fi
echo "────────────────────────────────────────────────────────────────────────────────"
echo ""
fi
# Extract cached tools sections
local cached_tools1
local cached_tools2
cached_tools1=$(git show "${tag1}:${readme_path}" | sed -n '/^### Cached Tools$/,/^###[^#]/p' | head -n -1 || true)
cached_tools2=$(git show "${tag2}:${readme_path}" | sed -n '/^### Cached Tools$/,/^###[^#]/p' | head -n -1 || true)
# Show cached tools changes
if [[ "${cached_tools1}" != "${cached_tools2}" ]]; then
local cached_diff
cached_diff=$(git diff --color=always --unified=2 --no-index \
<(echo "${cached_tools1}") <(echo "${cached_tools2}") 2>/dev/null | \
grep -E $'(^\x1b\\[(31|32)m[-+]| #### )' | \
sed -r 's/\x1b\[m$//' || true)
if [[ -n "${cached_diff}" ]]; then
echo "🔧 Cached Tools Changes (setup-* actions):"
echo "────────────────────────────────────────────────────────────────────────────────"
echo "${cached_diff}"
echo "────────────────────────────────────────────────────────────────────────────────"
echo ""
fi
fi
echo "Full Diff:"
echo "────────────────────────────────────────────────────────────────────────────────"
echo "${diff_output}"
echo "────────────────────────────────────────────────────────────────────────────────"
echo ""
# Count changes
local changes
changes=$(echo "${diff_output}" | wc -l)
echo "Changes: ${changes} lines"
# Parse version changes for breaking change analysis
local breaking_changes=()
local removals=()
local additions=()
# Extract clean lines (strip ANSI codes)
while IFS= read -r line; do
if [[ "${line}" =~ ^\-(.+)$ ]]; then
removals+=("${BASH_REMATCH[1]}")
elif [[ "${line}" =~ ^\+(.+)$ ]]; then
additions+=("${BASH_REMATCH[1]}")
fi
done < <(echo "${diff_output}" | sed -r 's/\x1b\[[0-9;]*m//g')
# Detect breaking changes
for removed in "${removals[@]}"; do
local tool_name=""
local old_version=""
local found_match=false
# Try to extract tool name and version (handle various formats)
if [[ "${removed}" =~ ^([^0-9]+[[:space:]]+)([0-9]+\.[0-9]+[^[:space:]]*) ]]; then
tool_name="${BASH_REMATCH[1]}"
old_version="${BASH_REMATCH[2]}"
elif [[ "${removed}" =~ ^([^0-9]+[[:space:]]+v)([0-9]+\.[0-9]+[^[:space:]]*) ]]; then
tool_name="${BASH_REMATCH[1]}"
old_version="${BASH_REMATCH[2]}"
fi
# If we found a semver-style version, look for matching addition
if [[ -n "${tool_name}" && -n "${old_version}" ]]; then
for added in "${additions[@]}"; do
if [[ "${added}" =~ ^${tool_name}([0-9]+\.[0-9]+[^[:space:]]*) ]]; then
local new_version="${BASH_REMATCH[1]}"
found_match=true
# Extract major version for semver comparison
if [[ "${old_version}" =~ ^([0-9]+)\. && "${new_version}" =~ ^([0-9]+)\. ]]; then
local old_major="${BASH_REMATCH[1]}"
local new_major="${BASH_REMATCH[1]}"
[[ "${old_version}" =~ ^([0-9]+)\. ]] && old_major="${BASH_REMATCH[1]}"
[[ "${new_version}" =~ ^([0-9]+)\. ]] && new_major="${BASH_REMATCH[1]}"
if [[ ${new_major} -gt ${old_major} ]]; then
breaking_changes+=("🔴 ${tool_name}${old_version}${new_version} (major version bump)")
fi
fi
break
fi
done
fi
# If no match found and looks like a versioned tool, it's a removal
if [[ ${found_match} == false && -n "${old_version}" ]]; then
breaking_changes+=("${removed} (removed)")
elif [[ ${found_match} == false && "${removed}" =~ [0-9]+\.[0-9]+ ]]; then
breaking_changes+=("${removed} (removed)")
fi
done
# Display breaking changes
if [[ ${#breaking_changes[@]} -gt 0 ]]; then
echo ""
echo "⚠️ Breaking changes detected (${#breaking_changes[@]}):"
echo "--------------------------------------------------------------------------------"
printf '%s\n' "${breaking_changes[@]}"
echo "--------------------------------------------------------------------------------"
fi
else
echo "No changes found."
fi
# Display PR link and commit count
local pr_number
pr_number=$(git log --all --format="%s" --grep="${version2}" | \
grep -oP '\(#\K[0-9]+(?=\))' | head -1)
local commit_count
commit_count=$(git rev-list --count "${tag1}..${tag2}")
echo "Commits: ${commit_count}"
if [[ -n "${pr_number}" ]]; then
echo "PR: https://github.com/actions/runner-images/pull/${pr_number}"
fi
return 0
}
# Execute main function
main "$@"
+33 -17
View File
@@ -1,15 +1,15 @@
| Announcements | | Announcements |
|-| |-|
| [[macOS] Deprecation of Xcode 16.3 and older runtimes on macOS 15 on January 12th, 2026.](https://github.com/actions/runner-images/issues/13392) |
| [[macOS] Deprecation of Xcode 16.4 on macOS 26 on December 8th.](https://github.com/actions/runner-images/issues/13345) | | [[macOS] Deprecation of Xcode 16.4 on macOS 26 on December 8th.](https://github.com/actions/runner-images/issues/13345) |
| [[macOS] The macOS 13 Ventura based runner images will begin deprecation on September 22nd and will be fully unsupported by December 4th for GitHub and ADO](https://github.com/actions/runner-images/issues/13046) | | [[macOS] The macOS 13 Ventura based runner images will begin deprecation on September 22nd and will be fully unsupported by December 4th for GitHub and ADO](https://github.com/actions/runner-images/issues/13046) |
| [[macOS] The additional macOS 15 Sonoma Intel-based image will be available in GitHub Actions](https://github.com/actions/runner-images/issues/13045) | | [[macOS] The additional macOS 15 Sonoma Intel-based image will be available in GitHub Actions](https://github.com/actions/runner-images/issues/13045) |
| [macOS 26 (Tahoe) is now available as a public beta in GitHub Actions](https://github.com/actions/runner-images/issues/13008) | | [macOS 26 (Tahoe) is now available as a public beta in GitHub Actions](https://github.com/actions/runner-images/issues/13008) |
| [[macOS] Deprecation of 4 tools on November 3rd.](https://github.com/actions/runner-images/issues/12873) |
*** ***
# macOS 26 # macOS 26
- OS Version: macOS 26.0.1 (25A362) - OS Version: macOS 26.0.1 (25A362)
- Kernel Version: Darwin 25.0.0 - Kernel Version: Darwin 25.0.0
- Image Version: 20251209.0083.1 - Image Version: 20251203.0070.1
## Installed Software ## Installed Software
@@ -27,19 +27,19 @@
- Kotlin 2.2.21-release-469 - Kotlin 2.2.21-release-469
- Node.js 24.11.1 - Node.js 24.11.1
- Perl 5.40.2 - Perl 5.40.2
- Python3 3.14.2 - Python3 3.14.0
- Ruby 3.4.7 - Ruby 3.4.7
### Package Management ### Package Management
- Bundler 4.0.0 - Bundler 4.0.0
- Carthage 0.40.0 - Carthage 0.40.0
- CocoaPods 1.16.2 - CocoaPods 1.16.2
- Homebrew 5.0.5 - Homebrew 5.0.4
- NPM 11.6.2 - NPM 11.6.2
- Pip3 25.3 (python 3.14) - Pip3 25.3 (python 3.14)
- Pipx 1.8.0 - Pipx 1.8.0
- RubyGems 4.0.0 - RubyGems 4.0.0
- Vcpkg 2025 (build from commit 971828fe09) - Vcpkg 2025 (build from commit 80d025e829)
- Yarn 1.22.22 - Yarn 1.22.22
### Project Management ### Project Management
@@ -71,14 +71,14 @@
- Ninja 1.13.2 - Ninja 1.13.2
### Tools ### Tools
- AWS CLI 2.32.12 - AWS CLI 2.32.8
- AWS SAM CLI 1.149.0 - AWS SAM CLI 1.149.0
- AWS Session Manager CLI 1.2.764.0 - AWS Session Manager CLI 1.2.764.0
- Azure CLI 2.81.0 - Azure CLI 2.81.0
- Azure CLI (azure-devops) 1.0.2 - Azure CLI (azure-devops) 1.0.2
- Bicep CLI 0.39.26 - Bicep CLI 0.39.26
- Cmake 4.2.0 - Cmake 4.2.0
- CodeQL Action Bundle 2.23.7 - CodeQL Action Bundle 2.23.6
- Fastlane 2.229.1 - Fastlane 2.229.1
- SwiftFormat 0.58.7 - SwiftFormat 0.58.7
- Xcbeautify 3.1.1 - Xcbeautify 3.1.1
@@ -91,8 +91,8 @@
- Google Chrome 143.0.7499.41 - Google Chrome 143.0.7499.41
- Google Chrome for Testing 143.0.7499.40 - Google Chrome for Testing 143.0.7499.40
- ChromeDriver 143.0.7499.40 - ChromeDriver 143.0.7499.40
- Microsoft Edge 143.0.3650.66 - Microsoft Edge 142.0.3595.94
- Microsoft Edge WebDriver 143.0.3650.66 - Microsoft Edge WebDriver 142.0.3595.94
- Mozilla Firefox 145.0.2 - Mozilla Firefox 145.0.2
- geckodriver 0.36.0 - geckodriver 0.36.0
- Selenium server 4.38.0 - Selenium server 4.38.0
@@ -122,8 +122,8 @@
#### Python #### Python
- 3.11.9 - 3.11.9
- 3.12.10 - 3.12.10
- 3.13.11 - 3.13.10
- 3.14.2 - 3.14.1
#### Node.js #### Node.js
- 20.19.6 - 20.19.6
@@ -154,42 +154,53 @@
- PSScriptAnalyzer: 1.24.0 - PSScriptAnalyzer: 1.24.0
### Xcode ### Xcode
| Version | Build | Path | Symlinks | | Version | Build | Path | Symlinks |
| ---------------- | ------ | ---------------------------------------------- | -------------------------------------------------------------- | | ---------------- | -------- | ----------------------------------- | -------------------------------------------------------------- |
| 26.2 | 17C48 | /Applications/Xcode_26.2_Release_Candidate.app | /Applications/Xcode_26.2.0.app<br>/Applications/Xcode_26.2.app | | 26.2 (beta) | 17C5038g | /Applications/Xcode_26.2_beta_2.app | /Applications/Xcode_26.2.0.app<br>/Applications/Xcode_26.2.app |
| 26.1.1 | 17B100 | /Applications/Xcode_26.1.1.app | /Applications/Xcode_26.1.app | | 26.1.1 | 17B100 | /Applications/Xcode_26.1.1.app | /Applications/Xcode_26.1.app |
| 26.0.1 (default) | 17A400 | /Applications/Xcode_26.0.1.app | /Applications/Xcode_26.0.app<br>/Applications/Xcode.app | | 26.0.1 (default) | 17A400 | /Applications/Xcode_26.0.1.app | /Applications/Xcode_26.0.app<br>/Applications/Xcode.app |
| 16.4 | 16F6 | /Applications/Xcode_16.4.app | /Applications/Xcode_16.4.0.app |
#### Installed SDKs #### Installed SDKs
| SDK | SDK Name | Xcode Version | | SDK | SDK Name | Xcode Version |
| ------------------------- | -------------------- | ------------- | | ------------------------- | -------------------- | ------------- |
| macOS 15.5 | macosx15.5 | 16.4 |
| macOS 26.0 | macosx26.0 | 26.0.1 | | macOS 26.0 | macosx26.0 | 26.0.1 |
| macOS 26.1 | macosx26.1 | 26.1.1 | | macOS 26.1 | macosx26.1 | 26.1.1 |
| macOS 26.2 | macosx26.2 | 26.2 | | macOS 26.2 | macosx26.2 | 26.2 |
| iOS 18.5 | iphoneos18.5 | 16.4 |
| iOS 26.0 | iphoneos26.0 | 26.0.1 | | iOS 26.0 | iphoneos26.0 | 26.0.1 |
| iOS 26.1 | iphoneos26.1 | 26.1.1 | | iOS 26.1 | iphoneos26.1 | 26.1.1 |
| iOS 26.2 | iphoneos26.2 | 26.2 | | iOS 26.2 | iphoneos26.2 | 26.2 |
| Simulator - iOS 18.5 | iphonesimulator18.5 | 16.4 |
| Simulator - iOS 26.0 | iphonesimulator26.0 | 26.0.1 | | Simulator - iOS 26.0 | iphonesimulator26.0 | 26.0.1 |
| Simulator - iOS 26.1 | iphonesimulator26.1 | 26.1.1 | | Simulator - iOS 26.1 | iphonesimulator26.1 | 26.1.1 |
| Simulator - iOS 26.2 | iphonesimulator26.2 | 26.2 | | Simulator - iOS 26.2 | iphonesimulator26.2 | 26.2 |
| tvOS 18.5 | appletvos18.5 | 16.4 |
| tvOS 26.0 | appletvos26.0 | 26.0.1 | | tvOS 26.0 | appletvos26.0 | 26.0.1 |
| tvOS 26.1 | appletvos26.1 | 26.1.1 | | tvOS 26.1 | appletvos26.1 | 26.1.1 |
| tvOS 26.2 | appletvos26.2 | 26.2 | | tvOS 26.2 | appletvos26.2 | 26.2 |
| Simulator - tvOS 18.5 | appletvsimulator18.5 | 16.4 |
| Simulator - tvOS 26.0 | appletvsimulator26.0 | 26.0.1 | | Simulator - tvOS 26.0 | appletvsimulator26.0 | 26.0.1 |
| Simulator - tvOS 26.1 | appletvsimulator26.1 | 26.1.1 | | Simulator - tvOS 26.1 | appletvsimulator26.1 | 26.1.1 |
| Simulator - tvOS 26.2 | appletvsimulator26.2 | 26.2 | | Simulator - tvOS 26.2 | appletvsimulator26.2 | 26.2 |
| watchOS 11.5 | watchos11.5 | 16.4 |
| watchOS 26.0 | watchos26.0 | 26.0.1 | | watchOS 26.0 | watchos26.0 | 26.0.1 |
| watchOS 26.1 | watchos26.1 | 26.1.1 | | watchOS 26.1 | watchos26.1 | 26.1.1 |
| watchOS 26.2 | watchos26.2 | 26.2 | | watchOS 26.2 | watchos26.2 | 26.2 |
| Simulator - watchOS 11.5 | watchsimulator11.5 | 16.4 |
| Simulator - watchOS 26.0 | watchsimulator26.0 | 26.0.1 | | Simulator - watchOS 26.0 | watchsimulator26.0 | 26.0.1 |
| Simulator - watchOS 26.1 | watchsimulator26.1 | 26.1.1 | | Simulator - watchOS 26.1 | watchsimulator26.1 | 26.1.1 |
| Simulator - watchOS 26.2 | watchsimulator26.2 | 26.2 | | Simulator - watchOS 26.2 | watchsimulator26.2 | 26.2 |
| visionOS 2.5 | xros2.5 | 16.4 |
| visionOS 26.0 | xros26.0 | 26.0.1 | | visionOS 26.0 | xros26.0 | 26.0.1 |
| visionOS 26.1 | xros26.1 | 26.1.1 | | visionOS 26.1 | xros26.1 | 26.1.1 |
| visionOS 26.2 | xros26.2 | 26.2 | | visionOS 26.2 | xros26.2 | 26.2 |
| Simulator - visionOS 2.5 | xrsimulator2.5 | 16.4 |
| Simulator - visionOS 26.0 | xrsimulator26.0 | 26.0.1 | | Simulator - visionOS 26.0 | xrsimulator26.0 | 26.0.1 |
| Simulator - visionOS 26.1 | xrsimulator26.1 | 26.1.1 | | Simulator - visionOS 26.1 | xrsimulator26.1 | 26.1.1 |
| Simulator - visionOS 26.2 | xrsimulator26.2 | 26.2 | | Simulator - visionOS 26.2 | xrsimulator26.2 | 26.2 |
| DriverKit 24.5 | driverkit24.5 | 16.4 |
| DriverKit 25.0 | driverkit25.0 | 26.0.1 | | DriverKit 25.0 | driverkit25.0 | 26.0.1 |
| DriverKit 25.1 | driverkit25.1 | 26.1.1 | | DriverKit 25.1 | driverkit25.1 | 26.1.1 |
| DriverKit 25.2 | driverkit25.2 | 26.2 | | DriverKit 25.2 | driverkit25.2 | 26.2 |
@@ -197,12 +208,17 @@
#### Installed Simulators #### Installed Simulators
| Name | OS | Simulators | | Name | OS | Simulators |
| ------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| iOS 18.5 | 18.5 | iPhone 16<br>iPhone 16 Plus<br>iPhone 16 Pro<br>iPhone 16 Pro Max<br>iPhone 16e<br>iPad (A16)<br>iPad Air 11-inch (M3)<br>iPad Air 13-inch (M3)<br>iPad mini (A17 Pro)<br>iPad Pro 11-inch (M4)<br>iPad Pro 13-inch (M4) |
| iOS 18.6 | 18.6 | iPhone 16<br>iPhone 16 Plus<br>iPhone 16 Pro<br>iPhone 16 Pro Max<br>iPhone 16e<br>iPad (A16)<br>iPad Air 11-inch (M3)<br>iPad Air 13-inch (M3)<br>iPad mini (A17 Pro)<br>iPad Pro 11-inch (M4)<br>iPad Pro 13-inch (M4) |
| iOS 26.0 | 26.0.1 | iPhone 16e<br>iPhone 17<br>iPhone 17 Pro<br>iPhone 17 Pro Max<br>iPhone Air<br>iPad (A16)<br>iPad Air 11-inch (M3)<br>iPad Air 13-inch (M3)<br>iPad mini (A17 Pro)<br>iPad Pro 11-inch (M4)<br>iPad Pro 11-inch (M5)<br>iPad Pro 13-inch (M4)<br>iPad Pro 13-inch (M5) | | iOS 26.0 | 26.0.1 | iPhone 16e<br>iPhone 17<br>iPhone 17 Pro<br>iPhone 17 Pro Max<br>iPhone Air<br>iPad (A16)<br>iPad Air 11-inch (M3)<br>iPad Air 13-inch (M3)<br>iPad mini (A17 Pro)<br>iPad Pro 11-inch (M4)<br>iPad Pro 11-inch (M5)<br>iPad Pro 13-inch (M4)<br>iPad Pro 13-inch (M5) |
| iOS 26.1 | 26.1 | iPhone 16e<br>iPhone 17<br>iPhone 17 Pro<br>iPhone 17 Pro Max<br>iPhone Air<br>iPad (A16)<br>iPad Air 11-inch (M3)<br>iPad Air 13-inch (M3)<br>iPad mini (A17 Pro)<br>iPad Pro 11-inch (M5)<br>iPad Pro 13-inch (M5) | | iOS 26.1 | 26.1 | iPhone 16e<br>iPhone 17<br>iPhone 17 Pro<br>iPhone 17 Pro Max<br>iPhone Air<br>iPad (A16)<br>iPad Air 11-inch (M3)<br>iPad Air 13-inch (M3)<br>iPad mini (A17 Pro)<br>iPad Pro 11-inch (M5)<br>iPad Pro 13-inch (M5) |
| tvOS 18.5 | 18.5 | Apple TV<br>Apple TV 4K (3rd generation)<br>Apple TV 4K (3rd generation) (at 1080p) |
| tvOS 26.0 | 26.0 | Apple TV<br>Apple TV 4K (3rd generation)<br>Apple TV 4K (3rd generation) (at 1080p) | | tvOS 26.0 | 26.0 | Apple TV<br>Apple TV 4K (3rd generation)<br>Apple TV 4K (3rd generation) (at 1080p) |
| tvOS 26.1 | 26.1 | Apple TV<br>Apple TV 4K (3rd generation)<br>Apple TV 4K (3rd generation) (at 1080p) | | tvOS 26.1 | 26.1 | Apple TV<br>Apple TV 4K (3rd generation)<br>Apple TV 4K (3rd generation) (at 1080p) |
| watchOS 11.5 | 11.5 | Apple Watch SE (40mm) (2nd generation)<br>Apple Watch SE (44mm) (2nd generation)<br>Apple Watch Series 10 (42mm)<br>Apple Watch Series 10 (46mm)<br>Apple Watch Ultra 2 (49mm) |
| watchOS 26.0 | 26.0 | Apple Watch SE 3 (40mm)<br>Apple Watch SE 3 (44mm)<br>Apple Watch Series 11 (42mm)<br>Apple Watch Series 11 (46mm)<br>Apple Watch Ultra 3 (49mm) | | watchOS 26.0 | 26.0 | Apple Watch SE 3 (40mm)<br>Apple Watch SE 3 (44mm)<br>Apple Watch Series 11 (42mm)<br>Apple Watch Series 11 (46mm)<br>Apple Watch Ultra 3 (49mm) |
| watchOS 26.1 | 26.1 | Apple Watch SE 3 (40mm)<br>Apple Watch SE 3 (44mm)<br>Apple Watch Series 11 (42mm)<br>Apple Watch Series 11 (46mm)<br>Apple Watch Ultra 3 (49mm) | | watchOS 26.1 | 26.1 | Apple Watch SE 3 (40mm)<br>Apple Watch SE 3 (44mm)<br>Apple Watch Series 11 (42mm)<br>Apple Watch Series 11 (46mm)<br>Apple Watch Ultra 3 (49mm) |
| visionOS 2.5 | 2.5 | Apple Vision Pro |
| visionOS 26.0 | 26.0 | Apple Vision Pro | | visionOS 26.0 | 26.0 | Apple Vision Pro |
| visionOS 26.1 | 26.1 | Apple Vision Pro | | visionOS 26.1 | 26.1 | Apple Vision Pro |
@@ -210,7 +226,7 @@
| Package Name | Version | | Package Name | Version |
| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Android Command Line Tools | 16.0 | | Android Command Line Tools | 16.0 |
| Android Emulator | 36.3.10 | | Android Emulator | 36.2.12 |
| Android SDK Build-tools | 36.0.0 36.1.0<br>35.0.0 35.0.1 | | Android SDK Build-tools | 36.0.0 36.1.0<br>35.0.0 35.0.1 |
| Android SDK Platforms | android-36.1 (rev 1)<br>android-36-ext19 (rev 1)<br>android-36-ext18 (rev 1)<br>android-36 (rev 2)<br>android-35-ext15 (rev 1)<br>android-35-ext14 (rev 1)<br>android-35 (rev 2) | | Android SDK Platforms | android-36.1 (rev 1)<br>android-36-ext19 (rev 1)<br>android-36-ext18 (rev 1)<br>android-36 (rev 2)<br>android-35-ext15 (rev 1)<br>android-35-ext14 (rev 1)<br>android-35 (rev 2) |
| Android SDK Platform-Tools | 36.0.0 | | Android SDK Platform-Tools | 36.0.0 |