Sign in

Search issue titles and bodies, change requests and comments. Private repositories you cannot read are not included.

vole
Clone

Read only, no credentials:

https://rodent.software/vole.git

Write over SSH with a registered key:

git clone ssh://git@rodent.software:2222/vole.git

A free and open-source forge that lives in your Git repo.

Blame · deploy/cloud-init/render.sh

Line attribution on main · 116 line(s)

04e063ca
Keenan Nemetz
3d ago
1 #!/bin/sh
51624dc6
Keenan Nemetz
3d ago
2 # Render a first-boot file for one machine, to paste into a provider's user-data
3 # field.
04e063ca
Keenan Nemetz
3d ago
4 #
d0d4239f
Keenan Nemetz
3d ago
5 # ./render.sh > user-data.yaml # the forge
6 # ./render.sh runner > runner-user-data.yaml # a CI runner
04e063ca
Keenan Nemetz
3d ago
7 #
d0d4239f
Keenan Nemetz
3d ago
8 # Values come from the environment. Anything unset falls back to the default
9 # below. The output goes into a cloud provider's "user data" field. See
10 # docs/deploy/vps.md and docs/deploy/runner.md.
04e063ca
Keenan Nemetz
3d ago
11 set -eu
12
13 here="$(cd "$(dirname "$0")" && pwd)"
d0d4239f
Keenan Nemetz
3d ago
14 what="${1:-vole}"
15
16 if ! command -v envsubst >/dev/null 2>&1; then
17 echo "envsubst is missing; install gettext (Debian and Ubuntu: apt install gettext-base)" >&2
18 exit 2
19 fi
20
21 # render <template> <placeholder names...>
22 #
23 # Only the named placeholders are substituted. A name outside the list is a typo,
24 # and envsubst would leave it in the output as literal text, so the list is the
25 # contract between this script and the template.
26 render() {
27 template="$1"
28 shift
29 list=""
30 for name in "$@"; do
31 list="$list\${$name} "
32 done
33 rendered="$(envsubst "$list" <"$here/$template")"
34 if printf '%s\n' "$rendered" | grep -q '\${'; then
35 echo "unsubstituted placeholder in $template:" >&2
36 printf '%s\n' "$rendered" | grep -n '\${' >&2
37 exit 1
38 fi
39 printf '%s\n' "$rendered"
40 }
04e063ca
Keenan Nemetz
3d ago
41
d0d4239f
Keenan Nemetz
3d ago
42 case "$what" in
43 vole)
44 : "${HOSTNAME:?set HOSTNAME to the DNS name the instance will answer on}"
45 : "${ADMIN_ACCOUNT:?set ADMIN_ACCOUNT to the account name to create}"
46 : "${ADMIN_SSH_KEY:?set ADMIN_SSH_KEY to the public key of that account}"
47 : "${VOLE_PACKAGE_URL:?set VOLE_PACKAGE_URL to the .deb for this machine's architecture}"
48 : "${ADMIN_EMAIL:=}"
49 : "${INSTANCE_NAME:=Vole}"
50 : "${TLS_MODE:=acme}"
04e063ca
Keenan Nemetz
3d ago
51
d0d4239f
Keenan Nemetz
3d ago
52 case "$TLS_MODE" in
04e063ca
Keenan Nemetz
3d ago
53 acme | proxy) ;;
54 *)
55 echo "TLS_MODE must be acme or proxy, got $TLS_MODE" >&2
56 exit 2
57 ;;
d0d4239f
Keenan Nemetz
3d ago
58 esac
04e063ca
Keenan Nemetz
3d ago
59
d0d4239f
Keenan Nemetz
3d ago
60 export hostname="$HOSTNAME"
61 export admin_account="$ADMIN_ACCOUNT"
62 export admin_ssh_key="$ADMIN_SSH_KEY"
63 export admin_email="$ADMIN_EMAIL"
64 export instance_name="$INSTANCE_NAME"
65 export tls_mode="$TLS_MODE"
66 export vole_package_url="$VOLE_PACKAGE_URL"
04e063ca
Keenan Nemetz
3d ago
67
d0d4239f
Keenan Nemetz
3d ago
68 render vole.yaml hostname admin_account admin_ssh_key admin_email instance_name tls_mode vole_package_url
69 ;;
70 runner)
71 : "${FORGE_HOST:?set FORGE_HOST to the instance's DNS name}"
72 : "${VOLE_PACKAGE_URL:?set VOLE_PACKAGE_URL to the .deb for this machine's architecture}"
73 : "${RUNNER_HOSTNAME:=vole-runner}"
74 : "${RUNNER_RUNTIME:=podman}"
75 : "${RUNNER_NETWORK:=bridge}"
76 : "${RUNNER_DIR:=/var/lib/vole-runner}"
77 # Labels a job's runs-on can ask for, space separated: "linux amd64".
78 : "${RUNNER_LABEL_NAMES:=linux}"
18c559ea
Keenan Nemetz
3d ago
79 # How many jobs this machine runs at once. Each is a container, so the machine
80 # has to carry this many times the container limits.
81 : "${RUNNER_JOBS:=1}"
4e3759da
Keenan Nemetz
4h ago
82 # What one job may take, and what the machine keeps for itself. The memory limit
83 # is the one to size for: RUNNER_JOBS times RUNNER_MEMORY is the runner at full
84 # stretch, and the unit's MemoryMax backstop is a percentage of the machine above
85 # it. RUNNER_DISK_RESERVE is free space kept under RUNNER_DIR: a job that takes
86 # the filesystem below it is stopped while it runs.
87 : "${RUNNER_MEMORY:=4G}"
88 : "${RUNNER_PIDS:=2048}"
89 : "${RUNNER_TMPFS:=1G}"
90 : "${RUNNER_DISK_RESERVE:=2G}"
04e063ca
Keenan Nemetz
3d ago
91
d0d4239f
Keenan Nemetz
3d ago
92 labels=""
93 for name in $RUNNER_LABEL_NAMES; do
94 labels="$labels--label $name "
95 done
04e063ca
Keenan Nemetz
3d ago
96
d0d4239f
Keenan Nemetz
3d ago
97 export runner_hostname="$RUNNER_HOSTNAME"
98 export forge_host="$FORGE_HOST"
99 export runner_runtime="$RUNNER_RUNTIME"
100 export runner_network="$RUNNER_NETWORK"
101 export runner_dir="$RUNNER_DIR"
18c559ea
Keenan Nemetz
3d ago
102 export runner_jobs="--jobs $RUNNER_JOBS"
4e3759da
Keenan Nemetz
4h ago
103 export runner_memory="$RUNNER_MEMORY"
104 export runner_pids="$RUNNER_PIDS"
105 export runner_tmpfs="$RUNNER_TMPFS"
106 export runner_disk_reserve="$RUNNER_DISK_RESERVE"
d0d4239f
Keenan Nemetz
3d ago
107 export runner_labels="$labels"
108 export vole_package_url="$VOLE_PACKAGE_URL"
04e063ca
Keenan Nemetz
3d ago
109
4e3759da
Keenan Nemetz
4h ago
110 render runner.yaml runner_hostname forge_host runner_runtime runner_network runner_dir runner_jobs runner_labels runner_memory runner_pids runner_tmpfs runner_disk_reserve vole_package_url
d0d4239f
Keenan Nemetz
3d ago
111 ;;
112 *)
113 echo "unknown template $what; use vole or runner" >&2
114 exit 2
115 ;;
116 esac