Auto merge of #2674 - str4d:2469-ci-workers-macos, r=str4d
[ci-workers] Add support for MacOSX Also alters the `unix.yml` script to install all Python modules in a virtualenv, and adds curl and cmake dependencies. Closes #2469.
This commit is contained in:
commit
791a68cdf5
|
@ -5,29 +5,29 @@ installation for use as a Buildbot worker in Zcash's CI.
|
||||||
|
|
||||||
# Criteria for Adding Workers
|
# Criteria for Adding Workers
|
||||||
|
|
||||||
a. Don't add workers until users complain about a problem on a platform
|
a. Don't add workers until users complain about a problem on a platform that
|
||||||
that doesn't yet have workers or if we anticipate many users will use
|
doesn't yet have workers. However, if we anticipate many users will use a
|
||||||
a platform, we may pre-emptively add an unsupported worker for it.
|
platform, we may pre-emptively add an unsupported worker for it.
|
||||||
|
|
||||||
b. Prioritize the platforms that seem to have the most users.
|
b. Prioritize the platforms that seem to have the most users.
|
||||||
|
|
||||||
c. When adding workers start by adding workers for the "most common"
|
c. When adding workers, start by adding workers for the "most common" variant of
|
||||||
variant of any distro, then if users later encounter problems with a
|
any distro. Then if users later encounter problems with a sub-variant, we can
|
||||||
sub-variant, we can consider adding new workers at that point.
|
consider adding new workers at that point. Example: add Ubuntu Desktop before
|
||||||
Example: add Ubuntu Desktop before Xubuntu, on the assumption the
|
Xubuntu, on the assumption the former has a larger population base, and the
|
||||||
former has a larger population base.
|
latter only materially differs in the GUI.
|
||||||
|
|
||||||
# Setting up a latent worker on Amazon EC2
|
# Setting up a latent worker on Amazon EC2
|
||||||
|
|
||||||
- Add a regular (non-latent) worker to the master.cfg for dev-ci.z.cash, and
|
1. Add a regular (non-latent) worker to the master.cfg for dev-ci.z.cash, and
|
||||||
deploy the changes.
|
deploy the changes.
|
||||||
- This enables the Ansible playbook to run to completion, ending in the worker
|
- This enables the Ansible playbook to run to completion, ending in the worker
|
||||||
connecting to the master.
|
connecting to the master.
|
||||||
|
|
||||||
- Start a basic EC2 instance using the template AMI for the target OS.
|
2. Start a basic EC2 instance using the template AMI for the target OS.
|
||||||
- Choose the smallest instance size, it won't be used for building Zcash.
|
- Choose the smallest instance size, it won't be used for building Zcash.
|
||||||
|
|
||||||
- Figure out which user to log into the instance with.
|
3. Figure out which user to log into the instance with.
|
||||||
- E.g. for the Ubuntu template, use "ubuntu" instead of "root"
|
- E.g. for the Ubuntu template, use "ubuntu" instead of "root"
|
||||||
- If you get an Ansible error later with a message like "Failed to connect to
|
- If you get an Ansible error later with a message like "Failed to connect to
|
||||||
the host via ssh: Received message too long 1349281121\r\n", that means the
|
the host via ssh: Received message too long 1349281121\r\n", that means the
|
||||||
|
@ -35,28 +35,28 @@ c. When adding workers start by adding workers for the "most common"
|
||||||
Ansible protocol is balking. Try manually logging in with the same
|
Ansible protocol is balking. Try manually logging in with the same
|
||||||
credentials to diagnose.
|
credentials to diagnose.
|
||||||
|
|
||||||
- Create `inventory/hosts` containing the following:
|
4. Create `inventory/hosts` containing the following:
|
||||||
|
|
||||||
[zcash-ci-worker-unix]
|
[zcash-ci-worker-unix]
|
||||||
some-name ansible_host=<INSTANCE_IP> ansible_ssh_user=<USERNAME>
|
some-name ansible_host=<INSTANCE_IP> ansible_ssh_user=<USERNAME>
|
||||||
|
|
||||||
- Run `ansible-playbook -e buildbot_worker_host_template=templates/host.ec2.j2 -i inventory/hosts unix.yml`,
|
5. Run `ansible-playbook -e buildbot_worker_host_template=templates/host.ec2.j2 -i inventory/hosts unix.yml`,
|
||||||
passing in the worker's Buildbot name and password.
|
passing in the worker's Buildbot name and password.
|
||||||
- After a successful run, the worker should be connected to dev-ci.z.cash and
|
- After a successful run, the worker should be connected to dev-ci.z.cash and
|
||||||
visible in its worker list.
|
visible in its worker list.
|
||||||
|
|
||||||
- Create an AMI from the instance. This is the worker AMI to put into the
|
6. Create an AMI from the instance. This is the worker AMI to put into the
|
||||||
master.cfg for dev-ci.z.cash.
|
master.cfg for dev-ci.z.cash.
|
||||||
- 16 GB of storage should be sufficient.
|
- 16 GB of storage should be sufficient.
|
||||||
|
|
||||||
- SSH into the instance, and edit the worker config to connect to ci.z.cash.
|
7. SSH into the instance, and edit the worker config to connect to ci.z.cash.
|
||||||
|
|
||||||
- Create an AMI from the instance. This is the worker AMI to put into the
|
8. Create an AMI from the instance. This is the worker AMI to put into the
|
||||||
master.cfg for ci.z.cash.
|
master.cfg for ci.z.cash.
|
||||||
- 16 GB of storage should be sufficient.
|
- 16 GB of storage should be sufficient.
|
||||||
|
|
||||||
- Delete the instance (it is no longer needed).
|
9. Delete the instance (it is no longer needed).
|
||||||
|
|
||||||
- Edit the master.cfg to turn the new worker into a latent (using the new AMI
|
10. Edit the master.cfg to turn the new worker into a latent (using the new AMI
|
||||||
IDs), add it to the appropriate worker groups, set up new builders etc.
|
IDs), add it to the appropriate worker groups, set up new builders etc.
|
||||||
- Deploy this via the normal PR review process.
|
- Deploy this via the normal PR review process.
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
export PATH=$HOME/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||||
|
export EDITOR=vim
|
|
@ -0,0 +1,10 @@
|
||||||
|
---
|
||||||
|
- name: Check if brew is installed
|
||||||
|
stat:
|
||||||
|
path: /usr/local/bin/brew
|
||||||
|
register: brew_check
|
||||||
|
|
||||||
|
- name: Fail if brew is unavailable
|
||||||
|
fail:
|
||||||
|
msg: 'brew is not installed! Please install Homebrew: https://docs.brew.sh/Installation.html'
|
||||||
|
when: not brew_check.stat.exists
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>Label</key>
|
||||||
|
<string>net.buildbot.worker</string>
|
||||||
|
<key>ProgramArguments</key>
|
||||||
|
<array>
|
||||||
|
<string>{{ buildbot_worker_dir }}/venv/bin/buildbot-worker</string>
|
||||||
|
<string>start</string>
|
||||||
|
<string>{{ buildbot_worker_name }}</string>
|
||||||
|
</array>
|
||||||
|
<key>WorkingDirectory</key>
|
||||||
|
<string>{{ buildbot_worker_dir }}</string>
|
||||||
|
<key>UserName</key>
|
||||||
|
<string>{{ buildbot_worker_user }}</string>
|
||||||
|
<key>KeepAlive</key>
|
||||||
|
<dict>
|
||||||
|
<key>NetworkState</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
|
@ -5,11 +5,11 @@ After=network.target
|
||||||
|
|
||||||
[Service]
|
[Service]
|
||||||
Type=forking
|
Type=forking
|
||||||
PIDFile=/home/{{ buildbot_worker_user }}/{{ buildbot_worker_name }}/twistd.pid
|
PIDFile={{ buildbot_worker_dir }}/{{ buildbot_worker_name }}/twistd.pid
|
||||||
WorkingDirectory=/home/{{ buildbot_worker_user }}
|
WorkingDirectory={{ buildbot_worker_dir }}
|
||||||
ExecStart={{ pip_bin_dir }}/buildbot-worker start {{ buildbot_worker_name }}
|
ExecStart={{ buildbot_worker_dir }}/venv/bin/buildbot-worker start {{ buildbot_worker_name }}
|
||||||
ExecReload={{ pip_bin_dir }}/buildbot-worker restart {{ buildbot_worker_name }}
|
ExecReload={{ buildbot_worker_dir }}/venv/bin/buildbot-worker restart {{ buildbot_worker_name }}
|
||||||
ExecStop={{ pip_bin_dir }}/buildbot-worker stop {{ buildbot_worker_name }}
|
ExecStop={{ buildbot_worker_dir }}/venv/bin/buildbot-worker stop {{ buildbot_worker_name }}
|
||||||
Restart=always
|
Restart=always
|
||||||
User={{ buildbot_worker_user }}
|
User={{ buildbot_worker_user }}
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
OS: {{ ansible_distribution }} {{ ansible_distribution_version }}
|
OS: {{ ansible_distribution }} {{ ansible_distribution_version }}
|
||||||
Memory: {{ ansible_memtotal_mb }} MB
|
Memory: {{ ansible_memtotal_mb }} MB
|
||||||
CPU: {{ ansible_processor[1] }}
|
CPU: {{ ansible_processor if ansible_processor is string else ansible_processor[1] }} ({{ ansible_processor_cores }} cores)
|
||||||
|
|
|
@ -50,6 +50,7 @@
|
||||||
|
|
||||||
- name: Gathering Facts
|
- name: Gathering Facts
|
||||||
setup:
|
setup:
|
||||||
|
tags: deps
|
||||||
|
|
||||||
- name: Fail if Python is the wrong version
|
- name: Fail if Python is the wrong version
|
||||||
fail:
|
fail:
|
||||||
|
@ -66,34 +67,44 @@
|
||||||
- "vars/{{ ansible_distribution }}.yml"
|
- "vars/{{ ansible_distribution }}.yml"
|
||||||
- "vars/{{ ansible_os_family }}.yml"
|
- "vars/{{ ansible_os_family }}.yml"
|
||||||
skip: true
|
skip: true
|
||||||
|
tags: deps
|
||||||
|
|
||||||
- name: Collate dependencies
|
- name: Collate dependencies
|
||||||
set_fact:
|
set_fact:
|
||||||
package_deps: "{{ buildbot_deps + fetch_deps + conf_deps + build_deps + link_deps + dist_deps }}"
|
package_deps: "{{ buildbot_deps + fetch_deps + conf_deps + build_deps + link_deps + dist_deps }}"
|
||||||
python_modules: "{{ buildbot_modules + rpc_test_modules }}"
|
python_modules: "{{ buildbot_modules + rpc_test_modules }}"
|
||||||
|
tags: deps
|
||||||
|
|
||||||
|
- name: Install Homebrew [MacOSX]
|
||||||
|
include: tasks/install-brew.yml
|
||||||
|
when: ansible_distribution == 'MacOSX'
|
||||||
|
tags: deps
|
||||||
|
|
||||||
- name: Update rolling release [Arch Linux]
|
- name: Update rolling release [Arch Linux]
|
||||||
pacman:
|
pacman:
|
||||||
update_cache: yes
|
update_cache: yes
|
||||||
upgrade: yes
|
upgrade: yes
|
||||||
when: ansible_distribution == 'Archlinux'
|
when: ansible_distribution == 'Archlinux'
|
||||||
|
tags: deps
|
||||||
|
|
||||||
- name: Install required packages
|
- name: Install required packages
|
||||||
package:
|
package:
|
||||||
name: "{{ item }}"
|
name: "{{ item }}"
|
||||||
state: present
|
state: present
|
||||||
with_items: "{{ package_deps }}"
|
with_items: "{{ package_deps }}"
|
||||||
|
become_user: "{{ ansible_ssh_user if ansible_distribution == 'MacOSX' else 'root' }}"
|
||||||
|
tags: deps
|
||||||
|
|
||||||
- name: Install pip [CentOS]
|
- name: Install pip [CentOS, MacOSX]
|
||||||
include: tasks/install-pip.yml
|
include: tasks/install-pip.yml
|
||||||
when: ansible_distribution == 'CentOS'
|
when: ansible_distribution in ['CentOS', 'MacOSX']
|
||||||
|
|
||||||
- name: Install required Python modules
|
- name: Install required Python system modules
|
||||||
pip:
|
pip:
|
||||||
name: "{{ item }}"
|
name: "{{ item }}"
|
||||||
state: latest
|
state: latest
|
||||||
with_items: "{{ python_modules }}"
|
executable: "{{ '/usr/local/bin/pip' if ansible_distribution == 'MacOSX' else omit }}"
|
||||||
notify: restart buildbot-worker
|
with_items: "{{ system_modules }}"
|
||||||
|
|
||||||
- name: Set up the Buildbot worker user
|
- name: Set up the Buildbot worker user
|
||||||
user:
|
user:
|
||||||
|
@ -102,9 +113,28 @@
|
||||||
shell: /bin/bash
|
shell: /bin/bash
|
||||||
state: present
|
state: present
|
||||||
|
|
||||||
|
- name: Get absolute path to Buildbot worker home directory
|
||||||
|
command: echo ~
|
||||||
|
register: homedir
|
||||||
|
become_user: "{{ buildbot_worker_user }}"
|
||||||
|
|
||||||
|
- name: Save absolute path to Buildbot worker home directory
|
||||||
|
set_fact:
|
||||||
|
buildbot_worker_dir: "{{ homedir.stdout }}"
|
||||||
|
|
||||||
|
- name: Install required Python modules
|
||||||
|
pip:
|
||||||
|
name: "{{ item }}"
|
||||||
|
state: latest
|
||||||
|
virtualenv: "~{{ buildbot_worker_user }}/venv"
|
||||||
|
virtualenv_command: "{{ '/usr/local/bin/virtualenv' if ansible_distribution == 'MacOSX' else omit }}"
|
||||||
|
with_items: "{{ python_modules }}"
|
||||||
|
become_user: "{{ buildbot_worker_user }}"
|
||||||
|
notify: restart buildbot-worker
|
||||||
|
|
||||||
- name: Create Buildbot worker
|
- name: Create Buildbot worker
|
||||||
command: >
|
command: >
|
||||||
buildbot-worker create-worker ~/{{ buildbot_worker_name }}
|
~{{ buildbot_worker_user }}/venv/bin/buildbot-worker create-worker ~/{{ buildbot_worker_name }}
|
||||||
{{ buildbot_master_host }}:{{ buildbot_master_port }}
|
{{ buildbot_master_host }}:{{ buildbot_master_port }}
|
||||||
{{ buildbot_worker_name|quote }} {{ buildbot_worker_password|quote }}
|
{{ buildbot_worker_name|quote }} {{ buildbot_worker_password|quote }}
|
||||||
args:
|
args:
|
||||||
|
@ -116,7 +146,7 @@
|
||||||
content: "{{ buildbot_worker_admin }}"
|
content: "{{ buildbot_worker_admin }}"
|
||||||
dest: "~{{ buildbot_worker_user }}/{{ buildbot_worker_name }}/info/admin"
|
dest: "~{{ buildbot_worker_user }}/{{ buildbot_worker_name }}/info/admin"
|
||||||
owner: "{{ buildbot_worker_user }}"
|
owner: "{{ buildbot_worker_user }}"
|
||||||
group: "{{ buildbot_worker_user }}"
|
group: "{{ omit if ansible_distribution == 'MacOSX' else buildbot_worker_user }}"
|
||||||
mode: "0644"
|
mode: "0644"
|
||||||
|
|
||||||
- name: Set host details for Buildbot worker
|
- name: Set host details for Buildbot worker
|
||||||
|
@ -124,7 +154,15 @@
|
||||||
src: "{{ buildbot_worker_host_template }}"
|
src: "{{ buildbot_worker_host_template }}"
|
||||||
dest: "~{{ buildbot_worker_user }}/{{ buildbot_worker_name }}/info/host"
|
dest: "~{{ buildbot_worker_user }}/{{ buildbot_worker_name }}/info/host"
|
||||||
owner: "{{ buildbot_worker_user }}"
|
owner: "{{ buildbot_worker_user }}"
|
||||||
group: "{{ buildbot_worker_user }}"
|
group: "{{ omit if ansible_distribution == 'MacOSX' else buildbot_worker_user }}"
|
||||||
|
mode: "0644"
|
||||||
|
|
||||||
|
- name: Install custom bashrc for virtualenv
|
||||||
|
copy:
|
||||||
|
src: bashrc
|
||||||
|
dest: "~{{ buildbot_worker_user }}/.bashrc"
|
||||||
|
owner: "{{ buildbot_worker_user }}"
|
||||||
|
group: "{{ omit if ansible_distribution == 'MacOSX' else buildbot_worker_user }}"
|
||||||
mode: "0644"
|
mode: "0644"
|
||||||
|
|
||||||
- name: Copy Buildbot worker systemd service unit
|
- name: Copy Buildbot worker systemd service unit
|
||||||
|
@ -134,13 +172,32 @@
|
||||||
owner: root
|
owner: root
|
||||||
group: root
|
group: root
|
||||||
mode: "0644"
|
mode: "0644"
|
||||||
|
when: ansible_distribution != 'MacOSX'
|
||||||
notify: reload systemd
|
notify: reload systemd
|
||||||
|
|
||||||
- name: Start Buildbot worker.
|
- name: Copy Buildbot worker launchd service unit
|
||||||
|
template:
|
||||||
|
src: templates/buildbot-worker.plist.j2
|
||||||
|
dest: "/Library/LaunchDaemons/net.buildbot.worker.plist"
|
||||||
|
owner: root
|
||||||
|
group: wheel
|
||||||
|
mode: "0644"
|
||||||
|
when: ansible_distribution == 'MacOSX'
|
||||||
|
|
||||||
|
- name: Start Buildbot worker
|
||||||
service:
|
service:
|
||||||
name: buildbot-worker
|
name: buildbot-worker
|
||||||
state: started
|
state: started
|
||||||
enabled: yes
|
enabled: yes
|
||||||
|
when: ansible_distribution != 'MacOSX'
|
||||||
|
|
||||||
|
- name: Load Buildbot worker service [MacOSX]
|
||||||
|
command: launchctl load /Library/LaunchDaemons/net.buildbot.worker.plist
|
||||||
|
when: ansible_distribution == 'MacOSX'
|
||||||
|
|
||||||
|
- name: Start Buildbot worker [MacOSX]
|
||||||
|
command: launchctl start net.buildbot.worker
|
||||||
|
when: ansible_distribution == 'MacOSX'
|
||||||
|
|
||||||
handlers:
|
handlers:
|
||||||
- name: restart buildbot-worker
|
- name: restart buildbot-worker
|
||||||
|
|
|
@ -2,6 +2,6 @@
|
||||||
buildbot_deps:
|
buildbot_deps:
|
||||||
- python2-pip
|
- python2-pip
|
||||||
build_deps:
|
build_deps:
|
||||||
|
- cmake
|
||||||
- multilib/gcc
|
- multilib/gcc
|
||||||
- make
|
- make
|
||||||
pip_bin_dir: /usr/bin
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
buildbot_deps: [] # Empty to remove python-pip
|
buildbot_deps: [] # Empty to remove python-pip
|
||||||
build_deps:
|
build_deps:
|
||||||
- bzip2
|
- bzip2
|
||||||
|
- cmake
|
||||||
- gcc
|
- gcc
|
||||||
- gcc-c++
|
- gcc-c++
|
||||||
- make
|
- make
|
||||||
|
@ -10,4 +11,3 @@ dist_deps:
|
||||||
- pkgconfig # Required until b556beda264308e040f8d88aca4f2f386a0183d9 is pulled in
|
- pkgconfig # Required until b556beda264308e040f8d88aca4f2f386a0183d9 is pulled in
|
||||||
- python-devel
|
- python-devel
|
||||||
- redhat-rpm-config
|
- redhat-rpm-config
|
||||||
pip_bin_dir: /usr/bin
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
build_deps:
|
build_deps:
|
||||||
- build-essential # Depends on g++, libc6-dev, make
|
- build-essential # Depends on g++, libc6-dev, make
|
||||||
|
- cmake
|
||||||
dist_deps:
|
dist_deps:
|
||||||
- pkg-config # Required until b556beda264308e040f8d88aca4f2f386a0183d9 is pulled in
|
|
||||||
- python-dev
|
- python-dev
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
---
|
---
|
||||||
build_deps:
|
build_deps:
|
||||||
|
- cmake
|
||||||
- gcc
|
- gcc
|
||||||
- gcc-c++
|
- gcc-c++
|
||||||
- make
|
- make
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
buildbot_deps:
|
buildbot_deps:
|
||||||
- py27-pip
|
- py27-pip
|
||||||
build_deps:
|
build_deps:
|
||||||
|
- cmake
|
||||||
- gcc
|
- gcc
|
||||||
- gmake
|
- gmake
|
||||||
dist_deps:
|
dist_deps:
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
buildbot_deps:
|
||||||
|
- coreutils # For gnproc etc.
|
||||||
|
# Most are already installed
|
||||||
|
build_deps:
|
||||||
|
- cmake
|
|
@ -1,5 +1,4 @@
|
||||||
---
|
---
|
||||||
build_deps:
|
build_deps:
|
||||||
- build-essential # Depends on g++, libc6-dev, make
|
- build-essential # Depends on g++, libc6-dev, make
|
||||||
dist_deps:
|
- cmake
|
||||||
- pkg-config # Required until b556beda264308e040f8d88aca4f2f386a0183d9 is pulled in
|
|
||||||
|
|
|
@ -7,6 +7,7 @@ buildbot_deps:
|
||||||
|
|
||||||
# Dependencies required to download files
|
# Dependencies required to download files
|
||||||
fetch_deps:
|
fetch_deps:
|
||||||
|
- curl # For depends/
|
||||||
- git
|
- git
|
||||||
- wget # For zcutil/fetch-params.sh
|
- wget # For zcutil/fetch-params.sh
|
||||||
|
|
||||||
|
@ -15,9 +16,11 @@ conf_deps:
|
||||||
- autoconf
|
- autoconf
|
||||||
- automake
|
- automake
|
||||||
- m4
|
- m4
|
||||||
|
- pkg-config
|
||||||
|
|
||||||
# Dependencies required to compile Zcash
|
# Dependencies required to compile Zcash
|
||||||
build_deps:
|
build_deps:
|
||||||
|
- cmake
|
||||||
- g++
|
- g++
|
||||||
- gcc
|
- gcc
|
||||||
- make
|
- make
|
||||||
|
@ -34,6 +37,10 @@ grind_deps:
|
||||||
- lcov
|
- lcov
|
||||||
- valgrind
|
- valgrind
|
||||||
|
|
||||||
|
# Python modules required on the system
|
||||||
|
system_modules:
|
||||||
|
- virtualenv
|
||||||
|
|
||||||
# Python modules required for a Zcash Buildbot worker
|
# Python modules required for a Zcash Buildbot worker
|
||||||
buildbot_modules:
|
buildbot_modules:
|
||||||
- pip # Needs to be updated first so Buildbot installs
|
- pip # Needs to be updated first so Buildbot installs
|
||||||
|
@ -44,6 +51,3 @@ buildbot_modules:
|
||||||
rpc_test_modules:
|
rpc_test_modules:
|
||||||
- pyblake2
|
- pyblake2
|
||||||
- pyzmq
|
- pyzmq
|
||||||
|
|
||||||
# Environment variables
|
|
||||||
pip_bin_dir: /usr/local/bin
|
|
||||||
|
|
Loading…
Reference in New Issue