commit b6fc7d59b3a70de44f2e2fe8ee49ea387b6f37ee Author: Pierre Prinetti Date: Fri Jul 7 20:04:22 2023 +0200 First commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..7f673d6 --- /dev/null +++ b/README.md @@ -0,0 +1,53 @@ +# forgejo-hetzer-runner + +Spawn a new Forgejo runner on Hetzner infrastructure. + +**Requirements:** +* [`jq`](https://jqlang.github.io/jq) + +**Required environment variables:** +* `HETZNER_API_TOKEN`: A Hetzner token valid for operating servers + +## Usage + +**To stand up a runner:** + +```shell +./runner-up.sh -r +``` + +Avoid root login with password by passing your SSH key ID on server creation: + +```shell +./runner-up.sh -s -r +``` + +**Delete the server(s):** +```shell +./runner-get.sh | jq '.servers[].id' | xargs -r -n1 ./runner-down.sh +``` + +**Log in:** +```shell +ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no "runner@$(./runner-get.sh | jq -j '.servers[0].public_net.ipv4.ip')" +``` + +## Fetching a registration token + +The `FORGEJO_TOKEN` must be manually retrieved from the web interface. Note that each token is only valid for registering one runner. + +* Retrieve a token to register a runner for your organization: `https://codeberg.org/org/${organization_name}/settings/runners` +* Retrieve a token to register a runner for one repository: `https://codeberg.org/${user_or_organization_name}/${repository_name}/settings/runners` + +This issue tracks the addition of an API endpoint to fetch registration tokens in Forgejo: https://codeberg.org/forgejo/forgejo/issues/1030 + +## Additional notes + +The server has to have an IPv4 interface. Otherwise: +* fetching `forgejo-runner` fails because `code.forgejo.org` is IPv4-only +* fetching default Docker base images fails because `docker.io` is IPv4-only +* your CI steps might involve communicating with an IPv4-only machine. + +## External references + +* [Hetzner cloud API reference](https://docs.hetzner.cloud/) diff --git a/runner-down.sh b/runner-down.sh new file mode 100755 index 0000000..143fc97 --- /dev/null +++ b/runner-down.sh @@ -0,0 +1,10 @@ +#!/usr/bin/env bash + +set -Eeuo pipefail + +declare -r id="$1" + +curl -isS \ + -X DELETE \ + -H "Authorization: Bearer ${HETZNER_API_TOKEN}" \ + "https://api.hetzner.cloud/v1/servers/${id}" diff --git a/runner-get.sh b/runner-get.sh new file mode 100755 index 0000000..a1f0e2a --- /dev/null +++ b/runner-get.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +set -Eeuo pipefail + +curl -sS \ + -X GET \ + -H "Authorization: Bearer ${HETZNER_API_TOKEN}" \ + --url-query 'label_selector=role==runner' \ + 'https://api.hetzner.cloud/v1/servers' diff --git a/runner-up.sh b/runner-up.sh new file mode 100755 index 0000000..77acf53 --- /dev/null +++ b/runner-up.sh @@ -0,0 +1,111 @@ +#!/usr/bin/env bash + +set -Eeuo pipefail + +random_string() { + declare -r length="$1" + tr -dc a-z /usr/bin/forgejo-runner + - echo 'f0dab69994fcdc3d35ef34b59ff3cff6f44a70112a6e7125f1fb7949d879e02e2a2d1d0a3ac8732b2bae7e47bfb7358a8fa5f409fe4d85e48c4e69b0c38c8e43 /usr/bin/forgejo-runner' | sha512sum -c && chmod +x /usr/bin/forgejo-runner + - mkdir -p /etc/runner + - cd /etc/runner && /usr/bin/forgejo-runner register --no-interactive --token ${runner_token} --name runner --instance https://codeberg.org --labels docker:docker://node:16-bullseye + - /usr/bin/forgejo-runner generate-config > /etc/runner/config.yml + - chown -R runner:runner /etc/runner + - | + cat > /etc/systemd/system/runner.service <