diff --git a/.github/workflows/template-validation.yml b/.github/workflows/template-validation.yml index 7358428..c488bf3 100644 --- a/.github/workflows/template-validation.yml +++ b/.github/workflows/template-validation.yml @@ -100,6 +100,7 @@ jobs: max-parallel: 1 matrix: macos_version: + - golden-gate - tahoe - sequoia - sonoma diff --git a/.github/workflows/vanilla.yml b/.github/workflows/vanilla.yml index e450ea5..044a704 100644 --- a/.github/workflows/vanilla.yml +++ b/.github/workflows/vanilla.yml @@ -13,6 +13,7 @@ on: type: choice options: - all + - golden-gate - tahoe - sequoia - sonoma @@ -46,6 +47,7 @@ jobs: max-parallel: 1 matrix: macos_version: + - golden-gate - tahoe - sequoia - sonoma diff --git a/README.md b/README.md index 9bc78e4..08a505c 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ GitHub Actions runners, [Cirrus Runners](https://cirrus-runners.app/) or [any ot The following image variants are currently available: -* `macos-{tahoe,sequoia,sonoma}-vanilla` — a vanilla macOS installation with helpful tweaks such as auto-login, but no additional software preinstalled +* `macos-{golden-gate,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. diff --git a/templates/vanilla-golden-gate.pkr.hcl b/templates/vanilla-golden-gate.pkr.hcl new file mode 100644 index 0000000..a23902c --- /dev/null +++ b/templates/vanilla-golden-gate.pkr.hcl @@ -0,0 +1,167 @@ +packer { + required_plugins { + tart = { + version = ">= 1.16.0" + source = "github.com/cirruslabs/tart" + } + ansible = { + version = "~> 1" + source = "github.com/hashicorp/ansible" + } + } +} + +source "tart-cli" "tart" { + from_ipsw = "https://updates.cdn-apple.com/2026SummerSeed/fullrestores/140-55718/5809AFC6-1923-4590-AAFC-904A0283E659/UniversalMac_27.0_26A5388g_Restore.ipsw" + vm_name = "golden-gate-vanilla" + cpu_count = 4 + memory_gb = 8 + disk_size_gb = 50 + ssh_password = "admin" + ssh_username = "admin" + ssh_timeout = "180s" + boot_command = [ + # hello, hola, bonjour, etc. + "", + # Language: most of the times we have a list of "English"[1], "English (UK)", etc. with + # "English" language already selected. If we type "english", it'll cause us to switch + # to the "English (UK)", which is not what we want. To solve this, we switch to some other + # language first, e.g. "Italiano" and then switch back to "English". We'll then jump to the + # first entry in a list of "english"-prefixed items, which will be "English". + # + # [1]: should be named "English (US)", but oh well 🤷 + "italianoenglish", + # Select Your Country or Region + "united states", + # Transfer Your Data to This Mac + "", + # Written and Spoken Languages + "", + # Accessibility + "", + # Data & Privacy + "", + # Create a Mac Account + "Managed via Tartadminadminadmin", + # Enable Voice Over + "", + # Sign In to Your Apple Account + # + # We choose "Other Sign-In Options" → "Sign in Later in Settings" here. + "", + # Are you sure you want to skip signing in with an Apple Account? + "", + # Terms and Conditions + "", + # I have read and agree to the macOS Software License Agreement + "", + # Age Range -> Adult + "", + # Choose Your Look + "", + # Enable Location Services + "", + # Are you sure you don't want to use Location Services? + "", + # Select Your Time Zone + "UTC", + # Analytics + "", + # Screen Time + "", + # Siri + "", + # You Mac is Ready for FileVault + "", + # Mac Data Will Not Be Securely Encrypted + "", + # Update Mac Automatically + "", + # Liquid Glass + "", + # Welcome to Mac + "", + # Disable Voice Over + "", + # Enable Keyboard navigation + # This is so that we can navigate the System Settings app using the keyboard + "Terminal", + "defaults write NSGlobalDomain AppleKeyboardUIMode -int 3", + # Now that the installation is done, open "System Settings" + # On Tahoe opening System Settings through Spotlight is not very reliable, sometimes opens System information + "open '/System/Applications/System Settings.app'", + "", + # Navigate to "Sharing" + "", + # Navigate to "Screen Sharing" and enable it + "", + # Type in the password to allow enabling Screen Sharing + "admin", + # Navigate to "Remote Login" and enable it + "", + # Quit System Settings + "q", + # Disable Gatekeeper (1/2) + "sudo spctl --global-disable", + "admin", + # Disable Gatekeeper (2/2) + # On Tahoe opening System Settings through Spotlight is not very reliable, sometimes opens System information + "open '/System/Applications/System Settings.app'", + "Privacy & Security", + "", + "", + "admin", + "", + # Quit System Settings + "q", + ] + + // A (hopefully) temporary workaround for Virtualization.Framework's + // installation process not fully finishing in a timely manner + create_grace_time = "30s" + + // Keep the recovery partition, otherwise it's not possible to "softwareupdate" + recovery_partition = "keep" +} + +build { + sources = ["source.tart-cli.tart"] + + provisioner "shell" { + inline = [ + // Enable passwordless sudo + "echo admin | sudo -S sh -c \"mkdir -p /etc/sudoers.d/; echo 'admin ALL=(ALL) NOPASSWD: ALL' | EDITOR=tee visudo /etc/sudoers.d/admin-nopasswd\"", + // Enable auto-login + // + // See https://github.com/xfreebird/kcpassword for details. + "echo '00000000: 1ced 3f4a bcbc ba2c caca 4e82' | sudo xxd -r - /etc/kcpassword", + "sudo defaults write /Library/Preferences/com.apple.loginwindow autoLoginUser admin", + // Disable screensaver at login screen + "sudo defaults write /Library/Preferences/com.apple.screensaver loginWindowIdleTime 0", + // Disable screensaver for admin user + "defaults -currentHost write com.apple.screensaver idleTime 0", + // Prevent the VM from sleeping + "sudo systemsetup -setsleep Off 2>/dev/null", + // Launch Safari to populate the defaults + "/Applications/Safari.app/Contents/MacOS/Safari &", + "SAFARI_PID=$!", + "disown", + "sleep 30", + "kill -9 $SAFARI_PID", + // Enable Safari's remote automation + "sudo safaridriver --enable", + // Disable screen lock + // + // Note that this only works if the user is logged-in, + // i.e. not on login screen. + "sysadminctl -screenLock off -password admin", + ] + } + + provisioner "shell" { + inline = [ + # Ensure that Gatekeeper is disabled + "spctl --status | grep -q 'assessments disabled'" + ] + } +}