[macOS] Introduce macOS-26 base code (#13007)

This commit is contained in:
Erik Bershel
2025-09-11 23:49:57 +02:00
committed by GitHub
parent a4fd58c860
commit e812bbc619
25 changed files with 751 additions and 108 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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<br>/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
| 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<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 | 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 | 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 13-inch (M4) |
| tvOS 18.5 | Apple TV<br>Apple TV 4K (3rd generation)<br>Apple TV 4K (3rd generation) (at 1080p) |
| tvOS 26.0 | Apple TV<br>Apple TV 4K (3rd generation)<br>Apple TV 4K (3rd generation) (at 1080p) |
| watchOS 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 | 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 | 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<br>35.0.0 35.0.1 |
| Android SDK Platforms | 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)<br>android-34-ext8 (rev 1)<br>android-34-ext12 (rev 1)<br>android-34-ext11 (rev 1)<br>android-34-ext10 (rev 1)<br>android-33-ext5 (rev 1)<br>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)<br>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 |

View File

@@ -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"

View File

@@ -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

View File

@@ -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"

View File

@@ -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"

View File

@@ -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

View File

@@ -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")
)

View File

@@ -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")
}
}

View File

@@ -45,6 +45,10 @@ is_Arm64() {
[ "$(arch)" = "arm64" ]
}
is_Tahoe() {
[ "$OSTYPE" = "darwin25" ]
}
is_Sequoia() {
[ "$OSTYPE" = "darwin24" ]
}

View File

@@ -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

View File

@@ -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 "<ToolName>" -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*"
}
}

View File

@@ -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
}

View File

@@ -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"
}
}
}

View File

@@ -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
}

View File

@@ -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.*'
}
}

View File

@@ -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
}
}

View File

@@ -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
}
}
}

View File

@@ -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"

View File

@@ -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 }

View File

@@ -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"
]
}
}

View File

@@ -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"
}
}