util: Update the GitHub Self-Hosted Runners (#371)
1. All VMs are deployable from a single Vagrantfile (per host machine). 2. Runners within VMs are now ephemeral. They cease to exist after a job is complete. After the VM cleans the workspace and creates a new runner. This will reduce old data, scripts, and images causing space issues on our VMs 3. No more 'vm_manager.sh' script. The standard `vagrant` command to manage the VMs will work. 4. Adds Copyright notices where missing.
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# Setting up a Github Actions Runner with Vagrant
|
||||
|
||||
This directory provides a way to setup a Github Actions runner using Vagrant to host the runner in a Virtual machine.
|
||||
This directory provides a way to setup Github Actions runners using Vagrant to host them in Virtual machines.
|
||||
|
||||
This tutorial has been written with the assumption of running on a machine with Ubuntu 22.04.
|
||||
Setting up a runner on a different OS may require some changes.
|
||||
@@ -21,14 +21,6 @@ sudo apt-get install qemu libvirt-daemon-system libvirt-clients ebtables dnsmasq
|
||||
sudo apt purge vagrant-libvirt
|
||||
```
|
||||
|
||||
## Set up the Vagrantfiles for the GitHub repository
|
||||
|
||||
First, generate a Personal Access Token, which you can create [here](https://github.com/settings/tokens)
|
||||
Make sure to set admin permissions on this token, then replace instances of `<PERSONAL ACCESS TOKEN>` in the Vagrantfiles ("Vagrantfile-builder" and "Vagrant-runner") with your token.
|
||||
|
||||
Next, replace instances of `<GITHUB REPO>` with your GitHub account name and the repository name, separated by a forward slash.
|
||||
For example, if your GitHub account name is `example` and your repository name is `example-repo`, you would replace `<GITHUB REPO>` with `example/example-repo`.
|
||||
|
||||
## Install Vagrant Plugins
|
||||
|
||||
Once everything is set properly, set the `VAGRANT_HOME` environment variable to the directory in which the Vagrant files and other scripts are stored (i.e., the CWD).
|
||||
@@ -46,71 +38,35 @@ vagrant plugin install vagrant-libvirt
|
||||
vagrant plugin install vagrant-reload
|
||||
```
|
||||
|
||||
## The "builder" and "runner" VMs
|
||||
## Creating the virtual machines
|
||||
|
||||
The number of CPUs and the memory size differs between the "Vagrantfile-builder" and "Vagrantfile-runner".
|
||||
The Vagrantfile in this directory defines the VMs that can be built and used to create a GitHub Actions runner.
|
||||
This standard VM has 4-cores, 16GB of RAM, and 60GB of disk space.
|
||||
This is sufficient to both compile gem5 and run most simulations.
|
||||
|
||||
In our work we have two types of machines "runners" and "builders".
|
||||
Runners are single core machines with 8GB of memory, and builders are 4 core machines with 16GB of memory.
|
||||
The latter is used for building gem5 binaries while the former is used for running instances of gem5.
|
||||
You can expect each machine to take up approximately 60GB of disk space though VMs will consume the disk space they require.
|
||||
At the top of the Vagrantfile, there are a few variables that must be set prior to creating the VMs.
|
||||
|
||||
The "Vagrantfile-builder" file is set to create a runner machine and the "Vagrantfile-builder" file is set to create a builder machine.
|
||||
* `NUM_RUNNERS`: The number of runners to create.
|
||||
* `PERSONAL_ACCESS_TOKEN`: The GitHub personal access token to use.
|
||||
You can generate a Personal Access Token [here](https://github.com/settings/tokens)
|
||||
Make sure to set admin permissions on this token.
|
||||
* `GITHUB_ORG`: The GitHub organization to add the runners to.
|
||||
E.g., if the URL to your organization is https://github.com/orgs/gem5, then the variable should be set to "gem5".
|
||||
* `HOSTNAME` : The hostname of the VM to be created (note, this will be appended with a number to create a unique hostname for each VM).
|
||||
E.g., if set to `my-machine` and the number of runners set to `2`, two VMs will be created.
|
||||
One called `my-machine-1` and the other `my-machine-2`.
|
||||
|
||||
Specifying which Vagrantfile to use is done by setting the `VAGRANT_VAGRANTFILE` environment variable.
|
||||
|
||||
## Creating the virtual machine
|
||||
|
||||
Each VM on your host system must have a unique name.
|
||||
Give the VM to be created a unique name by setting the `<VM NAME>` variables in the Vagrantfile you wish to utilize.
|
||||
|
||||
Then run:
|
||||
When set simply run:
|
||||
|
||||
```sh
|
||||
VAGRANT_VAGRANTFILE=<VAGRANTFILE> vagrant up --provider=libvirt
|
||||
vagrant up --provider=libvirt
|
||||
```
|
||||
|
||||
This should automatically create your machine, as well as configure and start up a Github Actions runner.
|
||||
You can check the status of the runner here: https://github.com/<account>/<repo>/settings/actions/runners
|
||||
This should automatically create your machines then configure and start up a Github Actions runner in each.
|
||||
You can check the status of the runner here: https://github.com/organizations/{GITHUB_ORG}/settings/actions/runners
|
||||
|
||||
If the runner ever shows as offline, you can rerun the `vagrant up --provider=libvirt` command to make sure everything is working properly.
|
||||
|
||||
If you wish to create more than one runner you must edit the `<VM NAME>` in the Vagrant file.
|
||||
|
||||
## Helper scripts
|
||||
|
||||
The "vm_manager" script can be used to set up multiple builder and runner VMs.
|
||||
To use this script simply modify the `NUM_RUNNERS`, `NUM_BUILDERS`, `RUNNER_PREFIX`, and `BUILDER_PREFIX` variables to the desired values.
|
||||
Then run the script with:
|
||||
|
||||
```sh
|
||||
./vm_manager.sh
|
||||
```
|
||||
|
||||
This script will create any VMs that don't already exist and ensure those that do exists are running.
|
||||
|
||||
If you wish to destroy all the VMs you can run:
|
||||
|
||||
```sh
|
||||
./vm_manager.sh destroy
|
||||
```
|
||||
|
||||
**Note:** This script assumes "VAGRANT_HOME" is set to the CWD.
|
||||
|
||||
## Improving stability
|
||||
|
||||
Occasionally GitHub runner services, or VMs, go down. This is often silent and
|
||||
usually only noticable from going to the GitHub repo page "settings" -> "actions" -> "runners" and observing the status.
|
||||
When the VMs or the service stop working they need restarted.
|
||||
To do so you can sun `./vm_manager.sh`. This will cycle through the VMs and execute a `vagrant up` command.
|
||||
This does one of three things depending on the state of the VM:
|
||||
|
||||
1. If the VM is down this will bring the VM back online and start the GitHub runner service.
|
||||
2. If the VM is up but the GitHub runner service is down, this will start the GitHub runner service.
|
||||
3. If the VM is up and the GitHub runner service is running (i.e., everything is fine) then this does nothing.
|
||||
|
||||
Given there is no harm in running this command frequently, we recommend setting up a cron job to automatically execute `./vm_manager.sh` every few hours.
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### The default libvirt disk image storage pool is on the wrong drive
|
||||
@@ -130,3 +86,15 @@ virsh pool-define default-pool.xml # From here we re-add the default.
|
||||
virsh pool-start default
|
||||
virsh pool-autostart default
|
||||
```
|
||||
|
||||
### Error: "Vagrant failed to initialize at a very early stage"
|
||||
|
||||
W set the `VAGRANT_HOME` environment variable to the CWD.
|
||||
It's likely this has become unset The solution is simple.
|
||||
Within the directory containing "Vagrantfile":
|
||||
|
||||
```sh
|
||||
VAGRANT_HOME=`pwd` vagrant <command>
|
||||
```
|
||||
|
||||
You may want to set `VAGRANT_HOME` in your .bashrc or .zshrc.
|
||||
|
||||
65
util/github-runners-vagrant/Vagrantfile
vendored
Normal file
65
util/github-runners-vagrant/Vagrantfile
vendored
Normal file
@@ -0,0 +1,65 @@
|
||||
# -*- mode: ruby -*-
|
||||
# vi: set ft=ruby :
|
||||
|
||||
# Copyright (c) 2023 The Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
NUM_RUNNERS=0 # Set this to the desired number of runners.
|
||||
PERSONAL_ACCESS_TOKEN="<PERSONAL ACCESS TOKEN>"
|
||||
GITHUB_ORG="<GITHUB_ORG>"
|
||||
HOSTNAME="<VM NAME>"
|
||||
|
||||
Vagrant.configure("2") do |config|
|
||||
config.ssh.username = "vagrant"
|
||||
config.ssh.password = "vagrant"
|
||||
|
||||
(1..NUM_RUNNERS).each do |i|
|
||||
|
||||
config.vm.define "#{HOSTNAME}-#{i}" do |runner|
|
||||
runner.vm.hostname = "#{HOSTNAME}-#{i}"
|
||||
runner.vm.box = "generic/ubuntu2204"
|
||||
runner.vm.box_check_update = true
|
||||
|
||||
runner.vm.provider "libvirt" do |vb|
|
||||
# Customize the amount of cpus, memory, and storage on the VM:
|
||||
vb.cpus = "4".to_i
|
||||
vb.memory = "16384".to_i
|
||||
vb.machine_virtual_size = 128 # 128G is the minimum.
|
||||
end
|
||||
|
||||
# sets up vm
|
||||
runner.vm.provision :shell, path: "provision_root.sh"
|
||||
runner.vm.provision :shell, privileged: false, path: "provision_nonroot.sh"
|
||||
# The provision_root.sh adds the vagrant user to the docker group, so we need to reload the VM.
|
||||
runner.vm.provision :reload
|
||||
# Copy the "action-run.sh" script from the host to the VM.
|
||||
runner.vm.provision "file", source: "./action-run.sh", destination: "/tmp/action-run.sh"
|
||||
runner.vm.provision :shell, privileged: false, inline: "cp /tmp/action-run.sh ."
|
||||
# Execute the actions-run.sh script on every boot. This configures the and starts the runner.
|
||||
runner.vm.provision :shell, privileged: false, run: 'always', inline: "./action-run.sh #{PERSONAL_ACCESS_TOKEN} #{GITHUB_ORG} "run,build" >> action-run.log 2>&1 &"
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -1,57 +0,0 @@
|
||||
# -*- mode: ruby -*-
|
||||
# vi: set ft=ruby :
|
||||
|
||||
Vagrant.configure("2") do |config|
|
||||
config.vm.box = "generic/ubuntu2204"
|
||||
config.vm.box_check_update = true
|
||||
config.vm.define "<VM NAME>"
|
||||
config.vm.hostname = "<VM NAME>"
|
||||
# allows us to ssh into the machine, addressing the problem below
|
||||
# https://www.reddit.com/r/vagrant/comments/sb7hfl/new_to_vagrant_getting_efault_warning/
|
||||
config.ssh.username = "vagrant"
|
||||
config.ssh.password = "vagrant"
|
||||
|
||||
config.vm.provider "libvirt" do |vb|
|
||||
# Customize the amount of cpus and memory on the VM:
|
||||
vb.cpus = "4".to_i
|
||||
vb.memory = "16384".to_i
|
||||
end
|
||||
|
||||
# sets up vm
|
||||
config.vm.provision :shell, path: "provision_root.sh"
|
||||
config.vm.provision :shell, privileged: false, path: "provision_nonroot.sh"
|
||||
# To ensure we don't run out of memory, we enable dynamic Swap Space. This is
|
||||
# done via the "swapspace" daemon: https://pqxx.org/development/swapspace/
|
||||
config.vm.provision :shell, inline: "sudo apt install swapspace -y"
|
||||
# The provision_root.sh adds the vagrant user to the docker group, so we need to reload the VM.
|
||||
config.vm.provision :reload
|
||||
config.vm.provision :shell, run: 'always', inline: <<-SHELL
|
||||
# When running gem5 in SE mode we must overcommit memory.
|
||||
# This is run on every startup of the VM.
|
||||
/sbin/sysctl vm.overcommit_memory=1
|
||||
SHELL
|
||||
config.vm.provision :shell, privileged: false, run: 'always', inline: <<-SHELL
|
||||
if [ -d ~/actions-runner ]; then
|
||||
# This will be run everytime the VM is run (once created).
|
||||
cd actions-runner
|
||||
nohup ./run.sh &
|
||||
else
|
||||
# This will be run the first time the VM is created.
|
||||
mkdir ~/actions-runner && cd ~/actions-runner
|
||||
curl -so actions-runner-linux-x64-2.304.0.tar.gz -L \
|
||||
https://github.com/actions/runner/releases/download/v2.304.0/actions-runner-linux-x64-2.304.0.tar.gz
|
||||
tar xzf ./actions-runner-linux-x64-2.304.0.tar.gz
|
||||
|
||||
# configure the runner
|
||||
# echo automatically sets the name of the runner, and the tags
|
||||
# create a personal access token with admin permission and copy it into the curl command
|
||||
echo -ne '\n\nbuild\n\n' | ./config.sh --url https://github.com/<GITHUB REPO> --token $(curl -L \
|
||||
-X POST -H "Accept: application/vnd.github+json" -H "Authorization: Bearer <PERSONAL ACCESS TOKEN>" \
|
||||
-H "X-GitHub-Api-Version: 2022-11-28" \
|
||||
https://api.github.com/repos/<GITHUB REPO>/actions/runners/registration-token | jq -r '.token')
|
||||
# start the runner
|
||||
nohup ./run.sh &
|
||||
fi
|
||||
SHELL
|
||||
|
||||
end
|
||||
@@ -1,56 +0,0 @@
|
||||
# -*- mode: ruby -*-
|
||||
# vi: set ft=ruby :
|
||||
|
||||
Vagrant.configure("2") do |config|
|
||||
config.vm.box = "generic/ubuntu2204"
|
||||
config.vm.box_check_update = true
|
||||
config.vm.define "<VM NAME>"
|
||||
config.vm.hostname = "<VM NAME>"
|
||||
# allows us to ssh into the machine, addressing the problem below
|
||||
# https://www.reddit.com/r/vagrant/comments/sb7hfl/new_to_vagrant_getting_efault_warning/
|
||||
config.ssh.username = "vagrant"
|
||||
config.ssh.password = "vagrant"
|
||||
|
||||
config.vm.provider "libvirt" do |vb|
|
||||
# Customize the amount of cpus and memory on the VM:
|
||||
vb.cpus = "1".to_i
|
||||
vb.memory = "8192".to_i
|
||||
end
|
||||
|
||||
# sets up vm
|
||||
config.vm.provision :shell, path: "provision_root.sh"
|
||||
config.vm.provision :shell, privileged: false, path: "provision_nonroot.sh"
|
||||
# To ensure we don't run out of memory, we enable dynamic Swap Space. This is
|
||||
# done via the "swapspace" daemon: https://pqxx.org/development/swapspace/
|
||||
config.vm.provision :shell, inline: "sudo apt install swapspace -y"
|
||||
# The provision_root.sh adds the vagrant user to the docker group, so we need to reload the VM.
|
||||
config.vm.provision :reload
|
||||
config.vm.provision :shell, run: 'always', inline: <<-SHELL
|
||||
# When running gem5 in SE mode we must overcommit memory.
|
||||
# This is run on every startup of the VM.
|
||||
/sbin/sysctl vm.overcommit_memory=1
|
||||
SHELL
|
||||
config.vm.provision :shell, privileged: false, run: 'always', inline: <<-SHELL
|
||||
if [ -d ~/actions-runner ]; then
|
||||
# This will be run everytime the VM is run (once created).
|
||||
cd actions-runner
|
||||
nohup ./run.sh &
|
||||
else
|
||||
# This will be run the first time the VM is created.
|
||||
mkdir ~/actions-runner && cd ~/actions-runner
|
||||
curl -so actions-runner-linux-x64-2.304.0.tar.gz -L \
|
||||
https://github.com/actions/runner/releases/download/v2.304.0/actions-runner-linux-x64-2.304.0.tar.gz
|
||||
tar xzf ./actions-runner-linux-x64-2.304.0.tar.gz
|
||||
|
||||
# configure the runner
|
||||
# echo automatically sets the name of the runner, and the tags
|
||||
# create a personal access token with admin permission and copy it into the curl command
|
||||
echo -ne '\n\nrun\n\n' | ./config.sh --url https://github.com/<GITHUB REPO> --token $(curl -L \
|
||||
-X POST -H "Accept: application/vnd.github+json" -H "Authorization: Bearer <PERSONAL ACCESS TOKEN>" \
|
||||
-H "X-GitHub-Api-Version: 2022-11-28" \
|
||||
https://api.github.com/repos/<GITHUB REPO>/actions/runners/registration-token | jq -r '.token')
|
||||
# start the runner
|
||||
nohup ./run.sh &
|
||||
fi
|
||||
SHELL
|
||||
end
|
||||
81
util/github-runners-vagrant/action-run.sh
Executable file
81
util/github-runners-vagrant/action-run.sh
Executable file
@@ -0,0 +1,81 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Copyright (c) 2023 The Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
set -x
|
||||
|
||||
# No argument checking here, this is run directly in the Vagrantfile.
|
||||
PERSONAL_ACCESS_TOKEN="$1"
|
||||
GITHUB_ORG="$2"
|
||||
LABELS="$3"
|
||||
WORK_DIR="_work"
|
||||
|
||||
# This checks there isn't another instance of this script running.
|
||||
# If this script is run twice then more than one runner can be active in the
|
||||
# VM and this causes problems.
|
||||
if [[ `pgrep -f $0` != "$$" ]]; then
|
||||
echo "Another instance of shell already exist! Exiting"
|
||||
exit
|
||||
fi
|
||||
|
||||
# If the tarball isn't here then download it and extract it.
|
||||
# Note: we don't delete the tarball, we use it to check if we've already
|
||||
# downloaded it and extracted it.
|
||||
if [ ! -f "actions-runner-linux-x64-2.304.0.tar.gz" ]; then
|
||||
wget https://github.com/actions/runner/releases/download/v2.304.0/actions-runner-linux-x64-2.304.0.tar.gz
|
||||
tar xzf ./actions-runner-linux-x64-2.304.0.tar.gz
|
||||
fi
|
||||
|
||||
# An infinite loop to re-configure and re-run the runner after each job.
|
||||
while true; do
|
||||
# 1. Obtain the registration token.
|
||||
token_curl=$(curl -L \
|
||||
-X POST \
|
||||
-H "Accept: application/vnd.github+json" \
|
||||
-H "Authorization: Bearer ${PERSONAL_ACCESS_TOKEN}" \
|
||||
-H "X-GitHub-Api-Version: 2022-11-28" \
|
||||
https://api.github.com/orgs/${GITHUB_ORG}/actions/runners/registration-token)
|
||||
|
||||
token=$(echo ${token_curl} | jq -r '.token')
|
||||
|
||||
# 2. Configure the runner.
|
||||
./config.sh --unattended \
|
||||
--url https://github.com/${GITHUB_ORG} \
|
||||
--ephemeral \
|
||||
--replace \
|
||||
--work "${WORK_DIR}" \
|
||||
--name "$(hostname)" \
|
||||
--labels "${LABELS}" \
|
||||
--token ${token}
|
||||
|
||||
# 3. Run the runner.
|
||||
./run.sh # This will complete with the runner being destroyed
|
||||
|
||||
# 4. Cleanup the machine
|
||||
rm -rf "${WORK_DIR}"
|
||||
docker system prune --force --volumes
|
||||
done
|
||||
@@ -1,5 +1,31 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2023 The Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# fail on unset variables and command errors
|
||||
set -eu -o pipefail # -x: is for debugging
|
||||
|
||||
|
||||
@@ -1,13 +1,39 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Copyright (c) 2023 The Regents of the University of California
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met: redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer;
|
||||
# redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution;
|
||||
# neither the name of the copyright holders nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# fail on unset variables and command errors
|
||||
set -eu -o pipefail # -x: is for debugging
|
||||
|
||||
apt-get update
|
||||
apt-get upgrade -y
|
||||
apt-get install -y software-properties-common
|
||||
add-apt-repository --yes --update ppa:git-core/ppa
|
||||
apt-get install -y \
|
||||
software-properties-common \
|
||||
bash \
|
||||
build-essential \
|
||||
clang-format \
|
||||
@@ -25,8 +51,12 @@ apt-get install -y \
|
||||
tree \
|
||||
wget \
|
||||
yamllint \
|
||||
zstd
|
||||
snap install jq
|
||||
zstd \
|
||||
jq \
|
||||
apt-transport-https ca-certificates \
|
||||
curl \
|
||||
gnupg \
|
||||
lsb-release
|
||||
|
||||
# Install docker
|
||||
apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
|
||||
@@ -34,10 +64,14 @@ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/
|
||||
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||
apt-get update -y
|
||||
apt-get install -y docker-ce docker-ce-cli containerd.io
|
||||
groupadd docker || true
|
||||
gpasswd -a vagrant docker
|
||||
newgrp docker
|
||||
systemctl restart docker
|
||||
|
||||
# Add the Vagrant user to the docker group.
|
||||
# Note: The VM needs rebooted for this to take effect. `newgrp docker` doesn't
|
||||
# work.
|
||||
usermod -aG docker vagrant
|
||||
|
||||
# Cleanup
|
||||
apt-get autoremove -y
|
||||
|
||||
# Resize the root partition to fill up all the free size on the disk
|
||||
lvextend -l +100%FREE $(df / --output=source | sed 1d)
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
#!/bin/bash
|
||||
|
||||
NUM_RUNNERS=20
|
||||
NUM_BUILDERS=3
|
||||
RUNNER_PREFIX="$(hostname)-runner-"
|
||||
BUILDER_PREFIX="$(hostname)-builder-"
|
||||
|
||||
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
|
||||
export VAGRANT_HOME=${SCRIPT_DIR}
|
||||
|
||||
param="up"
|
||||
if [[ $# -ge 1 ]]; then
|
||||
param=$1
|
||||
if [[ "${param}" != "destroy" ]] && [[ "${param}" != "shutdown" ]]; then
|
||||
echo "Only valid parameters are 'destroy' and 'shutdown' to destroy all VMs or shutdown all VMs"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
for (( i=1; i<=NUM_RUNNERS; i++ )); do
|
||||
sed -i "s/ config.vm.define.*/ config.vm.define \"${RUNNER_PREFIX}${i}\"/g" Vagrantfile-runner
|
||||
sed -i "s/ config.vm.hostname.*/ config.vm.hostname = \"${RUNNER_PREFIX}${i}\"/g" Vagrantfile-runner
|
||||
if [[ "${param}" == "destroy" ]]; then
|
||||
VAGRANT_VAGRANTFILE=Vagrantfile-runner vagrant destroy -f
|
||||
elif [[ "${param}" == "shutdown" ]]; then
|
||||
VAGRANT_VAGRANTFILE=Vagrantfile-runner vagrant halt -f
|
||||
else
|
||||
VAGRANT_VAGRANTFILE=Vagrantfile-runner vagrant up --provider=libvirt
|
||||
fi
|
||||
done
|
||||
|
||||
for (( i=1; i<=NUM_BUILDERS; i++ )); do
|
||||
sed -i "s/ config.vm.define.*/ config.vm.define \"${BUILDER_PREFIX}${i}\"/g" Vagrantfile-builder
|
||||
sed -i "s/ config.vm.hostname.*/ config.vm.hostname = \"${BUILDER_PREFIX}${i}\"/g" Vagrantfile-builder
|
||||
if [[ "${param}" == "destroy" ]]; then
|
||||
VAGRANT_VAGRANTFILE=Vagrantfile-builder vagrant destroy -f
|
||||
elif [[ "${param}" == "shutdown" ]]; then
|
||||
VAGRANT_VAGRANTFILE=Vagrantfile-builder vagrant halt -f
|
||||
else
|
||||
VAGRANT_VAGRANTFILE=Vagrantfile-builder vagrant up --provider=libvirt
|
||||
fi
|
||||
done
|
||||
Reference in New Issue
Block a user