| # Handling machines |
| |
| # Quick description of the architecture |
| |
| Bazel's CI use Jenkins in a docker container to run the various test jobs. |
| The Jenkins master distribute this work on various slaves: |
| |
| * Virtual machines on GCE (Linux and Windows slaves) |
| * Docker container (the deploy slave which is used for deploying |
| release and the website) |
| * Physical machines (mac slaves) |
| |
| The docker containers are run on the jenkins master virtual machine, the Jenkins |
| master running in a docker container itself. They are administered through the |
| `gce/jenkins.yml` and `gce/jenkins-staging.yml` files (a Google Container |
| Engine pod configuration). |
| |
| The virtual machines are administered through the `gce/vm.sh` script. |
| |
| ## Virtual machines admininstration |
| |
| Commands from the `gce/vm.sh` script can be applied to all machines, |
| individual machines or all machines from `staging` or `prod`: |
| |
| * `create` and `delete`: create a machine (unless it already exists) or delete it. |
| * `reimage`: `delete` a machine, then `create` it again. |
| * `start` and `stop`: start or stop the specified VMs, classically used to shut down the |
| staging instance. |
| * `update_metadata`: update the metadata for the VM. It is the data |
| that we pass to the `--metadata` flags when we do `gcloud |
| instances create` which includes the startup scripts and |
| the pod configuration for the docker containers. |
| |
| This script needs access to `gcloud` and assumes your default GCE project is pointing to the |
| CI project. You can install `gcloud` from https://cloud.google.com/sdk/ and set it |
| up so the default project is "bazel-public". |
| |
| ``` |
| $ gcloud config set project bazel-public |
| $ gcloud auth login |
| ``` |
| |
| ## Physical machines administration |
| |
| The physical machines needs to be in a network allowed for port 50000, see the list of IP |
| ranges provided to the [`init.sh`](init.md) script. |
| |
| They need to have installed a service that talks to the Jenkins master. The only kind of |
| physical slaves we currently use are Mac slaves. For licensing reasons, those slaves |
| have to be set up manually. |
| |
| ### Setting up a Mac slave |
| |
| 1. Install [Xcode](https://developer.apple.com/xcode/downloads/) |
| and [JDK 8](https://jdk8.java.net/download.html) |
| 2. Create a "ci" user with "sudo" right, download the |
| `mac/setup_mac.sh` script, and run it as that user: |
| ``` |
| $ curl -o setup_mac.sh "https://raw.githubusercontent.com/bazelbuild/continuous-integration/master/mac/setup_mac.sh" |
| $ sudo su ci -c "/bin/bash setup_mac.sh <node_name>" |
| ``` |