mirror of
https://github.com/cirruslabs/macos-image-templates.git
synced 2026-09-30 11:51:13 +02:00
Compare commits
21
Commits
26.1-beta
...
26.2-beta-2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9115ef2553 | ||
|
|
11b22ea0d0 | ||
|
|
062ecd3e0e | ||
|
|
329c3e137e | ||
|
|
e681fe0983 | ||
|
|
2e6e2dfb6e | ||
|
|
0652373c8c | ||
|
|
082799eb6f | ||
|
|
3b47c8dfc6 | ||
|
|
69ed3fe0fa | ||
|
|
256b8cc1c8 | ||
|
|
d7752dd971 | ||
|
|
64b8b7407b | ||
|
|
91c8fbf624 | ||
|
|
aec76f172d | ||
|
|
a2b4e1ebfe | ||
|
|
1f481f72c7 | ||
|
|
463004bc84 | ||
|
|
6755f3d245 | ||
|
|
aa8af495d1 | ||
|
|
4232c64336 |
@@ -2,9 +2,6 @@ task:
|
||||
name: "Update Base Images ($MACOS_VERSION)"
|
||||
alias: update-base
|
||||
matrix:
|
||||
- env:
|
||||
MACOS_VERSION: ventura
|
||||
DISABLE_SIP_TEMPLATE: disable-sip.pkr.hcl
|
||||
- env:
|
||||
MACOS_VERSION: sonoma
|
||||
DISABLE_SIP_TEMPLATE: disable-sip.pkr.hcl
|
||||
|
||||
+13
-3
@@ -1,6 +1,5 @@
|
||||
task:
|
||||
name: "Update Runner Image ($MACOS_VERSION)"
|
||||
execution_lock: runner-image-update
|
||||
env:
|
||||
matrix:
|
||||
- MACOS_VERSION: sonoma
|
||||
@@ -9,12 +8,14 @@ task:
|
||||
- MACOS_VERSION: sequoia
|
||||
XCODE_VERSIONS: "\"26.0.1\",16.4,16.3,16.2,16.1,16"
|
||||
ADDITIONAL_IOS_BUILDS: "18.5,18.4,18.2,17.5"
|
||||
ADDITIONAL_TVOS_BUILDS: "17.5"
|
||||
XCODE_COMPONENTS: "\"MetalToolchain\""
|
||||
DISK_SIZE: 400
|
||||
- MACOS_VERSION: tahoe
|
||||
XCODE_VERSIONS: "\"26.0.1\",\"26.1-beta\""
|
||||
XCODE_VERSIONS: "\"26.1.1\",\"26.0.1\",\"26.2-beta-2\""
|
||||
XCODE_COMPONENTS: "\"MetalToolchain\""
|
||||
DISK_SIZE: 240
|
||||
ADDITIONAL_IOS_BUILDS: "18.6"
|
||||
DISK_SIZE: 300
|
||||
<<: *defaults
|
||||
pull_base_script:
|
||||
- tart pull ghcr.io/cirruslabs/macos-$MACOS_VERSION-base:latest
|
||||
@@ -25,9 +26,18 @@ task:
|
||||
-var macos_version="$MACOS_VERSION" \
|
||||
-var xcode_version="[$XCODE_VERSIONS]" \
|
||||
-var additional_ios_builds="[$ADDITIONAL_IOS_BUILDS]" \
|
||||
-var additional_tvos_builds="[$ADDITIONAL_TVOS_BUILDS]" \
|
||||
-var xcode_components="[$XCODE_COMPONENTS]" \
|
||||
-var expected_runtimes_file="data/expected.$MACOS_VERSION.runtimes.txt" \
|
||||
templates/xcode.pkr.hcl
|
||||
finalize_script: |
|
||||
if [[ -f "scripts/finalize-$MACOS_VERSION.sh" ]]; then
|
||||
packer build -var vm_name="$MACOS_VERSION-xcode:runner" \
|
||||
-var script_path="scripts/finalize-$MACOS_VERSION.sh" \
|
||||
templates/exex-script.pkr.hcl
|
||||
else
|
||||
echo "Skipping prepare script for $MACOS_VERSION"
|
||||
fi
|
||||
push_script: |
|
||||
if [[ -z "$CIRRUS_PR" ]]; then
|
||||
tart push "$MACOS_VERSION-xcode:runner" ghcr.io/cirruslabs/macos-runner:$MACOS_VERSION
|
||||
|
||||
@@ -9,7 +9,6 @@ task:
|
||||
- MACOS_VERSION: tahoe
|
||||
- MACOS_VERSION: sequoia
|
||||
- MACOS_VERSION: sonoma
|
||||
- MACOS_VERSION: ventura
|
||||
- MACOS_VERSION: monterey
|
||||
only_if: $CIRRUS_BRANCH == $CIRRUS_DEFAULT_BRANCH && changesInclude("templates/vanilla-$MACOS_VERSION.pkr.hcl")
|
||||
<<: *defaults
|
||||
|
||||
@@ -4,9 +4,12 @@ task:
|
||||
env:
|
||||
matrix:
|
||||
- MACOS_VERSION: tahoe
|
||||
XCODE_VERSION: "26.0.1"
|
||||
XCODE_VERSION: "26.1.1"
|
||||
XCODE_COMPONENTS: "MetalToolchain"
|
||||
LATEST: true
|
||||
- MACOS_VERSION: tahoe
|
||||
XCODE_VERSION: "26.0.1"
|
||||
XCODE_COMPONENTS: "MetalToolchain"
|
||||
- MACOS_VERSION: sequoia
|
||||
XCODE_VERSION: 16.4
|
||||
LATEST: true
|
||||
@@ -25,9 +28,6 @@ task:
|
||||
XCODE_VERSION: 16
|
||||
- MACOS_VERSION: sonoma
|
||||
XCODE_VERSION: 15.4
|
||||
- MACOS_VERSION: ventura
|
||||
XCODE_VERSION: 15.4
|
||||
LATEST: true
|
||||
<<: *defaults
|
||||
pull_base_script:
|
||||
- tart pull ghcr.io/cirruslabs/macos-$MACOS_VERSION-base:latest
|
||||
|
||||
@@ -13,9 +13,6 @@ env:
|
||||
|
||||
defaults: &defaults
|
||||
timeout_in: 3h
|
||||
update_script:
|
||||
- brew update || true
|
||||
- brew upgrade || true
|
||||
info_script:
|
||||
- tart --version
|
||||
- packer --version
|
||||
|
||||
@@ -5,9 +5,10 @@ Repository with Packer templates to build macOS [Tart](https://tart.run/) virtua
|
||||
|
||||
The following image variants are currently available:
|
||||
|
||||
* `macos-{tahoe,sequoia,sonoma}-base` image has only `brew` pre-installed and the latest version of `macOS` available
|
||||
* `macos-{tahoe,sequoia,sonoma}-xcode:N` image is based on `macos-{tahoe,sequoia,sonoma}-base` image and has `Xcode N` with [`Flutter`](https://flutter.dev/) pre-installed
|
||||
* `macos-runner:{tahoe,sequoia,sonoma}` image is a variant of `xcode:N` with several versions of `Xcode` pre-installed and [`xcodes` tool](https://github.com/XcodesOrg/xcodes) to switch between them.
|
||||
* `macos-{tahoe,sequoia,sonoma}-vanilla` — a vanilla macOS installation with helpful tweaks such as auto-login, but no additional software preinstalled
|
||||
* `macos-{tahoe,sequoia,sonoma}-base` — based on `macos-{tahoe,sequoia,sonoma}-vanilla` image, it comes with `brew` and [other useful software](https://github.com/cirruslabs/macos-image-templates/blob/main/templates/base.pkr.hcl) pre-installed, but without Xcode
|
||||
* `macos-{tahoe,sequoia,sonoma}-xcode:N` — based on `macos-{tahoe,sequoia,sonoma}-base` image and has `Xcode N` with [`Flutter`](https://flutter.dev/) pre-installed
|
||||
* `macos-runner:{tahoe,sequoia,sonoma}` — a variant of `xcode:N` with several versions of `Xcode` pre-installed and [`xcodes` tool](https://github.com/XcodesOrg/xcodes) to switch between them.
|
||||
|
||||
See a full list of VMs available [here](https://github.com/orgs/cirruslabs/packages?tab=packages&q=macos-).
|
||||
|
||||
|
||||
@@ -7,7 +7,8 @@ iOS 18.3 (18.3.1 - 22D8075) - com.apple.CoreSimulator.SimRuntime.iOS-18-3
|
||||
iOS 18.4 (18.4 - 22E238) - com.apple.CoreSimulator.SimRuntime.iOS-18-4
|
||||
iOS 18.5 (18.5 - 22F77) - com.apple.CoreSimulator.SimRuntime.iOS-18-5
|
||||
iOS 18.6 (18.6 - 22G86) - com.apple.CoreSimulator.SimRuntime.iOS-18-6
|
||||
iOS 26.0 (26.0 - 23A343) - com.apple.CoreSimulator.SimRuntime.iOS-26-0
|
||||
iOS 26.0 (26.0.1 - 23A8464) - com.apple.CoreSimulator.SimRuntime.iOS-26-0
|
||||
tvOS 17.5 (17.5 - 21L569) - com.apple.CoreSimulator.SimRuntime.tvOS-17-5
|
||||
tvOS 18.4 (18.4 - 22L254) - com.apple.CoreSimulator.SimRuntime.tvOS-18-4
|
||||
tvOS 18.5 (18.5 - 22L572) - com.apple.CoreSimulator.SimRuntime.tvOS-18-5
|
||||
tvOS 26.0 (26.0 - 23J352) - com.apple.CoreSimulator.SimRuntime.tvOS-26-0
|
||||
|
||||
@@ -1,9 +1,14 @@
|
||||
== Runtimes ==
|
||||
iOS 26.0 (26.0 - 23A343) - com.apple.CoreSimulator.SimRuntime.iOS-26-0
|
||||
iOS 26.1 (26.1 - 23B5044k) - com.apple.CoreSimulator.SimRuntime.iOS-26-1
|
||||
iOS 18.6 (18.6 - 22G86) - com.apple.CoreSimulator.SimRuntime.iOS-18-6
|
||||
iOS 26.0 (26.0.1 - 23A8464) - com.apple.CoreSimulator.SimRuntime.iOS-26-0
|
||||
iOS 26.1 (26.1 - 23B86) - com.apple.CoreSimulator.SimRuntime.iOS-26-1
|
||||
iOS 26.2 (26.2 - 23C5044b) - com.apple.CoreSimulator.SimRuntime.iOS-26-2
|
||||
tvOS 26.0 (26.0 - 23J352) - com.apple.CoreSimulator.SimRuntime.tvOS-26-0
|
||||
tvOS 26.1 (26.1 - 23J5543j) - com.apple.CoreSimulator.SimRuntime.tvOS-26-1
|
||||
tvOS 26.1 (26.1 - 23J579) - com.apple.CoreSimulator.SimRuntime.tvOS-26-1
|
||||
tvOS 26.2 (26.2 - 23K5046a) - com.apple.CoreSimulator.SimRuntime.tvOS-26-2
|
||||
watchOS 26.0 (26.0 - 23R353) - com.apple.CoreSimulator.SimRuntime.watchOS-26-0
|
||||
watchOS 26.1 (26.1 - 23S5002i) - com.apple.CoreSimulator.SimRuntime.watchOS-26-1
|
||||
watchOS 26.1 (26.1 - 23S36) - com.apple.CoreSimulator.SimRuntime.watchOS-26-1
|
||||
watchOS 26.2 (26.2 - 23S5297b) - com.apple.CoreSimulator.SimRuntime.watchOS-26-2
|
||||
visionOS 26.0 (26.0 - 23M336) - com.apple.CoreSimulator.SimRuntime.xrOS-26-0
|
||||
visionOS 26.1 (26.1 - 23N5013j) - com.apple.CoreSimulator.SimRuntime.xrOS-26-1
|
||||
visionOS 26.1 (26.1 - 23N47) - com.apple.CoreSimulator.SimRuntime.xrOS-26-1
|
||||
visionOS 26.2 (26.2 - 23N5296a) - com.apple.CoreSimulator.SimRuntime.xrOS-26-2
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
#!/bin/bash
|
||||
|
||||
source ~/.zprofile
|
||||
|
||||
# Set shell options to enable fail-fast behavior
|
||||
#
|
||||
# * -e: fail the script when an error occurs or command fails
|
||||
# * -u: fail the script when attempting to reference unset parameters
|
||||
# * -o pipefail: by default an exit status of a pipeline is that of its
|
||||
# last command, this fails the pipe early if an error in
|
||||
# any of its commands occurs
|
||||
#
|
||||
set -euo pipefail
|
||||
|
||||
# Wait until `xcrun simctl list devices -v` no longer reports any devices as "unavailable".
|
||||
#
|
||||
# Exit codes:
|
||||
# 0 - Success: no devices are marked as unavailable within the timeout window
|
||||
# 1 - Failure: timed out waiting for devices to become available
|
||||
# 2 - Failure: prerequisites missing (e.g., xcrun not found)
|
||||
|
||||
DEFAULT_TIMEOUT_MINUTES=60
|
||||
TIMEOUT_MINUTES=${1:-$DEFAULT_TIMEOUT_MINUTES}
|
||||
|
||||
if ! [[ "$TIMEOUT_MINUTES" =~ ^[0-9]+$ ]]; then
|
||||
echo "[wait-simulators] ERROR: TIMEOUT_MINUTES must be an integer number of minutes (got: '$TIMEOUT_MINUTES')." >&2
|
||||
exit 2
|
||||
fi
|
||||
|
||||
SECONDS_TOTAL=$(( TIMEOUT_MINUTES * 60 ))
|
||||
DEADLINE=$(( $(date +%s) + SECONDS_TOTAL ))
|
||||
SLEEP_SECONDS=15
|
||||
|
||||
# Print a one-line status snapshot of current unavailable devices (if any)
|
||||
print_status() {
|
||||
if xcrun simctl list devices -v | grep -qi "unavailable"; then
|
||||
echo "[wait-simulators] Still seeing 'unavailable' devices at $(date '+%Y-%m-%d %H:%M:%S')"
|
||||
# Show a concise list of unavailable lines for debugging
|
||||
xcrun simctl list devices -v | grep -i "unavailable" | sed 's/^/[wait-simulators] /'
|
||||
else
|
||||
echo "[wait-simulators] No 'unavailable' devices detected at $(date '+%Y-%m-%d %H:%M:%S')"
|
||||
fi
|
||||
}
|
||||
|
||||
trap 'echo "[wait-simulators] Interrupted" >&2; exit 130' INT TERM
|
||||
|
||||
echo "[wait-simulators] Waiting up to ${TIMEOUT_MINUTES} minute(s) for simulators to become available..."
|
||||
|
||||
while true; do
|
||||
if ! xcrun simctl list devices -v | grep -qi "unavailable"; then
|
||||
echo "[wait-simulators] All simulators are available."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
NOW=$(date +%s)
|
||||
if (( NOW >= DEADLINE )); then
|
||||
echo "[wait-simulators] TIMEOUT after ${TIMEOUT_MINUTES} minute(s). Some simulators remain 'unavailable'." >&2
|
||||
echo "[wait-simulators] Final snapshot of unavailable devices:" >&2
|
||||
xcrun simctl list devices -v | grep -i "unavailable" | sed 's/^/[wait-simulators] /' >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
print_status
|
||||
REMAIN=$(( DEADLINE - NOW ))
|
||||
# Sleep in chunks to allow quicker exit when they become available
|
||||
SLEEP=$SLEEP_SECONDS
|
||||
if (( REMAIN < SLEEP_SECONDS )); then SLEEP=$REMAIN; fi
|
||||
sleep "$SLEEP"
|
||||
# Loop and re-check
|
||||
done
|
||||
|
||||
|
||||
@@ -65,6 +65,7 @@ build {
|
||||
"brew --version",
|
||||
"brew update",
|
||||
"brew install wget unzip zip ca-certificates cmake gcc git-lfs jq yq gh gitlab-runner",
|
||||
"brew install equinix-labs/otel-cli/otel-cli",
|
||||
"brew install curl || true", // doesn't work on Monterey
|
||||
"brew install --cask git-credential-manager",
|
||||
"git lfs install",
|
||||
@@ -105,8 +106,6 @@ build {
|
||||
"brew install libyaml", # https://github.com/rbenv/ruby-build/discussions/2118
|
||||
"brew install rbenv",
|
||||
"echo 'if which rbenv > /dev/null; then eval \"$(rbenv init -)\"; fi' >> ~/.zprofile",
|
||||
"brew install asdf",
|
||||
"echo 'export PATH=\"$${ASDF_DATA_DIR:-$HOME/.asdf}/shims:$PATH\"' >> ~/.zprofile",
|
||||
"brew install mise",
|
||||
"source ~/.zprofile",
|
||||
"rbenv install 2.7.8", // latest 2.x.x before EOL
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
packer {
|
||||
required_plugins {
|
||||
tart = {
|
||||
version = ">= 1.12.0"
|
||||
source = "github.com/cirruslabs/tart"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
variable "vm_name" {
|
||||
type = string
|
||||
}
|
||||
|
||||
variable "script_path" {
|
||||
type = string
|
||||
description = "Path to a local script that should be uploaded and executed inside the VM."
|
||||
}
|
||||
|
||||
variable "pause_before" {
|
||||
type = string
|
||||
default = "60s"
|
||||
description = "How long Packer should wait before running the uploaded script."
|
||||
}
|
||||
|
||||
source "tart-cli" "tart" {
|
||||
vm_name = "${var.vm_name}"
|
||||
ssh_password = "admin"
|
||||
ssh_username = "admin"
|
||||
ssh_timeout = "120s"
|
||||
}
|
||||
|
||||
build {
|
||||
sources = ["source.tart-cli.tart"]
|
||||
|
||||
provisioner "shell" {
|
||||
script = var.script_path
|
||||
pause_before = var.pause_before
|
||||
}
|
||||
}
|
||||
@@ -12,7 +12,7 @@ packer {
|
||||
}
|
||||
|
||||
source "tart-cli" "tart" {
|
||||
from_ipsw = "https://updates.cdn-apple.com/2025FallFCS/fullrestores/093-37622/CE01FAB2-7F26-48EE-AEE4-5E57A7F6D8BB/UniversalMac_26.0_25A354_Restore.ipsw"
|
||||
from_ipsw = "https://updates.cdn-apple.com/2025FallFCS/fullrestores/089-04148/791B6F00-A30B-4EB0-B2E3-257167F7715B/UniversalMac_26.1_25B78_Restore.ipsw"
|
||||
vm_name = "tahoe-vanilla"
|
||||
cpu_count = 4
|
||||
memory_gb = 8
|
||||
@@ -65,10 +65,6 @@ source "tart-cli" "tart" {
|
||||
"<wait10s><tab><tab><spacebar>",
|
||||
# Siri
|
||||
"<wait10s><tab><spacebar><leftShiftOn><tab><leftShiftOff><spacebar>",
|
||||
# You Mac is Ready for FileVault
|
||||
"<wait10s><leftShiftOn><tab><tab><leftShiftOff><spacebar>",
|
||||
# Mac Data Will Not Be Securely Encrypted
|
||||
"<wait10s><tab><spacebar>",
|
||||
# Choose Your Look
|
||||
"<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>",
|
||||
# Update Mac Automatically
|
||||
|
||||
+32
-13
@@ -20,6 +20,11 @@ variable "additional_ios_builds" {
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "additional_tvos_builds" {
|
||||
type = list(string)
|
||||
default = []
|
||||
}
|
||||
|
||||
variable "xcode_components" {
|
||||
type = list(string)
|
||||
default = []
|
||||
@@ -95,6 +100,9 @@ build {
|
||||
"brew --version",
|
||||
"brew update",
|
||||
"brew upgrade",
|
||||
"brew install codex",
|
||||
"brew install --cask claude-code",
|
||||
"brew install --cask amazon-q"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -132,7 +140,7 @@ build {
|
||||
provisioner "shell" {
|
||||
inline = [
|
||||
"source ~/.zprofile",
|
||||
"brew install xcodesorg/made/xcodes",
|
||||
"brew install xcodes",
|
||||
"xcodes version",
|
||||
]
|
||||
}
|
||||
@@ -200,6 +208,15 @@ build {
|
||||
)
|
||||
}
|
||||
|
||||
provisioner "shell" {
|
||||
inline = concat(
|
||||
["source ~/.zprofile"],
|
||||
[
|
||||
for runtime in var.additional_tvos_builds : "xcodebuild -downloadPlatform tvOS -buildVersion ${runtime}"
|
||||
]
|
||||
)
|
||||
}
|
||||
|
||||
provisioner "shell" {
|
||||
inline = concat(
|
||||
["source ~/.zprofile"],
|
||||
@@ -215,7 +232,7 @@ build {
|
||||
"brew install libimobiledevice ideviceinstaller ios-deploy carthage",
|
||||
"brew install xcbeautify swiftformat swiftlint swiftgen licenseplist",
|
||||
"brew install mint tuist/tuist/tuist",
|
||||
"rbenv global 3.3.9", # fastlane conflicts with 3.4.0+ https://github.com/fastlane/fastlane/issues/29527
|
||||
"rbenv global 3.3.10", # fastlane conflicts with 3.4.0+ https://github.com/fastlane/fastlane/issues/29527
|
||||
"gem update",
|
||||
"gem install fastlane",
|
||||
"gem install cocoapods",
|
||||
@@ -322,6 +339,19 @@ build {
|
||||
]
|
||||
}
|
||||
|
||||
# Wait for the "update_dyld_sim_shared_cache" process[1][2] to finish
|
||||
# to avoid wasting CPU cycles after boot
|
||||
#
|
||||
# [1]: https://apple.stackexchange.com/questions/412101/update-dyld-sim-shared-cache-is-taking-up-a-lot-of-memory
|
||||
# [2]: https://stackoverflow.com/a/68394101/9316533
|
||||
provisioner "shell" {
|
||||
inline = [
|
||||
"source ~/.zprofile",
|
||||
"xcrun simctl runtime dyld_shared_cache update --all || sleep 180",
|
||||
"xcrun simctl list -v"
|
||||
]
|
||||
}
|
||||
|
||||
# Compatibility with GitHub Actions Runner Images, where
|
||||
# /usr/local/bin belongs to the default user. Also see [2].
|
||||
#
|
||||
@@ -333,17 +363,6 @@ build {
|
||||
]
|
||||
}
|
||||
|
||||
# Wait for the "update_dyld_sim_shared_cache" process[1][2] to finish
|
||||
# to avoid wasting CPU cycles after boot
|
||||
#
|
||||
# [1]: https://apple.stackexchange.com/questions/412101/update-dyld-sim-shared-cache-is-taking-up-a-lot-of-memory
|
||||
# [2]: https://stackoverflow.com/a/68394101/9316533
|
||||
provisioner "shell" {
|
||||
inline = [
|
||||
"sleep 1800"
|
||||
]
|
||||
}
|
||||
|
||||
// Install setup-info-generator
|
||||
provisioner "shell" {
|
||||
inline = [
|
||||
|
||||
Reference in New Issue
Block a user