Step 2 · Migrate in dependency order
Local Mac → cloud Mac.
Move your data first, then your toolchain, then CI. Start with a project you can verify on its own rather than copying your entire home directory. The time estimates below are for the setup steps; repository size, network conditions, and dependency downloads affect the actual time.
01 / Data
Start with code and signing assets
Clone your repository from Git and check out the same commit as your local copy. For private repositories, use a restricted deployment key or a short-lived token. Don’t put long-lived credentials in the repository URL.
git clone <repository URL>
git rev-parse HEAD
rsync -av --progress ./Assets/ \
admin@<node address>:~/work/Assets/
For code signing, export a .p12 file containing the private key from your local keychain. Encrypt it with a separate password when transferring it, then import it into the node’s keychain. Migrate provisioning profiles separately and check the certificate expiry, team, and target configuration.
Use rsync for incremental transfers of large assets. Don’t use a delete option on the first run. Check the destination directory first to avoid removing artifacts newly created on the node.
02 / Toolchain
Restore versions, not caches
Export a Brewfile locally and transfer it to the node to restore your setup. Review the list first and remove unnecessary desktop apps and outdated dependencies to reduce the initial download.
brew bundle dump --file=Brewfile
brew bundle --file=Brewfile
xcodes list
xcodes install <required version>
Check which versions of Xcode, Ruby, and CocoaPods the project requires. When using xcodes to install a version, follow the applicable software licence and download requirements. After installation, run xcodebuild -version to verify the version actually in use.
For projects with a Gemfile, start with bundle exec pod install. For SPM, resolve dependencies using the lock file included with the project. Treat the first build as a cache warm-up, not as a measure of subsequent build times.
03 / CI setup
Build manually before registering a runner
First complete a build and signing step in an interactive session. Once the command line can create an archive, register a GitHub Actions self-hosted runner or GitLab Runner. This avoids troubleshooting the toolchain and job scheduling at the same time.
bundle exec fastlane match development --readonly
bundle exec fastlane gym
Use the signing type and specific lane configured for your project. Give CI restricted credentials and store keys in protected variables or a key store. Never put passwords in scripts.
Assign a dedicated label to a temporary runner and initially allow only trusted branches to use it. Confirm that the runner’s account can access the signing keychain and working directory, and that a non-interactive build won’t wait for a dialog.
Migration is complete when: the same commit, Xcode version, and dependency lock files produce an archive on the node that you can retrieve. A successful dependency install alone doesn’t mean the environment is ready.