diff --git a/.github/ISSUE_TEMPLATE/announcement.yml b/.github/ISSUE_TEMPLATE/announcement.yml index 7ad957a50..b6d6964f4 100644 --- a/.github/ISSUE_TEMPLATE/announcement.yml +++ b/.github/ISSUE_TEMPLATE/announcement.yml @@ -44,6 +44,7 @@ body: - label: macOS 14 Arm64 - label: macOS 15 - label: macOS 15 Arm64 + - label: macOS 26 Arm64 - label: Windows Server 2019 - label: Windows Server 2022 - label: Windows Server 2025 diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 64ae26c41..a3b104031 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -27,6 +27,7 @@ body: - label: macOS 14 Arm64 - label: macOS 15 - label: macOS 15 Arm64 + - label: macOS 26 Arm64 - label: Windows Server 2019 - label: Windows Server 2022 - label: Windows Server 2025 diff --git a/.github/ISSUE_TEMPLATE/tool-request.yml b/.github/ISSUE_TEMPLATE/tool-request.yml index 0983d76a4..ac528d458 100644 --- a/.github/ISSUE_TEMPLATE/tool-request.yml +++ b/.github/ISSUE_TEMPLATE/tool-request.yml @@ -65,6 +65,7 @@ body: - label: macOS 14 Arm64 - label: macOS 15 - label: macOS 15 Arm64 + - label: macOS 26 Arm64 - label: Windows Server 2019 - label: Windows Server 2022 - label: Windows Server 2025 diff --git a/README.md b/README.md index 2d7f2624e..467f5d21f 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ To build a VM machine from this repo's source, see the [instructions](docs/creat | --------------------|---------------------|--------------------| | Ubuntu 24.04 | `ubuntu-latest` or `ubuntu-24.04` | [ubuntu-24.04] | | Ubuntu 22.04 | `ubuntu-22.04` | [ubuntu-22.04] | +| macOS 26 Arm64 `beta` | `macos-15` or `macos-26-xlarge` | [macOS-26-arm64] | | macOS 15 | `macos-latest-large` or `macos-15-large`| [macOS-15] | | macOS 15 Arm64 | `macos-latest`, `macos-15`, or `macos-15-xlarge` | [macOS-15-arm64] | | macOS 14 | `macos-14-large`| [macOS-14] | @@ -48,6 +49,7 @@ To build a VM machine from this repo's source, see the [instructions](docs/creat [macOS-14-arm64]: https://github.com/actions/runner-images/blob/main/images/macos/macos-14-arm64-Readme.md [macOS-15]: https://github.com/actions/runner-images/blob/main/images/macos/macos-15-Readme.md [macOS-15-arm64]: https://github.com/actions/runner-images/blob/main/images/macos/macos-15-arm64-Readme.md +[macOS-26-arm64]: https://github.com/actions/runner-images/blob/main/images/macos/macos-26-arm64-Readme.md [self-hosted runners]: https://help.github.com/en/actions/hosting-your-own-runners ## Announcements diff --git a/images/macos/macos-26-arm64-Readme.md b/images/macos/macos-26-arm64-Readme.md new file mode 100644 index 000000000..5ddc1ec13 --- /dev/null +++ b/images/macos/macos-26-arm64-Readme.md @@ -0,0 +1,211 @@ +# macOS 26 +- OS Version: macOS 26.0 (25A5351b) +- Kernel Version: Darwin 25.0.0 +- Image Version: 20250910.90 + +## Installed Software + +### Language and Runtime +- .NET Core SDK: 8.0.101, 8.0.204, 8.0.303, 8.0.414, 9.0.102, 9.0.203, 9.0.305 +- Bash 3.2.57(1)-release +- Clang/LLVM 17.0.0 +- Clang/LLVM (Homebrew) 20.1.8 - available on `$(brew --prefix llvm@20)/bin/clang` +- GCC 13 (Homebrew GCC 13.4.0) - available by `gcc-13` alias +- GCC 14 (Homebrew GCC 14.3.0) - available by `gcc-14` alias +- GCC 15 (Homebrew GCC 15.1.0) - available by `gcc-15` alias +- GNU Fortran 13 (Homebrew GCC 13.4.0) - available by `gfortran-13` alias +- GNU Fortran 14 (Homebrew GCC 14.3.0) - available by `gfortran-14` alias +- GNU Fortran 15 (Homebrew GCC 15.1.0) - available by `gfortran-15` alias +- Kotlin 2.2.20-release-333 +- Node.js 24.7.0 +- Perl 5.40.2 +- Python3 3.13.7 +- Ruby 3.4.5 + +### Package Management +- Bundler 2.7.2 +- Carthage 0.40.0 +- CocoaPods 1.16.2 +- Homebrew 4.6.10 +- NPM 11.5.1 +- Pip3 25.2 (python 3.13) +- Pipx 1.7.1 +- RubyGems 3.7.2 +- Vcpkg 2025 (build from commit 5ed7006439) +- Yarn 1.22.22 + +### Project Management +- Apache Ant 1.10.15 +- Apache Maven 3.9.11 +- Gradle 9.0.0 + +### Utilities +- 7-Zip 17.05 +- aria2 1.37.0 +- azcopy 10.30.1 +- bazel 8.4.0 +- bazelisk 1.27.0 +- bsdtar 3.5.3 - available by 'tar' alias +- Curl 8.7.1 +- Git 2.50.1 +- Git LFS 3.7.0 +- GitHub CLI 2.79.0 +- GNU Tar 1.35 - available by 'gtar' alias +- GNU Wget 1.25.0 +- gpg (GnuPG) 2.4.8 +- jq 1.8.1 +- OpenSSL 3.5.2 5 Aug 2025 (Library: OpenSSL 3.5.2 5 Aug 2025) +- Packer 1.14.2 +- pkgconf 2.5.1 +- Unxip 3.2 +- yq 4.47.2 +- zstd 1.5.7 +- Ninja 1.13.1 + +### Tools +- AWS CLI 2.29.0 +- AWS SAM CLI 1.143.0 +- AWS Session Manager CLI 1.2.707.0 +- Azure CLI 2.77.0 +- Azure CLI (azure-devops) 1.0.2 +- Bicep CLI 0.37.4 +- Cmake 4.1.1 +- CodeQL Action Bundle 2.23.0 +- Fastlane 2.228.0 +- SwiftFormat 0.57.2 +- Xcbeautify 2.30.1 +- Xcode Command Line Tools 26.0.0.0.1.1755155385 +- Xcodes 1.6.2 + +### Browsers +- Safari 26.0 (21622.1.22.11.14) +- SafariDriver 26.0 (21622.1.22.11.14) +- Google Chrome 140.0.7339.133 +- Google Chrome for Testing 140.0.7339.82 +- ChromeDriver 140.0.7339.82 +- Microsoft Edge 140.0.3485.54 +- Microsoft Edge WebDriver 140.0.3485.54 +- Mozilla Firefox 142.0.1 +- geckodriver 0.36.0 +- Selenium server 4.35.0 + +#### Environment variables +| Name | Value | +| --------------- | --------------------------------------- | +| CHROMEWEBDRIVER | /usr/local/share/chromedriver-mac-arm64 | +| EDGEWEBDRIVER | /usr/local/share/edge_driver | +| GECKOWEBDRIVER | /opt/homebrew/opt/geckodriver/bin | + +### Java +| Version | Environment Variable | +| -------------------- | -------------------- | +| 11.0.28+6 | JAVA_HOME_11_arm64 | +| 17.0.16+8 | JAVA_HOME_17_arm64 | +| 21.0.8+9.0 (default) | JAVA_HOME_21_arm64 | + +### Cached Tools + +#### Ruby +- 3.2.9 +- 3.3.9 +- 3.4.5 + +#### Python +- 3.11.9 +- 3.12.10 +- 3.13.7 + +#### Node.js +- 20.19.5 +- 22.19.0 +- 24.7.0 + +#### Go +- 1.23.12 +- 1.24.7 +- 1.25.1 + +### Rust Tools +- Cargo 1.89.0 +- Rust 1.89.0 +- Rustdoc 1.89.0 +- Rustup 1.28.2 + +#### Packages +- Clippy 0.1.89 +- Rustfmt 1.8.0-stable + +### PowerShell Tools +- PowerShell 7.4.11 + +#### PowerShell Modules +- Az: 14.3.0 +- Pester: 5.7.1 +- PSScriptAnalyzer: 1.24.0 + +### Xcode +| Version | Build | Path | Symlinks | +| -------------- | ------ | -------------------------------------------- | ----------------------------------------------------------------------------------------- | +| 26.0 (default) | 17A321 | /Applications/Xcode_26_Release_Candidate.app | /Applications/Xcode_26.0.0.app
/Applications/Xcode_26.0.app
/Applications/Xcode.app | +| 16.4 | 16F6 | /Applications/Xcode_16.4.app | /Applications/Xcode_16.4.0.app | + +#### Installed SDKs +| SDK | SDK Name | Xcode Version | +| ------------------------- | -------------------- | ------------- | +| macOS 15.5 | macosx15.5 | 16.4 | +| macOS 26.0 | macosx26.0 | 26.0 | +| iOS 18.5 | iphoneos18.5 | 16.4 | +| iOS 26.0 | iphoneos26.0 | 26.0 | +| Simulator - iOS 18.5 | iphonesimulator18.5 | 16.4 | +| Simulator - iOS 26.0 | iphonesimulator26.0 | 26.0 | +| tvOS 18.5 | appletvos18.5 | 16.4 | +| tvOS 26.0 | appletvos26.0 | 26.0 | +| Simulator - tvOS 18.5 | appletvsimulator18.5 | 16.4 | +| Simulator - tvOS 26.0 | appletvsimulator26.0 | 26.0 | +| watchOS 11.5 | watchos11.5 | 16.4 | +| watchOS 26.0 | watchos26.0 | 26.0 | +| Simulator - watchOS 11.5 | watchsimulator11.5 | 16.4 | +| Simulator - watchOS 26.0 | watchsimulator26.0 | 26.0 | +| visionOS 2.5 | xros2.5 | 16.4 | +| visionOS 26.0 | xros26.0 | 26.0 | +| Simulator - visionOS 2.5 | xrsimulator2.5 | 16.4 | +| Simulator - visionOS 26.0 | xrsimulator26.0 | 26.0 | +| DriverKit 24.5 | driverkit24.5 | 16.4 | +| DriverKit 25.0 | driverkit25.0 | 26.0 | + +#### Installed Simulators +| OS | Simulators | +| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| iOS 18.5 | iPhone 16
iPhone 16 Plus
iPhone 16 Pro
iPhone 16 Pro Max
iPhone 16e
iPad (A16)
iPad Air 11-inch (M3)
iPad Air 13-inch (M3)
iPad mini (A17 Pro)
iPad Pro 11-inch (M4)
iPad Pro 13-inch (M4) | +| iOS 18.6 | iPhone 16
iPhone 16 Plus
iPhone 16 Pro
iPhone 16 Pro Max
iPhone 16e
iPad (A16)
iPad Air 11-inch (M3)
iPad Air 13-inch (M3)
iPad mini (A17 Pro)
iPad Pro 11-inch (M4)
iPad Pro 13-inch (M4) | +| iOS 26.0 | iPhone 16e
iPhone 17
iPhone 17 Pro
iPhone 17 Pro Max
iPhone Air
iPad (A16)
iPad Air 11-inch (M3)
iPad Air 13-inch (M3)
iPad mini (A17 Pro)
iPad Pro 11-inch (M4)
iPad Pro 13-inch (M4) | +| tvOS 18.5 | Apple TV
Apple TV 4K (3rd generation)
Apple TV 4K (3rd generation) (at 1080p) | +| tvOS 26.0 | Apple TV
Apple TV 4K (3rd generation)
Apple TV 4K (3rd generation) (at 1080p) | +| watchOS 11.5 | Apple Watch SE (40mm) (2nd generation)
Apple Watch SE (44mm) (2nd generation)
Apple Watch Series 10 (42mm)
Apple Watch Series 10 (46mm)
Apple Watch Ultra 2 (49mm) | +| watchOS 26.0 | Apple Watch SE 3 (40mm)
Apple Watch SE 3 (44mm)
Apple Watch Series 11 (42mm)
Apple Watch Series 11 (46mm)
Apple Watch Ultra 3 (49mm) | +| visionOS 2.5 | Apple Vision Pro | +| visionOS 26.0 | Apple Vision Pro | + +### Android +| Package Name | Version | +| -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Android Command Line Tools | 16.0 | +| Android Emulator | 36.1.9 | +| Android SDK Build-tools | 36.0.0
35.0.0 35.0.1 | +| Android SDK Platforms | android-36-ext19 (rev 1)
android-36-ext18 (rev 1)
android-36 (rev 2)
android-35-ext15 (rev 1)
android-35-ext14 (rev 1)
android-35 (rev 2)
android-34-ext8 (rev 1)
android-34-ext12 (rev 1)
android-34-ext11 (rev 1)
android-34-ext10 (rev 1)
android-33-ext5 (rev 1)
android-33-ext4 (rev 1) | +| Android SDK Platform-Tools | 36.0.0 | +| Android Support Repository | 47.0.0 | +| CMake | 3.31.5 | +| Google Play services | 49 | +| Google Repository | 58 | +| NDK | 27.3.13750724 (default)
28.2.13676358 | + +#### Environment variables +| Name | Value | +| ----------------------- | --------------------------------------------------- | +| ANDROID_HOME | /Users/runner/Library/Android/sdk | +| ANDROID_NDK | /Users/runner/Library/Android/sdk/ndk/27.3.13750724 | +| ANDROID_NDK_HOME | /Users/runner/Library/Android/sdk/ndk/27.3.13750724 | +| ANDROID_NDK_LATEST_HOME | /Users/runner/Library/Android/sdk/ndk/28.2.13676358 | +| ANDROID_NDK_ROOT | /Users/runner/Library/Android/sdk/ndk/27.3.13750724 | +| ANDROID_SDK_ROOT | /Users/runner/Library/Android/sdk | diff --git a/images/macos/scripts/build/configure-tccdb-macos.sh b/images/macos/scripts/build/configure-tccdb-macos.sh index 340b96883..acc600337 100644 --- a/images/macos/scripts/build/configure-tccdb-macos.sh +++ b/images/macos/scripts/build/configure-tccdb-macos.sh @@ -48,8 +48,8 @@ systemValuesArray=( "'kTCCServiceSystemPolicyNetworkVolumes','com.apple.Terminal',0,2,4,1,X'fade0c000000003000000001000000060000000200000012636f6d2e6170706c652e5465726d696e616c000000000003',NULL,0,'UNUSED',NULL,0,1678990068" ) for values in "${systemValuesArray[@]}"; do - if is_Sonoma || is_Sequoia; then - # TCC access table in Sonoma has extra 4 columns: pid, pid_version, boot_uuid, last_reminded + if ! is_Ventura; then + # TCC access table in Sonoma and later has extra 4 columns: pid, pid_version, boot_uuid, last_reminded configure_system_tccdb "$values,NULL,NULL,'UNUSED',${values##*,}" else configure_system_tccdb "$values" @@ -98,8 +98,8 @@ userValuesArray=( "'kTCCServiceUbiquity','com.apple.mail',0,2,0,1,NULL,NULL,NULL,'UNUSED',NULL,NULL,1551941469" ) for values in "${userValuesArray[@]}"; do - if is_Sonoma || is_Sequoia; then - # TCC access table in Sonoma has extra 4 columns: pid, pid_version, boot_uuid, last_reminded + if ! is_Ventura; then + # TCC access table in Sonoma and later has extra 4 columns: pid, pid_version, boot_uuid, last_reminded configure_user_tccdb "$values,NULL,NULL,'UNUSED',${values##*,}" else configure_user_tccdb "$values" diff --git a/images/macos/scripts/build/install-common-utils.sh b/images/macos/scripts/build/install-common-utils.sh index 68622f8d6..269ff8938 100644 --- a/images/macos/scripts/build/install-common-utils.sh +++ b/images/macos/scripts/build/install-common-utils.sh @@ -61,6 +61,7 @@ if is_SonomaX64 || is_VenturaX64 || is_SequoiaX64; then if is_SonomaX64; then osascript $HOME/utils/confirm-identified-developers-macos14.scpt $USER_PASSWORD fi + if is_SequoiaX64; then osascript $HOME/utils/confirm-identified-developers-macos15.scpt $USER_PASSWORD fi diff --git a/images/macos/scripts/docs-gen/Generate-SoftwareReport.ps1 b/images/macos/scripts/docs-gen/Generate-SoftwareReport.ps1 index 054b7a128..9cab34a63 100644 --- a/images/macos/scripts/docs-gen/Generate-SoftwareReport.ps1 +++ b/images/macos/scripts/docs-gen/Generate-SoftwareReport.ps1 @@ -37,12 +37,12 @@ $languageAndRuntime.AddNodes($(Get-ClangLLVMVersions)) $languageAndRuntime.AddNodes($(Get-GccVersions)) $languageAndRuntime.AddNodes($(Get-FortranVersions)) $languageAndRuntime.AddToolVersion("Kotlin", $(Get-KotlinVersion)) -if ((-not $os.IsSequoia)) { +if (($os.IsVentura -or $os.IsSonoma)) { $languageAndRuntime.AddToolVersion("Mono", $(Get-MonoVersion)) } $languageAndRuntime.AddToolVersion("Node.js", $(Get-NodeVersion)) $languageAndRuntime.AddToolVersion("Perl", $(Get-PerlVersion)) -if ((-not $os.IsVenturaArm64) -and (-not $os.IsSonomaArm64) -and (-not $os.IsSequoiaArm64)) { +if ((-not $os.IsArm64)) { $languageAndRuntime.AddToolVersion("PHP", $(Get-PHPVersion)) } $languageAndRuntime.AddToolVersion("Python3", $(Get-Python3Version)) @@ -53,12 +53,12 @@ $packageManagement = $installedSoftware.AddHeader("Package Management") $packageManagement.AddToolVersion("Bundler", $(Get-BundlerVersion)) $packageManagement.AddToolVersion("Carthage", $(Get-CarthageVersion)) $packageManagement.AddToolVersion("CocoaPods", $(Get-CocoaPodsVersion)) -if ((-not $os.IsVenturaArm64) -and (-not $os.IsSonomaArm64) -and (-not $os.IsSequoiaArm64)) { +if ((-not $os.IsArm64)) { $packageManagement.AddToolVersion("Composer", $(Get-ComposerVersion)) } $packageManagement.AddToolVersion("Homebrew", $(Get-HomebrewVersion)) $packageManagement.AddToolVersion("NPM", $(Get-NPMVersion)) -if ((-not $os.IsSequoia)) { +if (($os.IsVentura -or $os.IsSonoma)) { $packageManagement.AddToolVersion("NuGet", $(Get-NuGetVersion)) } $packageManagement.AddToolVersion("Pip3", $(Get-Pip3Version)) @@ -116,8 +116,8 @@ $tools.AddToolVersion("Xcode Command Line Tools", $(Get-XcodeCommandLineToolsVer $tools.AddToolVersion("Xcodes", $(Get-XcodesVersion)) # Linters -$linters = $installedSoftware.AddHeader("Linters") -if ((-not $os.IsVenturaArm64) -and (-not $os.IsSonomaArm64) -and (-not $os.IsSequoiaArm64)) { +if ((-not $os.IsArm64)) { + $linters = $installedSoftware.AddHeader("Linters") $linters.AddToolVersion("SwiftLint", $(Get-SwiftLintVersion)) } @@ -174,7 +174,7 @@ $android.AddTable($androidTable) $androidEnv = $android.AddHeader("Environment variables") $androidEnv.AddTable($(Build-AndroidEnvironmentTable)) -if ($os.IsSonoma -or $os.IsVentura -or $os.IsSequoiaX64) { +if ($os.IsSonoma -or $os.IsVentura -or (-not $os.IsArm64)) { $miscellaneous = $installedSoftware.AddHeader("Miscellaneous") } @@ -182,7 +182,7 @@ if ($os.IsSonoma -or $os.IsVentura) { $miscellaneous.AddToolVersion("Tcl/Tk", $(Get-TclTkVersion)) } -if ($os.IsSonomaX64 -or $os.IsVenturaX64 -or $os.IsSequoiaX64) { +if ((-not $os.IsArm64)) { Write-Host "Adding environment variables for parallels" diff --git a/images/macos/scripts/docs-gen/SoftwareReport.Browsers.psm1 b/images/macos/scripts/docs-gen/SoftwareReport.Browsers.psm1 index ca7f32492..86683917d 100644 --- a/images/macos/scripts/docs-gen/SoftwareReport.Browsers.psm1 +++ b/images/macos/scripts/docs-gen/SoftwareReport.Browsers.psm1 @@ -74,7 +74,7 @@ function Get-GeckodriverVersion { function Get-SeleniumVersion { $os = Get-OSVersion - if ($os.IsVenturaArm64 -or $os.IsSonomaArm64 -or $os.IsSequoiaArm64) { + if ($os.IsArm64) { $cellarPath = "/opt/homebrew/Cellar" } else { $cellarPath = "/usr/local/Cellar" diff --git a/images/macos/scripts/docs-gen/SoftwareReport.Java.psm1 b/images/macos/scripts/docs-gen/SoftwareReport.Java.psm1 index af762405b..771e033e8 100644 --- a/images/macos/scripts/docs-gen/SoftwareReport.Java.psm1 +++ b/images/macos/scripts/docs-gen/SoftwareReport.Java.psm1 @@ -2,7 +2,7 @@ function Get-JavaVersions { $defaultJavaPath = (Get-Item env:JAVA_HOME).value $os = Get-OSVersion - if ($os.IsVenturaArm64 -or $os.IsSonomaArm64 -or $os.IsSequoiaArm64) { + if ($os.IsArm64) { $javaVersions = Get-Item env:JAVA_HOME_*_arm64 } else { $javaVersions = Get-Item env:JAVA_HOME_*_X64 diff --git a/images/macos/scripts/docs-gen/SoftwareReport.Toolcache.psm1 b/images/macos/scripts/docs-gen/SoftwareReport.Toolcache.psm1 index 67576ec0d..6eb2f3d4f 100644 --- a/images/macos/scripts/docs-gen/SoftwareReport.Toolcache.psm1 +++ b/images/macos/scripts/docs-gen/SoftwareReport.Toolcache.psm1 @@ -37,7 +37,7 @@ function Build-ToolcacheSection { $nodes = @() - if ((-not $os.IsVenturaArm64) -and (-not $os.IsSonoma) -and (-not $os.IsSequoia)) { + if ($os.IsVenturaX64) { $nodes += @( [ToolVersionsListNode]::new("PyPy", $(Get-ToolcachePyPyVersions), '^\d+\.\d+', "List") ) diff --git a/images/macos/scripts/helpers/Common.Helpers.psm1 b/images/macos/scripts/helpers/Common.Helpers.psm1 index ec65b7c98..bf98adc44 100644 --- a/images/macos/scripts/helpers/Common.Helpers.psm1 +++ b/images/macos/scripts/helpers/Common.Helpers.psm1 @@ -35,9 +35,10 @@ function Get-OSVersion { IsSonoma = $($osVersion.Version.Major -eq "14") IsSonomaArm64 = $($osVersion.Version.Major -eq "14" -and $processorArchitecture -eq "arm64") IsSonomaX64 = $($osVersion.Version.Major -eq "14" -and $processorArchitecture -ne "arm64") - IsSequoia = $($osVersion.Version.Major -eq "15") - IsSequoiaArm64 = $($osVersion.Version.Major -eq "15" -and $processorArchitecture -eq "arm64") - IsSequoiaX64 = $($osVersion.Version.Major -eq "15" -and $processorArchitecture -ne "arm64") + IsSequoia = $($osVersion.Version.Major -eq "15") + IsSequoiaArm64 = $($osVersion.Version.Major -eq "15" -and $processorArchitecture -eq "arm64") + IsSequoiaX64 = $($osVersion.Version.Major -eq "15" -and $processorArchitecture -ne "arm64") + IsTahoe = $($osVersion.Version.Major -eq "26") } } diff --git a/images/macos/scripts/helpers/utils.sh b/images/macos/scripts/helpers/utils.sh index df45ad58f..8849cbcdf 100644 --- a/images/macos/scripts/helpers/utils.sh +++ b/images/macos/scripts/helpers/utils.sh @@ -45,6 +45,10 @@ is_Arm64() { [ "$(arch)" = "arm64" ] } +is_Tahoe() { + [ "$OSTYPE" = "darwin25" ] +} + is_Sequoia() { [ "$OSTYPE" = "darwin24" ] } diff --git a/images/macos/scripts/tests/BasicTools.Tests.ps1 b/images/macos/scripts/tests/BasicTools.Tests.ps1 index a86d71a53..ea69361a5 100644 --- a/images/macos/scripts/tests/BasicTools.Tests.ps1 +++ b/images/macos/scripts/tests/BasicTools.Tests.ps1 @@ -56,7 +56,7 @@ Describe "Perl" { } } -Describe "Tcl/Tk" -Skip:($os.IsVenturaArm64 -or $os.IsSonomaArm64 -or $os.IsSequoia) { +Describe "Tcl/Tk" -Skip:(-not ($os.IsVenturaX64 -or $os.IsSonomaX64)) { It "libtcl" { Test-Path "/usr/local/lib/libtcl8.6.dylib" | Should -BeTrue Test-Path "/usr/local/lib/libtk8.6.dylib" | Should -BeTrue diff --git a/images/macos/scripts/tests/Databases.Tests.ps1 b/images/macos/scripts/tests/Databases.Tests.ps1 deleted file mode 100644 index 38539136b..000000000 --- a/images/macos/scripts/tests/Databases.Tests.ps1 +++ /dev/null @@ -1,23 +0,0 @@ -Import-Module "$PSScriptRoot/../helpers/Common.Helpers.psm1" - -$os = Get-OSVersion - -Describe "MongoDB" -Skip:($os.IsVentura -or $os.IsSonoma -or $os.IsSequoia) { - It "" -TestCases @( - @{ ToolName = "mongo" } - @{ ToolName = "mongod" } - ) { - $toolsetVersion = (Get-ToolsetContent).mongodb.version - (&$ToolName --version)[2].Split('"')[-2] | Should -BeLike "$toolsetVersion*" - } -} - -Describe "PostgreSQL" -Skip:($os.IsVentura -or $os.IsSonoma -or $os.IsSequoia) { - It "PostgreSQL version should correspond to the version in the toolset" { - $toolsetVersion = (Get-ToolsetContent).postgresql.version - # Client version - (psql --version).split()[-2] | Should -BeLike "$toolsetVersion*" - # Server version - (pg_config --version).split()[-2] | Should -BeLike "$toolsetVersion*" - } -} diff --git a/images/macos/scripts/tests/Linters.Tests.ps1 b/images/macos/scripts/tests/Linters.Tests.ps1 index 93ac37e0e..e3121ce67 100644 --- a/images/macos/scripts/tests/Linters.Tests.ps1 +++ b/images/macos/scripts/tests/Linters.Tests.ps1 @@ -2,7 +2,7 @@ Import-Module "$PSScriptRoot/Helpers.psm1" -DisableNameChecking $os = Get-OSVersion -Describe "SwiftLint" -Skip:($os.IsVenturaArm64 -or $os.IsSonomaArm64 -or $os.IsSequoiaArm64) { +Describe "SwiftLint" -Skip:($os.IsArm64) { It "SwiftLint" { "swiftlint version" | Should -ReturnZeroExitCode } diff --git a/images/macos/scripts/tests/OpenSSL.Tests.ps1 b/images/macos/scripts/tests/OpenSSL.Tests.ps1 index 1fb8886a8..150eb2559 100644 --- a/images/macos/scripts/tests/OpenSSL.Tests.ps1 +++ b/images/macos/scripts/tests/OpenSSL.Tests.ps1 @@ -1,5 +1,7 @@ Import-Module "$PSScriptRoot/../helpers/Common.Helpers.psm1" +$os = Get-OSVersion + Describe "OpenSSL" { Context "OpenSSL Version" { It "OpenSSL is available" { @@ -7,17 +9,31 @@ Describe "OpenSSL" { } } - Context "OpenSSL 1.1 Path Check" { + Context "OpenSSL 1.1 Path Check" -Skip:($os.IsTahoe) { It "OpenSSL 1.1 path exists" { $openSSLpath = brew --prefix openssl@1.1 $openSSLpath | Should -Exist } } - Context "OpenSSL 1.1 is default" { + Context "OpenSSL 1.1 is default" -Skip:($os.IsTahoe) { It "Default OpenSSL version is 1.1" { $commandResult = Get-CommandResult "openssl version" $commandResult.Output | Should -Match "OpenSSL 1.1" } } + + Context "OpenSSL 3 Path Check" -Skip:(-not $os.IsTahoe) { + It "OpenSSL 3 path exists" { + $openSSLpath = brew --prefix openssl@3 + $openSSLpath | Should -Exist + } + } + + Context "OpenSSL 3 is default" -Skip:(-not $os.IsTahoe) { + It "Default OpenSSL version is 3" { + $commandResult = Get-CommandResult "openssl version" + $commandResult.Output | Should -Match "OpenSSL 3" + } + } } diff --git a/images/macos/scripts/tests/PHP.Tests.ps1 b/images/macos/scripts/tests/PHP.Tests.ps1 index 2a4ff8774..2c6c1e34b 100644 --- a/images/macos/scripts/tests/PHP.Tests.ps1 +++ b/images/macos/scripts/tests/PHP.Tests.ps1 @@ -3,7 +3,7 @@ Import-Module "$PSScriptRoot/../helpers/Common.Helpers.psm1" $os = Get-OSVersion Describe "PHP" { - Context "PHP" -Skip:($os.IsVenturaArm64 -or $os.IsSonomaArm64 -or $os.IsSequoiaArm64) { + Context "PHP" -Skip:($os.IsArm64) { It "PHP Path" { Get-ToolPath "php" | Should -Not -BeLike "/usr/bin/php*" } @@ -14,7 +14,7 @@ Describe "PHP" { } } - Context "Composer" -Skip:($os.IsVenturaArm64 -or $os.IsSonomaArm64 -or $os.IsSequoiaArm64) { + Context "Composer" -Skip:($os.IsArm64) { It "Composer" { "composer --version" | Should -ReturnZeroExitCode } diff --git a/images/macos/scripts/tests/Python.Tests.ps1 b/images/macos/scripts/tests/Python.Tests.ps1 index 079f76ba3..7b6a8c53a 100644 --- a/images/macos/scripts/tests/Python.Tests.ps1 +++ b/images/macos/scripts/tests/Python.Tests.ps1 @@ -8,7 +8,7 @@ Describe "Python3" { "python3 --version" | Should -ReturnZeroExitCode } - if ($os.IsVenturaArm64 -or $os.IsSonomaArm64 -or $os.IsSequoiaArm64) { + if ($os.IsArm64) { It "Python 3 is installed under /opt/homebrew/bin/" { Get-ToolPath "python3" | Should -BeLike "/opt/homebrew/bin/*" } @@ -33,18 +33,3 @@ Describe "Python3" { } } - -Describe "Python2" -Skip:($os.IsVentura -or $os.IsSonoma -or $os.IsSequoia) { - It "Python 2 is available" { - "/Library/Frameworks/Python.framework/Versions/2.7/bin/python --version" | Should -ReturnZeroExitCode - } - - It "Pip 2 is available" { - "/Library/Frameworks/Python.framework/Versions/2.7/bin/pip --version" | Should -ReturnZeroExitCode - } - - It "2to3 symlink does not point to Python 2" { - $2to3path = (Get-ChildItem (Get-Command 2to3).Path).Target - $2to3path | Should -Not -BeLike '/Frameworks/Python.framework/Versions/2.*' - } -} diff --git a/images/macos/scripts/tests/RubyGem.Tests.ps1 b/images/macos/scripts/tests/RubyGem.Tests.ps1 index 13a3a6f2c..c05c6a444 100644 --- a/images/macos/scripts/tests/RubyGem.Tests.ps1 +++ b/images/macos/scripts/tests/RubyGem.Tests.ps1 @@ -25,15 +25,3 @@ Describe "Fastlane" { "fastlane --version" | Should -ReturnZeroExitCode } } - -Describe "xcpretty" -Skip:($os.IsVentura -or $os.IsSonoma -or $os.IsSequoia) { - It "xcpretty" { - "xcpretty --version" | Should -ReturnZeroExitCode - } -} - -Describe "jazzy" -Skip:($os.IsVentura -or $os.IsSonoma -or $os.IsSequoia) { - It "jazzy" { - "jazzy --version" | Should -ReturnZeroExitCode - } -} diff --git a/images/macos/scripts/tests/Rust.Tests.ps1 b/images/macos/scripts/tests/Rust.Tests.ps1 index 34eab1220..df68ab143 100644 --- a/images/macos/scripts/tests/Rust.Tests.ps1 +++ b/images/macos/scripts/tests/Rust.Tests.ps1 @@ -18,21 +18,4 @@ Describe "Rust" { "cargo --version" | Should -ReturnZeroExitCode } } - Context "Cargo dependencies" -Skip:($os.IsVentura -or $os.IsSonoma -or $os.IsSequoia) { - It "bindgen" { - "bindgen --version" | Should -ReturnZeroExitCode - } - - It "cbindgen" { - "cbindgen --version" | Should -ReturnZeroExitCode - } - - It "Cargo audit" { - "cargo audit --version" | Should -ReturnZeroExitCode - } - - It "Cargo outdated" { - "cargo outdated --version" | Should -ReturnZeroExitCode - } - } } diff --git a/images/macos/scripts/tests/System.Tests.ps1 b/images/macos/scripts/tests/System.Tests.ps1 index 767f9d88a..8f2650519 100644 --- a/images/macos/scripts/tests/System.Tests.ps1 +++ b/images/macos/scripts/tests/System.Tests.ps1 @@ -3,17 +3,16 @@ Import-Module "$PSScriptRoot/../helpers/Common.Helpers.psm1" $os = Get-OSVersion Describe "Disk free space" { - It "Image has more than 25GB free space" { - # we should have at least 25 GB of free space on macOS images + It "Image has more than 30GB free space" { + # we should have at least 30 GB of free space on macOS images # 10GB here: https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops#capabilities-and-limitations # 14GB here: https://docs.github.com/en/actions/using-github-hosted-runners/using-github-hosted-runners/about-github-hosted-runners#standard-github-hosted-runners-for-public-repositories # 30GB due to: https://github.com/actions/runner-images/issues/10511 - # 25GB is the current minimum due to the size of Xcode 16.4 and it's dependencies $diskInfo = Get-PSDrive "/" $totalSpaceGB = [math]::Floor(($diskInfo.Used + $diskInfo.Free) / 1GB) $freeSpaceGB = [math]::Floor($diskInfo.Free / 1GB) Write-Host " [i] Disk size: ${totalSpaceGB} GB; Free space: ${freeSpaceGB} GB" - $freeSpaceGB | Should -BeGreaterOrEqual 25 + $freeSpaceGB | Should -BeGreaterOrEqual 30 } } @@ -31,16 +30,6 @@ Describe "Certificate" { } } -Describe "Audio device" -Skip:($os.IsVentura -or $os.IsSonoma -or $os.IsSequoia) { - It "Sox is installed" { - "sox --version" | Should -ReturnZeroExitCode - } - - It "SwitchAudioSource is installed" { - "SwitchAudioSource -c" | Should -ReturnZeroExitCode - } -} - Describe "AutomationModeTool" { It "Does not require user authentication" { automationmodetool | Out-String | Should -Match "DOES NOT REQUIRE" diff --git a/images/macos/scripts/tests/Toolcache.Tests.ps1 b/images/macos/scripts/tests/Toolcache.Tests.ps1 index 6a07313b6..31131df0d 100644 --- a/images/macos/scripts/tests/Toolcache.Tests.ps1 +++ b/images/macos/scripts/tests/Toolcache.Tests.ps1 @@ -57,7 +57,7 @@ Describe "Toolcache" { } } - Context "Ruby" -Skip:($os.IsVenturaArm64 -or $os.IsSonomaArm64 -or $os.IsSequoiaArm64) { + Context "Ruby" -Skip:($os.IsArm64) { $rubyDirectory = Join-Path $toolcacheDirectory "Ruby" $rubyPackage = $packages | Where-Object { $_.ToolName -eq "Ruby" } | Select-Object -First 1 $testCase = @{ RubyDirectory = $rubyDirectory } @@ -99,7 +99,7 @@ Describe "Toolcache" { } } } - Context "PyPy" -Skip:($os.IsVenturaArm64 -or $os.IsSonoma -or $os.IsSequoia) { + Context "PyPy" -Skip:(-not $os.IsVenturaX64) { $pypyDirectory = Join-Path $toolcacheDirectory "PyPy" $pypyPackage = $packages | Where-Object { $_.ToolName -eq "pypy" } | Select-Object -First 1 $testCase = @{ PypyDirectory = $pypyDirectory } diff --git a/images/macos/templates/macOS-26.arm64.anka.pkr.hcl b/images/macos/templates/macOS-26.arm64.anka.pkr.hcl new file mode 100644 index 000000000..6439d235c --- /dev/null +++ b/images/macos/templates/macOS-26.arm64.anka.pkr.hcl @@ -0,0 +1,292 @@ +packer { + required_plugins { + veertu-anka = { + version = ">= v3.2.0" + source = "github.com/veertuinc/veertu-anka" + } + } +} + +locals { + image_folder = "/Users/${var.vm_username}/image-generation" +} + +variable "builder_type" { + type = string + default = "veertu-anka-vm-clone" + validation { + condition = contains(["veertu-anka-vm-clone", "null"], var.builder_type) + error_message = "The builder_type value must be one of [veertu-anka-vm-clone, null]." + } +} + +variable "source_vm_name" { + type = string +} + +variable "source_vm_port" { + type = number + default = 22 +} + +variable "source_vm_tag" { + type = string + default = "" +} + +variable "socks_proxy" { + type = string + default = "" +} + +variable "build_id" { + type = string +} + +variable "vm_username" { + type = string + sensitive = true +} + +variable "vm_password" { + type = string + sensitive = true +} + +variable "github_api_pat" { + type = string + sensitive = true + default = "" +} + +variable "xcode_install_storage_url" { + type = string + sensitive = true +} + +variable "xcode_install_sas" { + type = string + sensitive = true +} + +variable "vcpu_count" { + type = string + default = "6" +} + +variable "ram_size" { + type = string + default = "8G" +} + +variable "image_os" { + type = string + default = "macos26" +} + +source "veertu-anka-vm-clone" "template" { + vm_name = "${var.build_id}" + source_vm_name = "${var.source_vm_name}" + source_vm_tag = "${var.source_vm_tag}" + vcpu_count = "${var.vcpu_count}" + ram_size = "${var.ram_size}" + stop_vm = "true" + log_level = "debug" +} + +source "null" "template" { + ssh_host = "${var.source_vm_name}" + ssh_port = "${var.source_vm_port}" + ssh_username = "${var.vm_username}" + ssh_password = "${var.vm_password}" + ssh_proxy_host = "${var.socks_proxy}" +} + +build { + sources = ["source.${var.builder_type}.template"] + + provisioner "shell" { + inline = ["mkdir ${local.image_folder}"] + } + + provisioner "file" { + destination = "${local.image_folder}/" + sources = [ + "${path.root}/../scripts/tests", + "${path.root}/../scripts/docs-gen", + "${path.root}/../scripts/helpers" + ] + } + + provisioner "file" { + destination = "${local.image_folder}/docs-gen/" + source = "${path.root}/../../../helpers/software-report-base" + } + + provisioner "file" { + destination = "${local.image_folder}/add-certificate.swift" + source = "${path.root}/../assets/add-certificate.swift" + } + + provisioner "file" { + destination = ".bashrc" + source = "${path.root}/../assets/bashrc" + } + + provisioner "file" { + destination = ".bash_profile" + source = "${path.root}/../assets/bashprofile" + } + + provisioner "shell" { + inline = ["mkdir ~/bootstrap"] + } + + provisioner "file" { + destination = "bootstrap" + source = "${path.root}/../assets/bootstrap-provisioner/" + } + + provisioner "file" { + destination = "${local.image_folder}/toolset.json" + source = "${path.root}/../toolsets/toolset-26.json" + } + + provisioner "shell" { + execute_command = "sudo sh -c '{{ .Vars }} {{ .Path }}'" + inline = [ + "mv ${local.image_folder}/docs-gen ${local.image_folder}/software-report", + "mkdir ~/utils", + "mv ${local.image_folder}/helpers/invoke-tests.sh ~/utils", + "mv ${local.image_folder}/helpers/utils.sh ~/utils" + ] + } + + provisioner "shell" { + execute_command = "chmod +x {{ .Path }}; source $HOME/.bash_profile; {{ .Vars }} {{ .Path }}" + scripts = [ + "${path.root}/../scripts/build/install-xcode-clt.sh", + "${path.root}/../scripts/build/install-homebrew.sh", + "${path.root}/../scripts/build/install-rosetta.sh" + ] + } + + provisioner "shell" { + environment_vars = ["PASSWORD=${var.vm_password}", "USERNAME=${var.vm_username}"] + execute_command = "chmod +x {{ .Path }}; source $HOME/.bash_profile; sudo {{ .Vars }} {{ .Path }}" + scripts = [ + "${path.root}/../scripts/build/configure-tccdb-macos.sh", + "${path.root}/../scripts/build/configure-autologin.sh", + "${path.root}/../scripts/build/configure-auto-updates.sh", + "${path.root}/../scripts/build/configure-ntpconf.sh", + "${path.root}/../scripts/build/configure-shell.sh" + ] + } + + provisioner "shell" { + environment_vars = ["IMAGE_VERSION=${var.build_id}", "IMAGE_OS=${var.image_os}", "PASSWORD=${var.vm_password}"] + execute_command = "chmod +x {{ .Path }}; source $HOME/.bash_profile; {{ .Vars }} {{ .Path }}" + scripts = [ + "${path.root}/../scripts/build/configure-preimagedata.sh", + "${path.root}/../scripts/build/configure-ssh.sh", + "${path.root}/../scripts/build/configure-machine.sh" + ] + } + + provisioner "shell" { + execute_command = "source $HOME/.bash_profile; sudo {{ .Vars }} {{ .Path }}" + expect_disconnect = true + inline = ["echo 'Reboot VM'", "shutdown -r now"] + } + + provisioner "shell" { + environment_vars = ["API_PAT=${var.github_api_pat}", "USER_PASSWORD=${var.vm_password}", "IMAGE_FOLDER=${local.image_folder}"] + execute_command = "chmod +x {{ .Path }}; source $HOME/.bash_profile; {{ .Vars }} {{ .Path }}" + pause_before = "30s" + scripts = [ + "${path.root}/../scripts/build/configure-windows.sh", + "${path.root}/../scripts/build/install-powershell.sh", + "${path.root}/../scripts/build/install-dotnet.sh", + "${path.root}/../scripts/build/install-python.sh", + "${path.root}/../scripts/build/install-azcopy.sh", + "${path.root}/../scripts/build/install-ruby.sh", + "${path.root}/../scripts/build/install-rubygems.sh", + "${path.root}/../scripts/build/install-git.sh", + "${path.root}/../scripts/build/install-node.sh", + "${path.root}/../scripts/build/install-common-utils.sh" + ] + } + + provisioner "shell" { + environment_vars = ["XCODE_INSTALL_STORAGE_URL=${var.xcode_install_storage_url}", "XCODE_INSTALL_SAS=${var.xcode_install_sas}", "IMAGE_FOLDER=${local.image_folder}"] + execute_command = "chmod +x {{ .Path }}; source $HOME/.bash_profile; {{ .Vars }} pwsh -f {{ .Path }}" + script = "${path.root}/../scripts/build/Install-Xcode.ps1" + } + + provisioner "shell" { + execute_command = "source $HOME/.bash_profile; sudo {{ .Vars }} {{ .Path }}" + expect_disconnect = true + inline = ["echo 'Reboot VM'", "shutdown -r now"] + } + + provisioner "shell" { + environment_vars = ["API_PAT=${var.github_api_pat}", "IMAGE_FOLDER=${local.image_folder}"] + execute_command = "chmod +x {{ .Path }}; source $HOME/.bash_profile; {{ .Vars }} {{ .Path }}" + scripts = [ + "${path.root}/../scripts/build/install-actions-cache.sh", + "${path.root}/../scripts/build/install-runner-package.sh", + "${path.root}/../scripts/build/install-llvm.sh", + "${path.root}/../scripts/build/install-openjdk.sh", + "${path.root}/../scripts/build/install-aws-tools.sh", + "${path.root}/../scripts/build/install-rust.sh", + "${path.root}/../scripts/build/install-gcc.sh", + "${path.root}/../scripts/build/install-cocoapods.sh", + "${path.root}/../scripts/build/install-android-sdk.sh", + "${path.root}/../scripts/build/install-vcpkg.sh", + "${path.root}/../scripts/build/install-safari.sh", + "${path.root}/../scripts/build/install-chrome.sh", + "${path.root}/../scripts/build/install-firefox.sh", + "${path.root}/../scripts/build/install-bicep.sh", + "${path.root}/../scripts/build/install-codeql-bundle.sh", + "${path.root}/../scripts/build/install-edge.sh" + ] + } + + provisioner "shell" { + environment_vars = ["IMAGE_FOLDER=${local.image_folder}"] + execute_command = "chmod +x {{ .Path }}; source $HOME/.bash_profile; {{ .Vars }} pwsh -f {{ .Path }}" + scripts = [ + "${path.root}/../scripts/build/Install-Toolset.ps1", + "${path.root}/../scripts/build/Configure-Toolset.ps1" + ] + } + + provisioner "shell" { + environment_vars = ["IMAGE_FOLDER=${local.image_folder}"] + execute_command = "chmod +x {{ .Path }}; source $HOME/.bash_profile; {{ .Vars }} pwsh -f {{ .Path }}" + script = "${path.root}/../scripts/build/Configure-Xcode-Simulators.ps1" + } + + provisioner "shell" { + environment_vars = ["IMAGE_FOLDER=${local.image_folder}"] + execute_command = "source $HOME/.bash_profile; {{ .Vars }} {{ .Path }}" + inline = [ + "pwsh -File \"${local.image_folder}/software-report/Generate-SoftwareReport.ps1\" -OutputDirectory \"${local.image_folder}/output/software-report\" -ImageName ${var.build_id}", + "pwsh -File \"${local.image_folder}/tests/RunAll-Tests.ps1\"" + ] + } + + provisioner "file" { + destination = "${path.root}/../../image-output/" + direction = "download" + source = "${local.image_folder}/output/" + } + + provisioner "shell" { + execute_command = "chmod +x {{ .Path }}; source $HOME/.bash_profile; {{ .Vars }} {{ .Path }}" + scripts = [ + "${path.root}/../scripts/build/configure-hostname.sh", + "${path.root}/../scripts/build/configure-system.sh" + ] + } +} diff --git a/images/macos/toolsets/toolset-26.json b/images/macos/toolsets/toolset-26.json new file mode 100644 index 000000000..7a0c68029 --- /dev/null +++ b/images/macos/toolsets/toolset-26.json @@ -0,0 +1,191 @@ +{ + "xcode": { + "default": "26_Release_Candidate", + "arm64":{ + "versions": [ + { + "link": "26_Release_Candidate", + "filename": "26_Release_Candidate_Universal", + "version": "26_Release_Candidate+17A321", + "symlinks": ["26.0"], + "sha256": "d56b62964b21c25901e5e48db22ff40862ff490fd3f955704ecd53ca9076db4e", + "install_runtimes": "default" + }, + { + "link": "16.4", + "filename": "16.4", + "version": "16.4.0+16F6", + "sha256": "2dbf65ba28fb85b34e72c14c529a42d5c3189ab0f11fb29fdebd5f4ee6c87900", + "install_runtimes": [ + { "iOS": ["18.5", "18.6"] }, + { "watchOS": ["11.5"] }, + { "tvOS": ["18.5"] }, + { "visionOS": ["2.5"] } + ] + } + ] + } + }, + "java": { + "x64": { + "default": "21", + "versions": [ "11", "17", "21"] + }, + "arm64": { + "default": "21", + "versions": [ "11", "17", "21"] + } + }, + "android": { + "cmdline-tools": "commandlinetools-mac-12266719_latest.zip", + "sdk-tools": "sdk-tools-darwin-4333796.zip", + "platform_min_version": "35", + "build_tools_min_version": "35.0.0", + "extras": [ + "android;m2repository", "google;m2repository", "google;google_play_services" + ], + "addons": [], + "additional_tools": [ + "cmake;3.31.5" + ], + "ndk": { + "default": "27", + "versions": [ + "27","28" + ] + } + }, + "powershellModules": [ + { + "name": "Az", + "versions": [ + "14.3.0" + ] + }, + { "name": "Pester" }, + { "name": "PSScriptAnalyzer" } + ], + "brew": { + "common_packages": [ + "ant", + "aria2", + "azure-cli", + "bazelisk", + "carthage", + "cmake", + "gh", + "gnupg", + "gnu-tar", + "kotlin", + "libpq", + "libsodium", + "openssl", + "p7zip", + "packer", + "perl", + "pkgconf", + "swiftformat", + "zstd", + "ninja", + "gmp", + "yq", + "unxip", + "xcbeautify", + "xcodes" + ], + "cask_packages": [ + "parallels" + ] + }, + "gcc": { + "versions": [ + "13", + "14", + "15" + ] + }, + "dotnet": { + "arch":{ + "arm64": { + "versions": [ + "8.0", + "9.0" + ] + } + } + }, + "ruby": { + "default": "3.4", + "rubygems": [ + "cocoapods", + "bundler", + "fastlane" + ] + }, + "toolcache": [ + { + "name": "Python", + "url" : "https://raw.githubusercontent.com/actions/python-versions/main/versions-manifest.json", + "platform" : "darwin", + "arch": { + "arm64": { + "versions": [ + "3.11.*", + "3.12.*", + "3.13.*" + ] + } + } + }, + { + "name": "Node", + "url" : "https://raw.githubusercontent.com/actions/node-versions/main/versions-manifest.json", + "platform" : "darwin", + "arch": { + "arm64": { + "versions": [ + "20.*", + "22.*", + "24.*" + ] + } + } + }, + { + "name": "Go", + "url" : "https://raw.githubusercontent.com/actions/go-versions/main/versions-manifest.json", + "platform" : "darwin", + "arch": { + "arm64": { + "variable_template" : "GOROOT_{0}_{1}_ARM64", + "versions": [ + "1.23.*", + "1.24.*", + "1.25.*" + ] + } + } + }, + { + "name": "Ruby", + "arch": { + "arm64": { + "versions": [ + "3.2.*", + "3.3.*", + "3.4.*" + ] + } + } + } + ], + "node": { + "default": "24" + }, + "llvm": { + "version": "20" + }, + "pwsh": { + "version": "7.4" + } +}