mirror of
https://seed.radicle.dev/rad:zwTxygwuz5LDGBq255RA2CbNGrz8.git
synced 2026-10-18 19:30:29 +08:00
feat: add shell script to set up Debian host as a Radicle CI node
This commit is contained in:
Executable
+200
@@ -0,0 +1,200 @@
|
||||
#!/usr/bin/env bash
|
||||
#
|
||||
# Install Radicle CI with Ambient on a Debian host. Run this as root.
|
||||
# Note that this is not suitable for upgrades, only initial installation.
|
||||
#
|
||||
# This script installs a Radicle node, the Radicle CI broker, and the Ambient
|
||||
# CI engine. It also installs Caddy and other tooling needed. To access the CI
|
||||
# reports, go to http://HOST, where `HOST` is the hostname. Note lack of TLS.
|
||||
# The `radicle-ci-example` repository is cloned and this triggers CI to run.
|
||||
#
|
||||
# You will want to review the configuration files:
|
||||
#
|
||||
# * /home/ci/ci.yaml - the CI broker
|
||||
# * /home/ci/radicle-ci-ambient.yaml - the Ambient adapter
|
||||
# * /home/ci/.config/ambient/config.yaml - Ambient itself
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Print log message.
|
||||
log() {
|
||||
printf "LOG: $*\n"
|
||||
}
|
||||
|
||||
# Print error message and terminate script.
|
||||
die() {
|
||||
echo "$*" 1>&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
log Set up a temporary directory and its automatic removal.
|
||||
tmp="$(mktemp -d)"
|
||||
trap 'rm -rf "$tmp"' EXIT
|
||||
|
||||
log Prevent packages from asking configuration questions when installed.
|
||||
export DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
log Install tools we will need.
|
||||
if ! apt-get update -q >"$tmp/update.log" 2>&1; then
|
||||
cat "$tmp/update.log"
|
||||
exit 1
|
||||
fi
|
||||
if ! command -v chronic >/dev/null; then
|
||||
if ! apt-get install -y moreutils >"$tmp/moreutils" 2>&1; then
|
||||
cat "$tmp/moreutils"
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
if ! command -v curl >/dev/null; then
|
||||
chronic apt-get install -y curl
|
||||
fi
|
||||
if ! command -v gpg >/dev/null; then
|
||||
chronic apt-get install -y gpg
|
||||
fi
|
||||
if ! command -v pstree >/dev/null; then
|
||||
chronic apt-get install -y psmisc
|
||||
fi
|
||||
if ! command -v unxz >/dev/null; then
|
||||
chronic apt-get install -y xz-utils
|
||||
fi
|
||||
|
||||
log Set up the Radicle APT repository.
|
||||
if ! dpkg -l radicle-archive-keyring 2>&1 | grep '^ii ' >/dev/null; then
|
||||
log Download current keyring package.
|
||||
cd "$tmp"
|
||||
curl -O -sL https://radicle.xyz/apt/radicle-archive-keyring.deb
|
||||
chronic dpkg -i radicle-archive-keyring.deb
|
||||
|
||||
log Add to APT source lists.
|
||||
cat <<EOF | tee /etc/apt/sources.list.d/radicle_xyz_apt.list >/dev/null
|
||||
deb [signed-by=/usr/share/radicle/radicle-archive-keyring.asc] https://radicle.xyz/apt release main
|
||||
EOF
|
||||
|
||||
log Install keyring package.
|
||||
chronic apt-get update
|
||||
chronic apt-get install -y radicle-archive-keyring
|
||||
fi
|
||||
|
||||
log Install Radicle and CI software.
|
||||
chronic apt-get install -y radicle radicle-ci-broker radicle-ci-ambient ambient-ci
|
||||
|
||||
log Create user for running CI. This user will also run the Radicle node.
|
||||
if ! getent passwd ci >/dev/null; then
|
||||
chronic adduser --disabled-password --comment "Radicle CI" ci
|
||||
fi
|
||||
|
||||
log Add CI user to kvm group.
|
||||
chronic adduser ci kvm
|
||||
|
||||
log Configure Ambient.
|
||||
install -d ~ci/.config/ambient -o ci -g ci
|
||||
sudo -u ci tee ~ci/.config/ambient/config.yaml <<EOF >/dev/null
|
||||
executor: /usr/bin/ambient-execute-plan
|
||||
projects: ~/ambient-projects.yaml
|
||||
artifacts_max_size: 1G
|
||||
cache_max_size: 50G
|
||||
uefi: true
|
||||
qemu:
|
||||
cpus: 1
|
||||
memory: 1G
|
||||
lint: false
|
||||
EOF
|
||||
sudo -i -u ci ambient config >/dev/null
|
||||
|
||||
log Install Caddy.
|
||||
chronic apt-get install -y caddy
|
||||
tee /etc/caddy/Caddyfile <<EOF >/dev/null
|
||||
:80 {
|
||||
root * /srv/http/
|
||||
file_server browse
|
||||
}
|
||||
EOF
|
||||
install -d /srv/http -o ci -g ci
|
||||
systemctl reload caddy
|
||||
|
||||
log Configure CI broker.
|
||||
sudo -u ci tee ~ci/ci.yaml <<EOF >/dev/null
|
||||
description: |
|
||||
<p>This is a Radicle CI node.
|
||||
db: /home/ci/ci.db
|
||||
report_dir: /srv/http
|
||||
concurrent_adapters: 1
|
||||
adapters:
|
||||
ambient:
|
||||
command: /bin/radicle-ci-ambient
|
||||
env:
|
||||
RADICLE_CI_AMBIENT: /home/ci/radicle-ci-ambient.yaml
|
||||
triggers:
|
||||
- adapter: ambient
|
||||
filters:
|
||||
- !HasFile ".radicle/ambient.yaml"
|
||||
EOF
|
||||
sudo -i -u ci cib --log-level error --config ci.yaml config >/dev/null
|
||||
|
||||
log Configure Ambient adapter.
|
||||
sudo -i -u ci tee ~ci/radicle-ci-ambient.yaml <<EOF >/dev/null
|
||||
image: /home/ci/ambient.qcow2
|
||||
logdir: /srv/http/ambient-log
|
||||
log: /home/ci/radicle-ci-ambient.log
|
||||
base_url: "http://$(hostname)/ambient-log"
|
||||
EOF
|
||||
install -d ~ci/.local/state/ambient-ci/projects -o ci -g ci
|
||||
|
||||
log Download virtual machine image for Ambient.
|
||||
if ! [ -e ~ci/ambient.qcow2 ]; then
|
||||
chronic sudo -i -u ci curl -sOL https://files.liw.fi/ambient/ambient.qcow2.xz
|
||||
sudo -i -u ci unxz ambient.qcow2.xz
|
||||
fi
|
||||
|
||||
log Set up Radicle node.
|
||||
chronic sudo -i -u ci rad auth --alias "ci-$(hostname)" --stdin </dev/null
|
||||
|
||||
log Install systemd service unit for Radicle node.
|
||||
cat <<EOF >/etc/systemd/system/radicle-node.service
|
||||
[Unit]
|
||||
Description=Radicle Node
|
||||
After=network-online.target
|
||||
Requires=network-online.target
|
||||
|
||||
[Service]
|
||||
User=ci
|
||||
Group=ci
|
||||
ExecStart=/usr/bin/radicle-node --listen 0.0.0.0:8776 --force
|
||||
KillMode=process
|
||||
Restart=always
|
||||
RestartSec=3
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
EOF
|
||||
|
||||
log Install systemd service unit for Radicle CI broker
|
||||
cat <<EOF >/etc/systemd/system/radicle-ci-broker.service
|
||||
[Unit]
|
||||
Requires=radicle-node.service
|
||||
After=radicle-node.service
|
||||
Description=Radicle CI broker
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
ExecStart=/bin/cib --log-level info --config /home/ci/ci.yaml process-events
|
||||
KillMode=control-group
|
||||
Restart=always
|
||||
RestartSec=1
|
||||
User=ci
|
||||
Group=ci
|
||||
|
||||
[Install]
|
||||
WantedBy=default.target
|
||||
EOF
|
||||
|
||||
log Start Radicle CI via systemd.
|
||||
systemctl daemon-reload
|
||||
chronic systemctl enable radicle-node
|
||||
chronic systemctl enable radicle-ci-broker
|
||||
systemctl start radicle-ci-broker
|
||||
|
||||
log Seed the radicle-ci-example repository.
|
||||
chronic sudo -i -u ci rad seed rad:z28U8KUBvVSMQc13NydX3LBDsdEdQ
|
||||
|
||||
log "OK"
|
||||
Reference in New Issue
Block a user