Compare commits

..
1 Commits
Author SHA1 Message Date
Nikolay Edigaryev a9f16e07e6 Provide a default when stdinpass variable is not set 2025-02-11 23:03:01 +01:00
23 changed files with 83 additions and 611 deletions
-10
View File
@@ -2,26 +2,16 @@ task:
name: "Update Base Images ($MACOS_VERSION)" name: "Update Base Images ($MACOS_VERSION)"
alias: update-base alias: update-base
matrix: matrix:
- env:
MACOS_VERSION: ventura
DISABLE_SIP_TEMPLATE: disable-sip.pkr.hcl
- env: - env:
MACOS_VERSION: sonoma MACOS_VERSION: sonoma
DISABLE_SIP_TEMPLATE: disable-sip.pkr.hcl
- env: - env:
MACOS_VERSION: sequoia MACOS_VERSION: sequoia
DISABLE_SIP_TEMPLATE: disable-sip-with-username.pkr.hcl
- env:
MACOS_VERSION: tahoe
DISABLE_SIP_TEMPLATE: disable-sip-with-username.pkr.hcl
<<: *defaults <<: *defaults
pull_vanilla_script: pull_vanilla_script:
- tart pull ghcr.io/cirruslabs/macos-$MACOS_VERSION-vanilla:latest - tart pull ghcr.io/cirruslabs/macos-$MACOS_VERSION-vanilla:latest
build_base_script: build_base_script:
- packer init templates/base.pkr.hcl - packer init templates/base.pkr.hcl
- packer build -var macos_version="$MACOS_VERSION" templates/base.pkr.hcl - packer build -var macos_version="$MACOS_VERSION" templates/base.pkr.hcl
disable_sip_script:
- packer build -var vm_name=$MACOS_VERSION-base "templates/${DISABLE_SIP_TEMPLATE}"
push_base_script: push_base_script:
- tart push $MACOS_VERSION-base ghcr.io/cirruslabs/macos-$MACOS_VERSION-base:latest - tart push $MACOS_VERSION-base ghcr.io/cirruslabs/macos-$MACOS_VERSION-base:latest
always: always:
+4 -6
View File
@@ -1,16 +1,14 @@
task: task:
name: "Release Xcode $CIRRUS_TAG ($MACOS_VERSION)" name: "Release Xcode $CIRRUS_TAG ($MACOS_VERSION)"
env: matrix:
XCODE_COMPONENTS: "MetalToolchain" - env:
matrix: MACOS_VERSION: sequoia
- MACOS_VERSION: tahoe
- MACOS_VERSION: sequoia
<<: *defaults <<: *defaults
pull_base_script: pull_base_script:
- tart pull ghcr.io/cirruslabs/macos-$MACOS_VERSION-base:latest - tart pull ghcr.io/cirruslabs/macos-$MACOS_VERSION-base:latest
build_script: build_script:
- packer init templates/xcode.pkr.hcl - packer init templates/xcode.pkr.hcl
- packer build -var macos_version="$MACOS_VERSION" -var xcode_version="[\"$CIRRUS_TAG\"]" -var xcode_components="[\"$XCODE_COMPONENTS\"]" templates/xcode.pkr.hcl - packer build -var macos_version="$MACOS_VERSION" -var xcode_version="[\"$CIRRUS_TAG\"]" templates/xcode.pkr.hcl
push_script: | push_script: |
if [[ $CIRRUS_TAG == *"beta"* ]] if [[ $CIRRUS_TAG == *"beta"* ]]
then then
+6 -18
View File
@@ -4,17 +4,11 @@ task:
env: env:
matrix: matrix:
- MACOS_VERSION: sonoma - MACOS_VERSION: sonoma
XCODE_VERSIONS: "16.1" XCODE_VERSIONS: "16.1,16,15.4,15.3,15.2,15.1,\"15.0.1\""
DISK_SIZE: 190 DISK_SIZE: 375
- MACOS_VERSION: sequoia - MACOS_VERSION: sequoia
XCODE_VERSIONS: "26,16.4,16.3,16.2,16.1,16" XCODE_VERSIONS: "16.2,16.1,16,15.4"
ADDITIONAL_IOS_BUILDS: "18.5,18.4,18.2,17.5" DISK_SIZE: 320
XCODE_COMPONENTS: "\"MetalToolchain\""
DISK_SIZE: 400
- MACOS_VERSION: tahoe
XCODE_VERSIONS: "26"
XCODE_COMPONENTS: "\"MetalToolchain\""
DISK_SIZE: 210
<<: *defaults <<: *defaults
pull_base_script: pull_base_script:
- tart pull ghcr.io/cirruslabs/macos-$MACOS_VERSION-base:latest - tart pull ghcr.io/cirruslabs/macos-$MACOS_VERSION-base:latest
@@ -24,16 +18,10 @@ task:
-var disk_free_mb=100000 \ -var disk_free_mb=100000 \
-var macos_version="$MACOS_VERSION" \ -var macos_version="$MACOS_VERSION" \
-var xcode_version="[$XCODE_VERSIONS]" \ -var xcode_version="[$XCODE_VERSIONS]" \
-var additional_ios_builds="[$ADDITIONAL_IOS_BUILDS]" \ -var additional_runtimes="[$ADDITIONAL_RUNTIMES]" \
-var xcode_components="[$XCODE_COMPONENTS]" \
-var expected_runtimes_file="data/expected.$MACOS_VERSION.runtimes.txt" \
templates/xcode.pkr.hcl templates/xcode.pkr.hcl
push_script: | push_script: |
if [[ -z "$CIRRUS_PR" ]]; then tart push "$MACOS_VERSION-xcode:runner" ghcr.io/cirruslabs/macos-runner:$MACOS_VERSION
tart push "$MACOS_VERSION-xcode:runner" ghcr.io/cirruslabs/macos-runner:$MACOS_VERSION
else
echo "Skipping pushing for PR..."
fi
always: always:
cleanup_script: cleanup_script:
- tart delete "$MACOS_VERSION-xcode:runner" - tart delete "$MACOS_VERSION-xcode:runner"
+4 -2
View File
@@ -1,4 +1,5 @@
env: env:
RESOLVE_VM_BASE_NAME: "ghcr.io/cirruslabs/macos-${MACOS_VERSION}-vanilla:latest"
RESOLVE_VM_NAME: "resolve-macos-number-task-id-${CIRRUS_TASK_ID}" RESOLVE_VM_NAME: "resolve-macos-number-task-id-${CIRRUS_TASK_ID}"
RESOLVE_FILE: "${RESOLVE_VM_NAME}.txt" RESOLVE_FILE: "${RESOLVE_VM_NAME}.txt"
@@ -6,7 +7,6 @@ task:
name: "Update Vanilla Image ($MACOS_VERSION)" name: "Update Vanilla Image ($MACOS_VERSION)"
env: env:
matrix: matrix:
- MACOS_VERSION: tahoe
- MACOS_VERSION: sequoia - MACOS_VERSION: sequoia
- MACOS_VERSION: sonoma - MACOS_VERSION: sonoma
- MACOS_VERSION: ventura - MACOS_VERSION: ventura
@@ -16,8 +16,10 @@ task:
build_script: build_script:
- packer init templates/vanilla-$MACOS_VERSION.pkr.hcl - packer init templates/vanilla-$MACOS_VERSION.pkr.hcl
- packer build templates/vanilla-$MACOS_VERSION.pkr.hcl - packer build templates/vanilla-$MACOS_VERSION.pkr.hcl
disable_sip_script:
- packer build -var vm_name=$MACOS_VERSION-vanilla templates/disable-sip.pkr.hcl
resolve_macos_number_script: resolve_macos_number_script:
- packer build -var vm_base_name=$MACOS_VERSION-vanilla -var vm_name=$RESOLVE_VM_NAME -var resolve_file=$RESOLVE_FILE templates/resolve-macos-number.pkr.hcl - packer build -var vm_base_name=$RESOLVE_VM_BASE_NAME -var vm_name=$RESOLVE_VM_NAME -var resolve_file=$RESOLVE_FILE templates/resolve-macos-number.pkr.hcl
- echo "MACOS_NUMBER=$(cat $RESOLVE_FILE)" >> $CIRRUS_ENV - echo "MACOS_NUMBER=$(cat $RESOLVE_FILE)" >> $CIRRUS_ENV
- rm $RESOLVE_FILE - rm $RESOLVE_FILE
- tart delete $RESOLVE_VM_NAME - tart delete $RESOLVE_VM_NAME
+12 -13
View File
@@ -3,21 +3,15 @@ task:
depends_on: update-base depends_on: update-base
env: env:
matrix: matrix:
- MACOS_VERSION: tahoe
XCODE_VERSION: 26
XCODE_COMPONENTS: "MetalToolchain"
LATEST: true
- MACOS_VERSION: sequoia
XCODE_VERSION: 16.4
LATEST: true
- MACOS_VERSION: sequoia
XCODE_VERSION: 16.3
- MACOS_VERSION: sequoia - MACOS_VERSION: sequoia
XCODE_VERSION: 16.2 XCODE_VERSION: 16.2
LATEST: true
- MACOS_VERSION: sequoia - MACOS_VERSION: sequoia
XCODE_VERSION: 16.1 XCODE_VERSION: 16.1
- MACOS_VERSION: sequoia - MACOS_VERSION: sequoia
XCODE_VERSION: 16 XCODE_VERSION: 16
- MACOS_VERSION: sequoia
XCODE_VERSION: 15.4
- MACOS_VERSION: sonoma - MACOS_VERSION: sonoma
XCODE_VERSION: 16.1 XCODE_VERSION: 16.1
LATEST: true LATEST: true
@@ -25,15 +19,20 @@ task:
XCODE_VERSION: 16 XCODE_VERSION: 16
- MACOS_VERSION: sonoma - MACOS_VERSION: sonoma
XCODE_VERSION: 15.4 XCODE_VERSION: 15.4
- MACOS_VERSION: ventura - MACOS_VERSION: sonoma
XCODE_VERSION: 15.4 XCODE_VERSION: 15.3
LATEST: true - MACOS_VERSION: sonoma
XCODE_VERSION: 15.2
- MACOS_VERSION: sonoma
XCODE_VERSION: 15.1
- MACOS_VERSION: sonoma
XCODE_VERSION: 15.0.1
<<: *defaults <<: *defaults
pull_base_script: pull_base_script:
- tart pull ghcr.io/cirruslabs/macos-$MACOS_VERSION-base:latest - tart pull ghcr.io/cirruslabs/macos-$MACOS_VERSION-base:latest
build_xcode_script: build_xcode_script:
- packer init templates/xcode.pkr.hcl - packer init templates/xcode.pkr.hcl
- packer build -var macos_version="$MACOS_VERSION" -var xcode_version="[\"$XCODE_VERSION\"]" -var xcode_components="[$XCODE_COMPONENTS]" templates/xcode.pkr.hcl - packer build -var macos_version="$MACOS_VERSION" -var xcode_version="[\"$XCODE_VERSION\"]" templates/xcode.pkr.hcl
push_script: | push_script: |
if [[ -z "$LATEST" ]] if [[ -z "$LATEST" ]]
then then
+2 -3
View File
@@ -1,4 +1,4 @@
load("cirrus", "env", "http", "fs", "changes_include") load("cirrus", "env", "http", "fs")
load("github.com/cirrus-modules/graphql", "rerun_task_if_issue_in_logs") load("github.com/cirrus-modules/graphql", "rerun_task_if_issue_in_logs")
@@ -46,7 +46,6 @@ def main(ctx):
if env.get("CIRRUS_CRON") == "monthly": if env.get("CIRRUS_CRON") == "monthly":
result += fs.read(".ci/cirrus.base.yml") result += fs.read(".ci/cirrus.base.yml")
result += fs.read(".ci/cirrus.xcode.yml") result += fs.read(".ci/cirrus.xcode.yml")
prForRunners = env.get("CIRRUS_PR") and changes_include(".ci/cirrus.runner.yml") if env.get("CIRRUS_CRON") == "weekly":
if prForRunners or env.get("CIRRUS_TAG") != None:
result += fs.read(".ci/cirrus.runner.yml") result += fs.read(".ci/cirrus.runner.yml")
return result return result
+14 -6
View File
@@ -5,20 +5,28 @@ Repository with Packer templates to build macOS [Tart](https://tart.run/) virtua
The following image variants are currently available: 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-{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-{sequoia,sonoma}-xcode:N` image is based on `macos-{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-runner:{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.
See a full list of VMs available [here](https://github.com/orgs/cirruslabs/packages?tab=packages&q=macos-). See a full list of VMs available [here](https://github.com/orgs/cirruslabs/packages?tab=packages&q=macos-).
## Release Cadence ## Release Cadence
Once a new version of Xcode is released, we will initiate a GitHub release which will automatically build and push Once a new version of Xcode is released, we will initiate a GitHub release which will automatically build and push
a new version of the `macos-{tahoe,sequoia}-xcode:N`. This generally happens the next weekend after a release. a new version of the `macos-sequoia-xcode:N`. This generally happens within 24 hours of a release.
Please watch this repository releases to get notified about new images. Please watch this repository releases to get notified about new images.
For an Xcode release which is non beta and not an RC `ghcr.io/cirruslabs/macos-runner:sequoia` image will also be updated.
## Update Cadence ## Update Cadence
Some of the images are regularly getting rebuild in order to update the pre-installed packages. Some of the images are regularly getting rebuild in order to update the pre-installed packages. The following images are updated
monthly on the first Saturday of the month:
[This configuration file](.ci/cirrus.release.yml) defines images that are getting rebuilt monthly on the first Saturday of the month. * `ghcr.io/cirruslabs/macos-{sequoia,sonoma}-base`
* `ghcr.io/cirruslabs/macos-runner:sonoma` which is a superset of `ghcr.io/cirruslabs/macos-sonoma-xcode:{latest,16.1,16,15.4,15.3,15.2,15.1,15.0.1}`
* `ghcr.io/cirruslabs/macos-runner:sequoia` which is a superset of `ghcr.io/cirruslabs/macos-sequoia-xcode:{latest,16.2,16.1,16,15.4}`
Note that `ghcr.io/cirruslabs/macos-runner:{sequoia,sonoma}` are updated every Sunday and these images are [optimised for startup](https://cirrus-runners.app/blog/2024/04/11/optimizing-startup-time-of-cirrus-runners/)
on Cirrus Runners and Cirrus CI services.
@@ -15,7 +15,7 @@
# otherwise on the OS update the "softwareupdate" will be stuck at "Downloaded: macOS [...]" # otherwise on the OS update the "softwareupdate" will be stuck at "Downloaded: macOS [...]"
- name: install available update - name: install available update
command: command:
cmd: "softwareupdate --install --agree-to-license --force --restart --user admin --stdinpass {{ stdinpass | default('') }} '{{ item.label }}'" cmd: "softwareupdate --install --agree-to-license --force --restart --user admin --stdinpass {{ stdinpass | default("") }} '{{ item.label }}'"
stdin: "{{ ansible_password }}" stdin: "{{ ansible_password }}"
register: update_result register: update_result
# Work around the following: # Work around the following:
@@ -24,10 +24,8 @@
# > ssh: connect to host [...] port 22: Connection refused. # > ssh: connect to host [...] port 22: Connection refused.
ignore_unreachable: yes ignore_unreachable: yes
# Ignore SIGTERM/SIGKILL sent "softwareupdate" process # Ignore SIGTERM/SIGKILL sent "softwareupdate" process
# when the system reboots due to --restart and any other errors, # when the system reboots due to --restart
# since we'll check whether the update was installed in main.yml failed_when: update_result.rc not in [0, 9, -9, 15, -15]
# anyway.
ignore_errors: yes
become: yes become: yes
loop: "{{ software_updates }}" loop: "{{ software_updates }}"
when: "not item.label.startswith('macOS') or item.version.split('.')[0] == ansible_facts['distribution_version'].split('.')[0]" when: "not item.label.startswith('macOS') or item.version.split('.')[0] == ansible_facts['distribution_version'].split('.')[0]"
@@ -40,4 +38,6 @@
# the commands below on a non-restarted system. # the commands below on a non-restarted system.
delay: 60 delay: 60
timeout: 1800 timeout: 1800
when: update_result is defined and not update_result.skipped | default(false) when:
- update_result is defined
- not update_result.skipped
-19
View File
@@ -1,19 +0,0 @@
== Runtimes ==
iOS 17.5 (17.5 - 21F79) - com.apple.CoreSimulator.SimRuntime.iOS-17-5
iOS 18.0 (18.0 - 22A3351) - com.apple.CoreSimulator.SimRuntime.iOS-18-0
iOS 18.1 (18.1 - 22B81) - com.apple.CoreSimulator.SimRuntime.iOS-18-1
iOS 18.2 (18.2 - 22C150) - com.apple.CoreSimulator.SimRuntime.iOS-18-2
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
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
watchOS 11.4 (11.4 - 22T250) - com.apple.CoreSimulator.SimRuntime.watchOS-11-4
watchOS 11.5 (11.5 - 22T572) - com.apple.CoreSimulator.SimRuntime.watchOS-11-5
watchOS 26.0 (26.0 - 23R353) - com.apple.CoreSimulator.SimRuntime.watchOS-26-0
visionOS 2.4 (2.4 - 22O237) - com.apple.CoreSimulator.SimRuntime.xrOS-2-4
visionOS 2.5 (2.5 - 22O473) - com.apple.CoreSimulator.SimRuntime.xrOS-2-5
visionOS 26.0 (26.0 - 23M336) - com.apple.CoreSimulator.SimRuntime.xrOS-26-0
-5
View File
@@ -1,5 +0,0 @@
== Runtimes ==
iOS 18.1 (18.1 - 22B81) - com.apple.CoreSimulator.SimRuntime.iOS-18-1
tvOS 18.1 (18.1 - 22J578) - com.apple.CoreSimulator.SimRuntime.tvOS-18-1
watchOS 11.1 (11.1 - 22R581) - com.apple.CoreSimulator.SimRuntime.watchOS-11-1
visionOS 2.1 (2.1 - 22N580) - com.apple.CoreSimulator.SimRuntime.xrOS-2-1
-5
View File
@@ -1,5 +0,0 @@
== Runtimes ==
iOS 26.0 (26.0 - 23A343) - com.apple.CoreSimulator.SimRuntime.iOS-26-0
tvOS 26.0 (26.0 - 23J352) - com.apple.CoreSimulator.SimRuntime.tvOS-26-0
watchOS 26.0 (26.0 - 23R353) - com.apple.CoreSimulator.SimRuntime.watchOS-26-0
visionOS 26.0 (26.0 - 23M336) - com.apple.CoreSimulator.SimRuntime.xrOS-26-0
-52
View File
@@ -1,52 +0,0 @@
[
{
"group": "Runner Detail",
"detail": [
{
"name": "OS Information",
"script": "echo \"macOS $(sw_vers -productVersion) ($(sw_vers -buildVersion))\""
},
{
"name": "Build Date",
"script": "date +\"%Y-%m-%d\""
}
]
},
{
"group": "Software Detail",
"detail": [
{
"name": "Xcode Versions",
"script": "xcodes installed --no-color || echo \"Xcode not installed\""
},
{
"name": "Python Version",
"script": "python3 --version"
},
{
"name": "Node Version",
"script": "node --version"
},
{
"name": "Ruby Version",
"script": "ruby --version"
},
{
"name": "Bundler Version",
"script": "bundler --version"
},
{
"name": "CocoaPods Version",
"script": "pod --version"
},
{
"name": "Fastlane Version",
"script": "fastlane --version"
},
{
"name": "SwiftLint Version",
"script": "swiftlint --version"
}
]
}
]
-30
View File
@@ -1,30 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.cirruslabs.tart-guest-agent</string>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/bin/tart-guest-agent</string>
<string>--run-agent</string>
</array>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/bin:/usr/bin:/usr/sbin:/usr/local/bin:/opt/homebrew/bin</string>
<key>TERM</key>
<string>xterm-256color</string>
</dict>
<key>WorkingDirectory</key>
<string>/Users/admin</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/tart-guest-agent.log</string>
<key>StandardErrorPath</key>
<string>/tmp/tart-guest-agent.log</string>
</dict>
</plist>
-28
View File
@@ -1,28 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.cirruslabs.tart-guest-daemon</string>
<key>ProgramArguments</key>
<array>
<string>/opt/homebrew/bin/tart-guest-agent</string>
<string>--run-daemon</string>
</array>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/bin:/usr/bin:/usr/sbin:/usr/local/bin:/opt/homebrew/bin</string>
</dict>
<key>WorkingDirectory</key>
<string>/var/empty</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/tart-guest-daemon.log</string>
<key>StandardErrorPath</key>
<string>/tmp/tart-guest-daemon.log</string>
</dict>
</plist>
+2 -31
View File
@@ -105,9 +105,6 @@ build {
"brew install libyaml", # https://github.com/rbenv/ruby-build/discussions/2118 "brew install libyaml", # https://github.com/rbenv/ruby-build/discussions/2118
"brew install rbenv", "brew install rbenv",
"echo 'if which rbenv > /dev/null; then eval \"$(rbenv init -)\"; fi' >> ~/.zprofile", "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", "source ~/.zprofile",
"rbenv install 2.7.8", // latest 2.x.x before EOL "rbenv install 2.7.8", // latest 2.x.x before EOL
"rbenv install -l | grep -v - | tail -2 | xargs -L1 rbenv install", "rbenv install -l | grep -v - | tail -2 | xargs -L1 rbenv install",
@@ -148,34 +145,8 @@ build {
inline = [ inline = [
"source ~/.zprofile", "source ~/.zprofile",
"test -d /Users/runner", "test -d /Users/runner",
"test -f ~/.ssh/known_hosts" "test -f ~/.ssh/known_hosts",
] "brew doctor"
}
// Guest agent for Tart VMs
provisioner "file" {
source = "data/tart-guest-daemon.plist"
destination = "~/tart-guest-daemon.plist"
}
provisioner "file" {
source = "data/tart-guest-agent.plist"
destination = "~/tart-guest-agent.plist"
}
provisioner "shell" {
inline = [
# Install Tart Guest Agent
"source ~/.zprofile",
"brew install cirruslabs/cli/tart-guest-agent",
# Install daemon variant of the Tart Guest Agent
"sudo mv ~/tart-guest-daemon.plist /Library/LaunchDaemons/org.cirruslabs.tart-guest-daemon.plist",
"sudo chown root:wheel /Library/LaunchDaemons/org.cirruslabs.tart-guest-daemon.plist",
"sudo chmod 0644 /Library/LaunchDaemons/org.cirruslabs.tart-guest-daemon.plist",
# Install agent variant of the Tart Guest Agent
"sudo mv ~/tart-guest-agent.plist /Library/LaunchAgents/org.cirruslabs.tart-guest-agent.plist",
"sudo chown root:wheel /Library/LaunchAgents/org.cirruslabs.tart-guest-agent.plist",
"sudo chmod 0644 /Library/LaunchAgents/org.cirruslabs.tart-guest-agent.plist",
] ]
} }
} }
@@ -1,39 +0,0 @@
packer {
required_plugins {
tart = {
version = ">= 1.12.0"
source = "github.com/cirruslabs/tart"
}
}
}
variable "vm_name" {
type = string
}
source "tart-cli" "tart" {
vm_name = "${var.vm_name}"
recovery = true
cpu_count = 4
memory_gb = 8
disk_size_gb = 50
communicator = "none"
boot_command = [
# Skip over "Macintosh" and select "Options"
# to boot into macOS Recovery
"<wait60s><right><right><enter>",
# Open Terminal
"<wait10s><leftAltOn>T<leftAltOff>",
# Disable SIP
"<wait10s>csrutil disable<enter>",
"<wait10s>y<enter>",
"<wait10s>admin<enter>",
"<wait10s>admin<enter>",
# Shutdown
"<wait10s>halt<enter>"
]
}
build {
sources = ["source.tart-cli.tart"]
}
+1 -3
View File
@@ -34,9 +34,7 @@ build {
provisioner "shell" { provisioner "shell" {
inline = [ inline = [
# Use "-productVersion" instead of "--productVersion" "sw_vers --productVersion > /tmp/sw-vers-product-version.txt",
# to support old-style syntax used on macOS Monterey
"sw_vers -productVersion > /tmp/sw-vers-product-version.txt",
] ]
} }
+1 -2
View File
@@ -17,7 +17,7 @@ source "tart-cli" "tart" {
vm_name = "monterey-vanilla" vm_name = "monterey-vanilla"
cpu_count = 4 cpu_count = 4
memory_gb = 8 memory_gb = 8
disk_size_gb = 50 disk_size_gb = 40
ssh_password = "admin" ssh_password = "admin"
ssh_username = "admin" ssh_username = "admin"
ssh_timeout = "120s" ssh_timeout = "120s"
@@ -136,7 +136,6 @@ build {
provisioner "ansible" { provisioner "ansible" {
playbook_file = "ansible/playbook-system-updater.yml" playbook_file = "ansible/playbook-system-updater.yml"
extra_arguments = [ extra_arguments = [
"-vvv",
"--extra-vars", "stdinpass=admin", "--extra-vars", "stdinpass=admin",
] ]
ansible_env_vars = [ ansible_env_vars = [
+12 -43
View File
@@ -12,15 +12,14 @@ packer {
} }
source "tart-cli" "tart" { source "tart-cli" "tart" {
// will be update to 15.7 from_ipsw = "https://updates.cdn-apple.com/2025WinterFCS/fullrestores/072-08269/7CAAB9F7-E970-428D-8764-4CD7BCD105CD/UniversalMac_15.3_24D60_Restore.ipsw"
from_ipsw = "https://updates.cdn-apple.com/2025SummerFCS/fullrestores/093-10809/CFD6DD38-DAF0-40DA-854F-31AAD1294C6F/UniversalMac_15.6.1_24G90_Restore.ipsw"
vm_name = "sequoia-vanilla" vm_name = "sequoia-vanilla"
cpu_count = 4 cpu_count = 4
memory_gb = 8 memory_gb = 8
disk_size_gb = 50 disk_size_gb = 40
ssh_password = "admin" ssh_password = "admin"
ssh_username = "admin" ssh_username = "admin"
ssh_timeout = "180s" ssh_timeout = "300s"
boot_command = [ boot_command = [
# hello, hola, bonjour, etc. # hello, hola, bonjour, etc.
"<wait60s><spacebar>", "<wait60s><spacebar>",
@@ -32,30 +31,28 @@ source "tart-cli" "tart" {
# #
# [1]: should be named "English (US)", but oh well 🤷 # [1]: should be named "English (US)", but oh well 🤷
"<wait30s>italiano<esc>english<enter>", "<wait30s>italiano<esc>english<enter>",
# Select Your Country or Region # Select Your Country and Region
"<wait30s>united states<leftShiftOn><tab><leftShiftOff><spacebar>", "<wait30s>united states<leftShiftOn><tab><leftShiftOff><spacebar>",
# Transfer Your Data to This Mac
"<wait10s><tab><tab><tab><spacebar><tab><tab><spacebar>",
# Written and Spoken Languages # Written and Spoken Languages
"<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>", "<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>",
# Accessibility # Accessibility
"<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>", "<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>",
# Data & Privacy # Data & Privacy
"<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>", "<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>",
# Create a Mac Account # Migration Assistant
"<wait10s>Managed via Tart<tab>admin<tab>admin<tab>admin<tab><tab><spacebar><tab><tab><spacebar>", "<wait10s><tab><tab><tab><spacebar>",
# Enable Voice Over
"<wait120s><leftAltOn><f5><leftAltOff>",
# Sign In with Your Apple ID # Sign In with Your Apple ID
"<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>", "<wait10s><leftShiftOn><tab><leftShiftOff><leftShiftOn><tab><leftShiftOff><spacebar>",
# Are you sure you want to skip signing in with an Apple ID? # Are you sure you want to skip signing in with an Apple ID?
"<wait10s><tab><spacebar>", "<wait10s><tab><spacebar>",
# Terms and Conditions # Terms and Conditions
"<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>", "<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>",
# I have read and agree to the macOS Software License Agreement # I have read and agree to the macOS Software License Agreement
"<wait10s><tab><spacebar>", "<wait10s><tab><spacebar>",
# Create a Computer Account
"<wait10s>admin<tab><tab>admin<tab>admin<tab><tab><tab><spacebar>",
# Enable Location Services # Enable Location Services
"<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>", "<wait120s><leftShiftOn><tab><leftShiftOff><spacebar>",
# Are you sure you don't want to use Location Services? # Are you sure you don't want to use Location Services?
"<wait10s><tab><spacebar>", "<wait10s><tab><spacebar>",
# Select Your Time Zone # Select Your Time Zone
@@ -68,12 +65,8 @@ source "tart-cli" "tart" {
"<wait10s><tab><spacebar><leftShiftOn><tab><leftShiftOff><spacebar>", "<wait10s><tab><spacebar><leftShiftOn><tab><leftShiftOff><spacebar>",
# Choose Your Look # Choose Your Look
"<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>", "<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>",
# Update Mac Automatically
"<wait10s><tab><spacebar>",
# Welcome to Mac # Welcome to Mac
"<wait10s><spacebar>", "<wait10s><spacebar>",
# Disable Voice Over
"<leftAltOn><f5><leftAltOff>",
# Enable Keyboard navigation # Enable Keyboard navigation
# This is so that we can navigate the System Settings app using the keyboard # This is so that we can navigate the System Settings app using the keyboard
"<wait10s><leftAltOn><spacebar><leftAltOff>Terminal<enter>", "<wait10s><leftAltOn><spacebar><leftAltOff>Terminal<enter>",
@@ -82,27 +75,13 @@ source "tart-cli" "tart" {
# Now that the installation is done, open "System Settings" # Now that the installation is done, open "System Settings"
"<wait10s><leftAltOn><spacebar><leftAltOff>System Settings<enter>", "<wait10s><leftAltOn><spacebar><leftAltOff>System Settings<enter>",
# Navigate to "Sharing" # Navigate to "Sharing"
"<wait10s><leftCtrlOn><f2><leftCtrlOff><right><right><right><down>Sharing<enter>", "<wait10s><leftAltOn>f<leftAltOff>sharing<enter>",
# Navigate to "Screen Sharing" and enable it # Navigate to "Screen Sharing" and enable it
"<wait10s><tab><tab><tab><tab><tab><tab><tab><spacebar>", "<wait10s><tab><tab><tab><tab><tab><spacebar>",
# Navigate to "Remote Login" and enable it # Navigate to "Remote Login" and enable it
"<wait10s><tab><tab><tab><tab><tab><tab><tab><tab><tab><tab><tab><tab><spacebar>", "<wait10s><tab><tab><tab><tab><tab><tab><tab><tab><tab><tab><tab><tab><spacebar>",
# Quit System Settings # Quit System Settings
"<wait10s><leftAltOn>q<leftAltOff>", "<wait10s><leftAltOn>q<leftAltOff>",
# Disable Gatekeeper (1/2)
"<wait10s><leftAltOn><spacebar><leftAltOff>Terminal<enter>",
"<wait10s>sudo spctl --global-disable<enter>",
"<wait10s>admin<enter>",
"<wait10s><leftAltOn>q<leftAltOff>",
# Disable Gatekeeper (2/2)
"<wait10s><leftAltOn><spacebar><leftAltOff>System Settings<enter>",
"<wait10s><leftCtrlOn><f2><leftCtrlOff><right><right><right><down>Privacy & Security<enter>",
"<wait10s><leftShiftOn><tab><leftShiftOff><leftShiftOn><tab><leftShiftOff><leftShiftOn><tab><leftShiftOff><leftShiftOn><tab><leftShiftOff><leftShiftOn><tab><leftShiftOff><leftShiftOn><tab><leftShiftOff><leftShiftOn><tab><leftShiftOff>",
"<wait10s><down><wait1s><down><wait1s><enter>",
"<wait10s>admin<enter>",
"<wait10s><leftShiftOn><tab><leftShiftOff><wait1s><spacebar>",
# Quit System Settings
"<wait10s><leftAltOn>q<leftAltOff>",
] ]
// A (hopefully) temporary workaround for Virtualization.Framework's // A (hopefully) temporary workaround for Virtualization.Framework's
@@ -147,13 +126,6 @@ build {
] ]
} }
provisioner "shell" {
inline = [
# Ensure that Gatekeeper is disabled
"spctl --status | grep -q 'assessments disabled'"
]
}
provisioner "shell" { provisioner "shell" {
inline = [ inline = [
# Install command-line tools # Install command-line tools
@@ -165,9 +137,6 @@ build {
provisioner "ansible" { provisioner "ansible" {
playbook_file = "ansible/playbook-system-updater.yml" playbook_file = "ansible/playbook-system-updater.yml"
extra_arguments = [
"-vvv",
]
ansible_env_vars = [ ansible_env_vars = [
"ANSIBLE_TRANSPORT=paramiko", "ANSIBLE_TRANSPORT=paramiko",
"ANSIBLE_HOST_KEY_CHECKING=False", "ANSIBLE_HOST_KEY_CHECKING=False",
+3 -7
View File
@@ -12,15 +12,14 @@ packer {
} }
source "tart-cli" "tart" { source "tart-cli" "tart" {
// will be update to 14.8 from_ipsw = "https://updates.cdn-apple.com/2024SummerFCS/fullrestores/052-69922/F5DA2B64-25EB-4370-9E89-FA5689859796/UniversalMac_14.6_23G80_Restore.ipsw"
from_ipsw = "https://updates.cdn-apple.com/2024SummerFCS/fullrestores/062-52859/932E0A8F-6644-4759-82DA-F8FA8DEA806A/UniversalMac_14.6.1_23G93_Restore.ipsw"
vm_name = "sonoma-vanilla" vm_name = "sonoma-vanilla"
cpu_count = 4 cpu_count = 4
memory_gb = 8 memory_gb = 8
disk_size_gb = 50 disk_size_gb = 40
ssh_password = "admin" ssh_password = "admin"
ssh_username = "admin" ssh_username = "admin"
ssh_timeout = "180s" ssh_timeout = "120s"
boot_command = [ boot_command = [
# hello, hola, bonjour, etc. # hello, hola, bonjour, etc.
"<wait60s><spacebar>", "<wait60s><spacebar>",
@@ -135,9 +134,6 @@ build {
provisioner "ansible" { provisioner "ansible" {
playbook_file = "ansible/playbook-system-updater.yml" playbook_file = "ansible/playbook-system-updater.yml"
extra_arguments = [
"-vvv",
]
ansible_env_vars = [ ansible_env_vars = [
"ANSIBLE_TRANSPORT=paramiko", "ANSIBLE_TRANSPORT=paramiko",
"ANSIBLE_HOST_KEY_CHECKING=False", "ANSIBLE_HOST_KEY_CHECKING=False",
-159
View File
@@ -1,159 +0,0 @@
packer {
required_plugins {
tart = {
version = ">= 1.12.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/2025FallFCS/fullrestores/093-37622/CE01FAB2-7F26-48EE-AEE4-5E57A7F6D8BB/UniversalMac_26.0_25A354_Restore.ipsw"
vm_name = "tahoe-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.
"<wait60s><spacebar>",
# 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 🤷
"<wait30s>italiano<esc>english<enter>",
# Select Your Country or Region
"<wait60s>united states<leftShiftOn><tab><leftShiftOff><spacebar>",
# Transfer Your Data to This Mac
"<wait10s><tab><tab><tab><spacebar><tab><tab><spacebar>",
# Written and Spoken Languages
"<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>",
# Accessibility
"<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>",
# Data & Privacy
"<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>",
# Create a Mac Account
"<wait10s><tab><tab><tab><tab><tab><tab>Managed via Tart<tab>admin<tab>admin<tab>admin<tab><tab><spacebar><tab><tab><spacebar>",
# Enable Voice Over
"<wait120s><leftAltOn><f5><leftAltOff>",
# Sign In with Your Apple ID
"<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>",
# Are you sure you want to skip signing in with an Apple ID?
"<wait10s><tab><spacebar>",
# Terms and Conditions
"<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>",
# I have read and agree to the macOS Software License Agreement
"<wait10s><tab><spacebar>",
# Enable Location Services
"<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>",
# Are you sure you don't want to use Location Services?
"<wait10s><tab><spacebar>",
# Select Your Time Zone
"<wait10s><tab><tab><tab>UTC<enter><leftShiftOn><tab><leftShiftOff><spacebar>",
# Analytics
"<wait10s><leftShiftOn><tab><leftShiftOff><spacebar>",
# Screen Time
"<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
"<wait10s><tab><tab><spacebar>",
# Welcome to Mac
"<wait30s><spacebar>",
# Disable Voice Over
"<wait10s><leftAltOn><f5><leftAltOff>",
# Enable Keyboard navigation
# This is so that we can navigate the System Settings app using the keyboard
"<wait10s><leftAltOn><spacebar><leftAltOff>Terminal<wait10s><enter>",
"<wait10s><wait10s>defaults write NSGlobalDomain AppleKeyboardUIMode -int 3<enter>",
"<wait10s><leftAltOn>q<leftAltOff>",
# Now that the installation is done, open "System Settings"
"<wait10s><leftAltOn><spacebar><leftAltOff>System Settings<wait10s><enter>",
# Navigate to "Sharing"
"<wait10s><leftCtrlOn><f2><leftCtrlOff><right><right><right><down>Sharing<enter>",
# Navigate to "Screen Sharing" and enable it
"<wait10s><tab><tab><tab><tab><tab><spacebar>",
# Navigate to "Remote Login" and enable it
"<wait10s><tab><tab><tab><tab><tab><tab><tab><tab><tab><tab><tab><tab><spacebar>",
# Quit System Settings
"<wait10s><leftAltOn>q<leftAltOff>",
# Disable Gatekeeper (1/2)
"<wait10s><leftAltOn><spacebar><leftAltOff>Terminal<enter>",
"<wait10s>sudo spctl --global-disable<enter>",
"<wait10s>admin<enter>",
"<wait10s><leftAltOn>q<leftAltOff>",
# Disable Gatekeeper (2/2)
"<wait10s><leftAltOn><spacebar><leftAltOff>System Settings<enter>",
"<wait10s><leftCtrlOn><f2><leftCtrlOff><right><right><right><down>Privacy & Security<enter>",
"<wait10s><leftShiftOn><tab><tab><tab><tab><tab><leftShiftOff>",
"<wait10s><down><wait1s><down><wait1s><enter>",
"<wait10s>admin<enter>",
"<wait10s><leftShiftOn><tab><leftShiftOff><wait1s><spacebar>",
# Quit System Settings
"<wait10s><leftAltOn>q<leftAltOff>",
]
// 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'"
]
}
}
+1 -4
View File
@@ -18,7 +18,7 @@ source "tart-cli" "tart" {
vm_name = "ventura-vanilla" vm_name = "ventura-vanilla"
cpu_count = 4 cpu_count = 4
memory_gb = 8 memory_gb = 8
disk_size_gb = 50 disk_size_gb = 40
ssh_password = "admin" ssh_password = "admin"
ssh_username = "admin" ssh_username = "admin"
ssh_timeout = "120s" ssh_timeout = "120s"
@@ -143,9 +143,6 @@ build {
provisioner "ansible" { provisioner "ansible" {
playbook_file = "ansible/playbook-system-updater.yml" playbook_file = "ansible/playbook-system-updater.yml"
extra_arguments = [
"-vvv",
]
ansible_env_vars = [ ansible_env_vars = [
"ANSIBLE_TRANSPORT=paramiko", "ANSIBLE_TRANSPORT=paramiko",
"ANSIBLE_HOST_KEY_CHECKING=False", "ANSIBLE_HOST_KEY_CHECKING=False",
+15 -120
View File
@@ -15,23 +15,11 @@ variable "xcode_version" {
type = list(string) type = list(string)
} }
variable "additional_ios_builds" { variable "additional_runtimes" {
type = list(string) type = list(string)
default = [] default = []
} }
variable "xcode_components" {
type = list(string)
default = []
description = "Additional Xcode components to download."
}
variable "expected_runtimes_file" {
type = string
default = ""
description = "Path to file containing expected simulator runtimes. If empty, runtime verification is skipped."
}
variable "tag" { variable "tag" {
type = string type = string
default = "" default = ""
@@ -39,7 +27,7 @@ variable "tag" {
variable "disk_size" { variable "disk_size" {
type = number type = number
default = 120 default = 100
} }
variable "disk_free_mb" { variable "disk_free_mb" {
@@ -78,9 +66,8 @@ locals {
"APP_DIR=$(dirname $CONTENTS_DIR)", "APP_DIR=$(dirname $CONTENTS_DIR)",
"sudo mv $APP_DIR /Applications/Xcode_${version}.app", "sudo mv $APP_DIR /Applications/Xcode_${version}.app",
"sudo xcode-select -s /Applications/Xcode_${version}.app", "sudo xcode-select -s /Applications/Xcode_${version}.app",
"xcodebuild -downloadPlatform iOS", "xcodebuild -downloadAllPlatforms",
"xcodebuild -runFirstLaunch", "xcodebuild -runFirstLaunch",
"df -h",
] ]
} }
] ]
@@ -142,13 +129,6 @@ build {
destination = "/Users/admin/Downloads/" destination = "/Users/admin/Downloads/"
} }
provisioner "shell" {
inline = [
"source ~/.zprofile",
"df -h",
]
}
// iterate over all Xcode versions and install them // iterate over all Xcode versions and install them
// select the latest one as the default // select the latest one as the default
dynamic "provisioner" { dynamic "provisioner" {
@@ -159,35 +139,10 @@ build {
} }
} }
dynamic "provisioner" {
for_each = length(var.xcode_version) > 2 ? [2] : []
labels = ["shell"]
content {
inline = [
"source ~/.zprofile",
"sudo xcodes select '${var.xcode_version[2]}'",
"xcodebuild -downloadAllPlatforms",
]
}
}
dynamic "provisioner" {
for_each = length(var.xcode_version) > 1 ? [1] : []
labels = ["shell"]
content {
inline = [
"source ~/.zprofile",
"sudo xcodes select '${var.xcode_version[1]}'",
"xcodebuild -downloadAllPlatforms",
]
}
}
provisioner "shell" { provisioner "shell" {
inline = [ inline = [
"source ~/.zprofile", "source ~/.zprofile",
"sudo xcodes select '${var.xcode_version[0]}'", "sudo xcodes select '${var.xcode_version[0]}'",
"xcodebuild -downloadAllPlatforms",
] ]
} }
@@ -195,59 +150,11 @@ build {
inline = concat( inline = concat(
["source ~/.zprofile"], ["source ~/.zprofile"],
[ [
for runtime in var.additional_ios_builds : "xcodebuild -downloadPlatform iOS -buildVersion ${runtime}" for runtime in var.additional_runtimes : "sudo xcodes runtimes install ${runtime}"
] ]
) )
} }
provisioner "shell" {
inline = concat(
["source ~/.zprofile"],
[
for component in var.xcode_components : "xcodebuild -downloadComponent ${component}"
]
)
}
provisioner "shell" {
inline = [
"source ~/.zprofile",
"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
"gem update",
"gem install fastlane",
"gem install cocoapods",
"gem install xcpretty",
"gem uninstall --ignore-dependencies ffi && gem install ffi -- --enable-libffi-alloc"
]
}
// Copy expected runtimes file if provided
dynamic "provisioner" {
for_each = var.expected_runtimes_file != "" ? [1] : []
labels = ["file"]
content {
source = var.expected_runtimes_file
destination = "/Users/admin/runtimes.expected.txt"
}
}
// Verify simulator runtimes match expected list if file was provided
dynamic "provisioner" {
for_each = var.expected_runtimes_file != "" ? [1] : []
labels = ["shell"]
content {
inline = [
"source ~/.zprofile",
"xcrun simctl list runtimes > /Users/admin/runtimes.actual.txt",
"diff -q /Users/admin/runtimes.actual.txt /Users/admin/runtimes.expected.txt || (echo 'Simulator runtimes do not match expected list' && cat /Users/admin/runtimes.actual.txt && exit 1)",
"rm /Users/admin/runtimes.actual.txt /Users/admin/runtimes.expected.txt"
]
}
}
provisioner "shell" { provisioner "shell" {
inline = [ inline = [
"source ~/.zprofile", "source ~/.zprofile",
@@ -262,6 +169,17 @@ build {
"flutter precache", "flutter precache",
] ]
} }
provisioner "shell" {
inline = [
"source ~/.zprofile",
"brew install libimobiledevice ideviceinstaller ios-deploy fastlane carthage",
"brew install xcbeautify",
"gem update",
"gem install cocoapods",
"gem install xcpretty",
"gem uninstall --ignore-dependencies ffi && gem install ffi -- --enable-libffi-alloc"
]
}
# useful utils for mobile development # useful utils for mobile development
provisioner "shell" { provisioner "shell" {
@@ -343,27 +261,4 @@ build {
"sleep 1800" "sleep 1800"
] ]
} }
// Install setup-info-generator
provisioner "shell" {
inline = [
"source ~/.zprofile",
"brew install cirruslabs/cli/setup-info-generator"
]
}
// Copy setup info template
provisioner "file" {
source = "data/setup-info-template.json"
destination = "~/setup-info-template.json"
}
// Generate setup info
provisioner "shell" {
inline = [
"source ~/.zprofile",
"cat ~/setup-info-template.json | setup-info-generator > ~/actions-runner/.setup_info",
"rm ~/setup-info-template.json"
]
}
} }