| #!/usr/bin/env bash |
| |
| # This simple script can be used to set up a CI node running MacOS. |
| # An additional requirement that is *not* handled by this script is the |
| # installation of Xcode, which requires manual intervention. |
| # |
| # This script should first be run from an administrator account to install |
| # the dependencies necessary for running CI. It can be run without having |
| # to clone the LLVM repository with: |
| # |
| # $ /bin/bash -c "$(curl -fsSl https://raw.githubusercontent.com/llvm/llvm-project/main/libcxx/utils/ci/macos-ci-setup)" |
| # |
| # If you perform system updates, you should re-run the script from the |
| # administrator account -- this allows updating the packages used for |
| # CI and the BuildKite agent tags. |
| # |
| # Once the necessary dependencies have been installed, you can switch |
| # to a non-administrator account and run the script again, passing the |
| # --setup-launchd argument. That will install a Launchd agent to run the |
| # BuildKite agent whenever the current user is logged in. You should enable |
| # automatic login for that user, so that if the CI node goes down, the user |
| # is logged back in automatically when the node goes up again, and the |
| # BuildKite agent starts automatically. |
| # |
| # Alternatively, you can simply run the BuildKite agent by hand using: |
| # |
| # $ caffeinate -s buildkite-agent start --build-path /tmp/buildkite-builds |
| |
| set -e |
| |
| # Install a Launchd agent that will automatically start the BuildKite agent at login |
| if [[ ${1} == "--setup-launchd" ]]; then |
| HOMEBREW_PREFIX="$(brew --prefix)" |
| mkdir -p ~/Library/LaunchAgents |
| cat <<EOF > ~/Library/LaunchAgents/libcxx.buildkite-agent.plist |
| <?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>libcxx.buildkite-agent</string> |
| |
| <key>ProgramArguments</key> |
| <array> |
| <string>${HOMEBREW_PREFIX}/bin/buildkite-agent</string> |
| <string>start</string> |
| <string>--build-path</string> |
| <string>${HOME}/libcxx.buildkite-agent/builds</string> |
| </array> |
| |
| <key>EnvironmentVariables</key> |
| <dict> |
| <key>PATH</key> |
| <string>${HOMEBREW_PREFIX}/bin:/usr/bin:/bin:/usr/sbin:/sbin</string> |
| </dict> |
| |
| <key>RunAtLoad</key> |
| <true/> |
| |
| <key>KeepAlive</key> |
| <dict> |
| <key>SuccessfulExit</key> |
| <false/> |
| </dict> |
| |
| <key>ProcessType</key> |
| <string>Interactive</string> |
| |
| <key>ThrottleInterval</key> |
| <integer>30</integer> |
| |
| <key>StandardOutPath</key> |
| <string>${HOME}/libcxx.buildkite-agent/stdout.log</string> |
| |
| <key>StandardErrorPath</key> |
| <string>${HOME}/libcxx.buildkite-agent/stderr.log</string> |
| </dict> |
| </plist> |
| EOF |
| |
| echo "Starting BuildKite agent" |
| launchctl load ~/Library/LaunchAgents/libcxx.buildkite-agent.plist |
| |
| else |
| echo "Installing CI dependencies for macOS" |
| |
| if [[ -z "${BUILDKITE_AGENT_TOKEN}" ]]; then |
| echo "The BUILDKITE_AGENT_TOKEN environment variable must be set to a BuildKite Agent token when calling this script." |
| exit 1 |
| fi |
| |
| # Install Homebrew |
| if ! which -s brew; then |
| /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" |
| fi |
| |
| # Install the required tools to run CI |
| brew update |
| for package in sphinx-doc python3 ninja cmake clang-format buildkite/buildkite/buildkite-agent; do |
| if brew ls --versions "${package}" >/dev/null; then |
| brew upgrade "${package}" |
| else |
| brew install "${package}" |
| fi |
| done |
| python3 -m pip install --upgrade psutil |
| |
| echo "Setting up BuildKite Agent config" |
| version="$(sw_vers -productVersion | sed -E 's/([0-9]+).([0-9]+).[0-9]+/\1.\2/')" |
| arch="$(uname -m)" |
| cat <<EOF > "$(brew --prefix)/etc/buildkite-agent/buildkite-agent.cfg" |
| token="${BUILDKITE_AGENT_TOKEN}" |
| tags="queue=libcxx-builders,arch=${arch},os=macos,os=macos${version}" |
| build-path=/tmp/buildkite-builds # Note that this is actually overwritten when starting the agent with launchd |
| EOF |
| fi |