2020-08-27 11:21:35 +02:00
- [Playbooks ](#playbooks )
2020-08-27 16:18:11 +02:00
* [Testing changes to the build scripts ](#testing-changes-to-the-build-scripts )
2020-08-27 11:21:35 +02:00
* [deployment to a clean infrastructure ](#deployment-to-a-clean-infrastructure )
* [creating basic authentication for reverse proxy ](#creating-basic-authentication-for-reverse-proxy )
* [Creating docker containers on Windows ](#creating-docker-containers-on-windows )
* [Spawning a new windows agent ](#spawning-a-new-windows-agent )
+ [Buildkite ](#buildkite )
+ [Jenkins ](#jenkins )
* [Testing scripts locally ](#testing-scripts-locally )
* [Custom environment variables ](#custom-environment-variables )
- [Phabricator integration ](#phabricator-integration )
* [Herald ](#herald )
* [Harbormaster ](#harbormaster )
# Playbooks
2019-10-29 13:56:40 +01:00
2020-08-27 16:18:11 +02:00
## Testing changes to the build scripts
It's recommended to test even smallest changes before committing them to the `master` branch.
1. Create a branch with your changes, e.g. "my-feature" and push it to origin.
2. Manually create a buildkite build in the pipeline you are updating and
specify environment variable `scripts_branch="my-feature"` (see also [custom
environment variables](#custom-environment-variables) for other options).
To test "premerge-tests" pipeline pick an existing build and copy parameters
from it, omitting "ph_target_phid", namely: "ph_build_id",
"ph_buildable_diff", "ph_buildable_revision", "ph_initiator_phid" and
"scripts_branch" variables.
**Or** use Buildkite REST API, e.g. to run 'llvm-master-build':
```shell script
curl -H "Authorization: Bearer MY-API-TOKEN" \
-X POST "https://api.buildkite.com/v2/organizations/llvm-project/pipelines/llvm-master-build/builds" \
-d '{"branch": "master", "commit": "HEAD", "env": {"scripts_branch": "my-feature"}}'
```
1. Wait for build to complete and maybe attach a link to it to your Pull
Request.
2019-10-29 13:56:40 +01:00
## deployment to a clean infrastructure
General remarks:
* GCP does not route any traffic to your services unless the service is "healthy". It might take a few minutes after startup before the services is classified as healthy. Until then you will only see some generic error message.
2020-01-22 19:04:13 +01:00
These are the steps to set up the build server on a clean infrastructure:
2019-10-29 13:56:40 +01:00
1. Configure the tools on your local machine:
```bash
./local_setup.sh
```
2020-01-22 19:04:13 +01:00
If you not running docker under your user, you might need to
`sudo gcloud auth login --no-launch-browser && gcloud auth configure-docker`
before running other commands under sudo.
2019-10-29 13:56:40 +01:00
1. Delete the old cluster, if it still exists:
```bash
cd kubernetes/cluster
./cluster_delete.sh
```
1. Create the cluster:
```bash
cd kubernetes/cluster
./cluster_create.sh
```
1. Create the disk storage, if it does not yet exist:
```bash
cd kubernetes/cluster
./disk_create.sh
```
1. SSH into the VM instance mounting the volume, find the mount point and then set
```bash
# go to the mount point of the volume
cd /var/lib/kubelet/plugins/kubernetes.io/gce-pd/mounts/jenkins-home
# change the permissions
sudo chmod a+rwx
```
1. Push the docker images to gcr.io:
```bash
cd containers
#for each subfolder:
./build_deploy.sh < foldername >
```
1. Deploy the stack:
```bash
cd kubernetes
./deploy.sh
```
1. Configure it
## creating basic authentication for reverse proxy
1. create auth file, based on [ingress-nginx documentation ](https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/auth/basic )
```bash
cd kubernetes/reverse-proxy
htpasswd -c auth < username >
# enter password at prompt
# add more users as required
kubectl create secret generic proxy-auth --from-file=auth --namespace=jenkins
```
2019-10-31 11:33:38 +01:00
## Creating docker containers on Windows
2020-05-26 12:53:19 +02:00
If you want to build/update/test docker container for Windows, you need to do this on a Windows machine.
**Note**: There is an existing *windows-development* machine that you can resume and use for development. Please stop it after use.
Here are the instructions to set up such a machine on GCP.
2019-10-31 11:33:38 +01:00
1. Pick a GCP Windows image with Desktop Support.
2019-12-13 18:30:08 +01:00
* pick a "persistent SSD" as boot Disk. This is much faster
2020-05-26 12:53:19 +02:00
* (optionally) add a "local scratch SSD" and use it as you workspace. This will make builds faster, but you **will not be able to stop** this instance and will have to kill and re-create it again.
* make sure that you give enough permissions in "Identity and API access" to be able to e.g. push new docker images to GCR.
2019-12-13 18:30:08 +01:00
1. Format the local SSD partition and use it as workspace.
2019-12-18 16:07:34 +01:00
1. install [Chocolately ](https://chocolatey.org/docs/installation ):
2020-05-26 12:53:19 +02:00
```powershell
iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))
```
1. Install development tools: `choco install -y git googlechrome vscode`
1. (optionally) If you want to be able to push changes to github, you need to set up your github SSH keys and user name:
```powershell
ssh-keygen
git config --global user.name < your name >
git config --global user.email < your email >
```
2019-12-18 16:07:34 +01:00
1. Install [Docker Enterprise ](https://docs.docker.com/ee/docker-ee/windows/docker-ee/ ) and reboot:
2020-05-26 12:53:19 +02:00
```powershell
Install-Module DockerMsftProvider -Force
Install-Package Docker -ProviderName DockerMsftProvider -Force
Restart-Computer
```
2019-12-16 15:26:05 +01:00
1. Configure the Docker credentials for GCP:
2020-05-26 12:53:19 +02:00
```powershell
gcloud init # set options according to ./k8s_config here
gcloud components install docker-credential-gcr
docker-credential-gcr configure-docker
```
2019-12-13 18:30:08 +01:00
1. To build and run the current agent run:
2020-05-26 12:53:19 +02:00
```powershell
cd c:\
git clone https://github.com/google/llvm-premerge-checks
cd llvm-premerge-checks\containers
.\build_deploy.ps1 agent-windows-buildkite # or agent-windows-jenkins
c:\llvm-premerge-check\scripts\windows_agent_start_buildkite.ps1 # or windows_agent_start_jenkins.ps1
```
2019-12-02 12:49:01 +01:00
## Spawning a new windows agent
To spawn a new windows agent:
1. Go to the [GCP page ](https://pantheon.corp.google.com/compute/instances?project=llvm-premerge-checks&instancessize=50 ) and pick a new number for the agent.
2020-05-08 12:55:40 +02:00
1. Run `kubernetes/windows_agent_create.sh agent-windows-<number>`
2019-12-02 12:49:01 +01:00
1. Go to the [GCP page ](https://pantheon.corp.google.com/compute/instances?project=llvm-premerge-checks&instancessize=50 ) again
2020-06-03 13:40:22 +02:00
1. Login to the new machine via RDP (you will need a RDP client, e.g. Chrome app).
2020-05-26 12:53:19 +02:00
1. In the RDP session: run these commands in the CMD window under Administrator to bootstrap the Windows machine:
```powershell
2020-06-17 09:46:42 +02:00
Invoke-WebRequest -uri 'https://raw.githubusercontent.com/google/llvm-premerge-checks/master/scripts/windows_agent_bootstrap.ps1' -OutFile c:\windows_agent_bootstrap.ps1
2020-07-21 10:40:26 +02:00
c:/windows_agent_bootstrap.ps1 -ssd
2020-05-26 12:53:19 +02:00
```
2020-06-04 08:40:04 +02:00
Ignore the pop-up to format the new disk and wait for the machine to reboot.
2020-06-03 13:40:22 +02:00
### Buildkite
1. Create `c:\credentials` folder with file `buildkite-env.ps1` :
2020-05-26 12:53:19 +02:00
```powershell
$Env:buildkiteAgentToken = "secret-token"
2020-06-17 10:20:34 +02:00
$Env:BUILDKITE_AGENT_NAME = "w#"
2020-06-16 10:30:24 +02:00
$Env:BUILDKITE_AGENT_TAGS = "queue=windows"
2020-06-03 13:40:22 +02:00
$Env:CONDUIT_TOKEN = "conduit-api-token"
2020-06-17 10:20:34 +02:00
```
Pleas mind the length of the agent name as it will be in path and might cause some tests to fail due to 260 character limit.
2020-07-17 18:37:29 +02:00
1. Clone scripts directory and start agent:
2020-06-03 13:40:22 +02:00
```powershell
2020-06-04 08:40:04 +02:00
git clone https://github.com/google/llvm-premerge-checks.git C:\llvm-premerge-checks
2020-06-29 10:36:03 +02:00
C:\llvm-premerge-checks\scripts\windows_agent_start_buildkite.ps1 [-workdir D:\] [-testing] [-version latest]
2020-06-03 13:40:22 +02:00
```
2020-07-17 18:37:29 +02:00
1. Add a task to start agent when machine restarts (make sure to pass correct parameters).
```
2020-07-27 19:16:33 +02:00
git clone https://github.com/google/llvm-premerge-checks.git C:\llvm-premerge-checks
2020-07-30 09:32:50 +02:00
schtasks.exe /create /tn "Start Buildkite agent" /ru SYSTEM /SC ONSTART /DELAY 0005:00 /tr "powershell -command 'C:\llvm-premerge-checks\scripts\windows_agent_start_buildkite.ps1 -workdir c:\ws'"
2020-07-17 18:37:29 +02:00
```
2020-06-03 13:40:22 +02:00
### Jenkins
1. Create `c:\credentials` folder with `build-agent-results_key.json` to access cloud storage copy from one of the existing machines.
1. Run
```powershell
git clone https://github.com/google/llvm-premerge-checks.git "c:\llvm-premerge-checks"
C:\llvm-premerge-checks\scripts\windows_agent_start_buildkite.ps1 [-testing] [-version latest]
```
2019-12-09 10:59:08 +01:00
2020-06-15 16:59:15 +02:00
Metrics are exported as "custom/statsd/gauge".
2019-12-09 10:59:08 +01:00
## Testing scripts locally
2020-01-23 16:14:12 +01:00
Build and run agent docker image `sudo ./containers/build_run.sh agent-debian-testing-ssd /bin/bash` .
2019-12-09 12:09:53 +01:00
Within a container set environment variables similar to [pipeline ](https://github.com/google/llvm-premerge-checks/blob/master/Jenkins/Phabricator-pipeline/Jenkinsfile ).
2020-02-26 15:46:15 +01:00
Additionally set `WORKSPACE` , `PHID` and `DIFF_ID` parameters. Set `CONDUIT_TOKEN` with your personal one from `https://reviews.llvm.org/settings/user/<USERNAME>/page/apitokens/` .
2020-07-28 15:26:43 +02:00
## Custom environment variables
Buildkite pipelines have a number of custom environment variables one can set to change their behavior. That is useful to debug issues
or test changes. They are mostly used by pipleine generators, e.g. [build_master_pipeline ](../scripts/buildkite/build_master_pipeline.py ),
please refer to the source code for the details. These variables have `ph_` prefix and can be set with URL parameters in Harbormaster build.
Most commonly used are:
- `scripts_branch` ("master" by default): which branch of llvm-premerge-checks to use. This variable is also used in pipeline "bootstrap" in Buildkite interface.
- `ph_no_cache` : (if set to any value) clear compilation cache before the build.
- `ph_projects` : which projects to use, "detect" will look on diff to infer the projects, "default" selects all projects.
- `ph_notify_email` : comma-separated list of email addresses to be notified when build is complete.
- `ph_log_level` ("DEBUG", "INFO", "WARNING" (default) or "ERROR"): log level for build scripts.
- `ph_no_filter_output` (if set to any value): do not filter output of `ninja all` and other commands from buildkite log.
- `ph_linux_agents` , `ph_windows_agents` : custom JSON constraints on agents. For example you might put one machine to a custom queue if it's errornous and send jobs to it with `ph_windows_agents="{{\"queue\": \"custom\"}}"` .
- `ph_skip_linux` , `ph_skip_windows` (if set to any value): skip build on this OS.
2020-02-26 15:46:15 +01:00
# Phabricator integration
The general flow for builds on Phabricator is:
1. A user uploads a *Diff* (=patch) to a *Revision* (set of Diffs with comments and buildstatus, ... ).
2. A *Herald* checks if one of the *rules* matches this event.
3. You can use the rules to trigger a *Build* in *Harbormaster* .
4. Harbor sends an HTTP request to the Jenkins server.
5. Jenkins executes the build. In the last step of the build, a script is uploading the results to Phabricator.
6. Phabricator sets the build status and displays the results.
## Herald
We currently have these Herald rules to configure the builds:
* Triggering builds for everyone:
* [H576 ](https://reviews.llvm.org/H576 ) This will only trigger for non-beta testers.
* Triggering the beta-test builds:
* [H511 ](https://reviews.llvm.org/H511 ) or the beta testers, this is for testing new features.
* [H552 ](https://reviews.llvm.org/H552 ) for all changes to MLIR (archived)
* [H527 ](https://reviews.llvm.org/H527 ) for all changes to clang-extra-tools (archived)
You can *archive* a rule to disable it.
## Harbormaster
We have these build plans in Harbormaster:
* [Plan 4 ](https://reviews.llvm.org/harbormaster/plan/4/ ) Builds for everyone
* [Plan 3 ](https://reviews.llvm.org/harbormaster/plan/3/ ) Builds for beta testers