-
Notifications
You must be signed in to change notification settings - Fork 279
Mac CI
Mac CI is run via taskcluster on a mac mini machine that we are renting from MacStadium. Below you can find info regarding how the machine was set up. The taskcluster worker is started with ~tcworker/main.sh which just runs the worker with the right environment variables. It will restart the worker (if it crashes) up to 10 times before exiting. At that point somebody has to ssh in to the machine and run main.sh again. It sends warning emails whenever it restarts the worker.
The VNC daemon is currently stopped for security reasons. It can be started with
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.screensharing.plist
and stopped with
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.screensharing.plist
The machine is set to auto login in as tcworker. This is needed to avoid '_RegisterApplication(), FAILED TO establish the default connection to the WindowServer, _CGSDefaultConnection() is NULL.' errors.
Setup
-----
Prep the machine to build webrender. This involves installing a bunch of stuff as an admin user:
Install brew and zlib
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install zlib
brew install cmake
Install virtualenv
sudo easy_install pip
sudo pip install virtualenv
And installing a bunch of stuff as the (unpriveleged) user who will be running the worker daemon:
Install rust and sccache
curl https://sh.rustup.rs -sSf | sh
source ~/.profile # pick up new PATH
cargo install sccache
Prep a folder with a virtualenv that has servo-tidy:
virtualenv servotidy-venv
source servotidy-venv/bin/activate
pip install mako servo-tidy
deactivate
Download the worker binary from https://github.com/taskcluster/taskcluster-worker/releases
# Update version numebrs in URL to get latest version
curl --location https://github.com/taskcluster/taskcluster-worker/releases/download/v0.1.9/taskcluster-worker-0.1.9-darwin-amd64 > taskcluster-worker
chmod +x taskcluster-worker
./taskcluster-worker --help # Verify it runs
Download the example config from https://github.com/taskcluster/taskcluster-worker/blob/master/examples/local-worker.yml
curl --location https://raw.githubusercontent.com/taskcluster/taskcluster-worker/master/examples/local-worker.yml > local-worker.yml
Modify the local-worker.yml so that config.monitor.logLevel is "debug" instead of "warning".
Modify the local-worker.yml to add a config.plugins.watchdog.timeout property with '30 min' as the value.
Think of a worker id for the machine (e.g. kats-laptop).
We will use the worker type kats-webrender-ci-osx because that's what is specified in the .taskcluster.yml file
Next we need to generate a client id in taskcluster
Get :jonasfj or somebody in #taskcluster to create role:mozilla-user:<your-ldap> with the necessary scopes (aka permissions) to create client ids
Go to the client manager https://tools.taskcluster.net/auth/clients/ and sign in with your LDAP (Okta). This is important so that the system recognizes the scopes you were granted above.
Create a new client id for the machine you want to be a taskcluster slave.
Enter something like mozilla-ldap/<your-ldap>/my-worker-1 for the client id
Add the following scopes (replace "kats-laptop" with your worker id)
auth:sentry:test-dummy-worker
auth:statsum:test-dummy-worker
auth:webhooktunnel
queue:claim-work:localprovisioner/kats-webrender-ci-osx
queue:worker-id:local-worker/kats-laptop
Create the client and record the access token it generates
Now we can run the worker. Change the WORKER_ID and TASKCLUSTER* vars below based on what you got above:
export WORKER_TYPE=kats-webrender-ci-osx
export WORKER_ID=kats-laptop # change as needed
export TASKCLUSTER_CLIENT_ID=mozilla-ldap/<your-ldap>/my-worker-1
export TASKCLUSTER_ACCESS_TOKEN=<access token>
Run the worker
./taskcluster-worker work local-worker.yml </dev/null >worker.log 2>&1 &
To test
-------
Go to https://tools.taskcluster.net/tasks/create and edit the task definition:
Change the provisionerId to localprovisioner
Change the workerType to your $WORKER_TYPE (e.g. kats-webrender-ci-osx)
Change the payload command to something quicker, if you want (e.g. echo "hello world")
Remove the payload image, since we won't be using docker for this
Sample final task definition:
provisionerId: localprovisioner
workerType: kats-webrender-ci-osx
created: '2017-09-21T13:05:46.344Z'
deadline: '2017-09-21T16:05:46.347Z'
payload:
command:
- /bin/bash
- '-c'
- echo \"hello world\" && date && whoami && sleep 5 && uname -a
maxRunTime: 600
metadata:
name: Testing
description: Testing a local tc-worker
owner: [email protected]
source: 'https://tools.taskcluster.net/task-creator/'
Run the task and ensure success
Production
----------
Whoever is creating the task will need to grant the necessary scopes to create tasks of $WORKER_TYPE using localprovisioner to the github repo.
The task creator test tool we used above has this already, but github repos don't.
You need to request these scopes on the github repo after installing the Taskcluster-github integration app on the repo.
Request from :jonasfj or in #taskcluster
Example can be seen at https://tools.taskcluster.net/auth/roles/repo%3Agithub.com%2Fstaktrace%2Fwebrender%3A*