#!/bin/bash # SPDX-License-Identifier: MIT set -ex SELF_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" : ${FORGEJO_RUNNER_CONFIG:=$SELF_DIR/runner-config.yaml} function dependencies() { if ! which curl daemon > /dev/null ; then apt-get install -y -qq curl daemon fi } function download() { local runner_repository="$1" local version="$2" if ! which forgejo-runner > /dev/null; then if ! curl -L --fail -sS $runner_repository/releases/download/$version/forgejo-runner-${version#v}-linux-amd64 > /bin/forgejo-runner ; then # backward compatibility for for the naming scheme prior to 3.0.0 curl -L --fail -sS $runner_repository/releases/download/$version/forgejo-runner-linux-amd64 > /bin/forgejo-runner fi chmod 755 /bin/forgejo-runner fi } function register() { local forgejo="$1" mktemp -d > forgejo-runner-home docker exec --user 1000 forgejo forgejo actions generate-runner-token > forgejo-runner-token timeout --signal=KILL 30 forgejo-runner register --no-interactive --instance "$forgejo" --name runner --token $(cat forgejo-runner-token) --labels docker:docker://code.forgejo.org/oci/node:16-bullseye,ubuntu-latest:docker://code.forgejo.org/oci/node:16-buster,self-hosted } function run() { rm -f forgejo-runner.log daemon --chdir=$(pwd) --unsafe \ --env="TERM=$TERM" --env="HOME=$(cat forgejo-runner-home)" --env="PATH=$PATH" --env="USER=$USER" --env="TERM=dumb" --env="USERNAME=$USERNAME" --env="LANG=$LANG" \ --pidfile=$(pwd)/forgejo-runner-pid --errlog=$(pwd)/forgejo-runner.log --output=$(pwd)/forgejo-runner.log -- \ forgejo-runner --config $FORGEJO_RUNNER_CONFIG daemon sleep 1 cat forgejo-runner.log } function reload() { teardown rm -f forgejo-runner.log run } function setup() { local runner_repository="${1:-https://code.forgejo.org/forgejo/runner}" local version="${2:-v3.0.1}" local forgejo="${3:-http://$(cat forgejo-ip):3000/}" dependencies download $runner_repository $version register $forgejo run } function stop_daemon() { local daemon=$1 local DIR=. if test -f $DIR/$daemon-pid ; then local pid=$(cat $DIR/$daemon-pid) kill -TERM $pid pidwait $pid || true for delay in 1 1 2 2 5 5 ; do if ! test -f $DIR/$daemon-pid ; then break fi sleep $delay done ! test -f $DIR/$daemon-pid fi } function teardown() { stop_daemon forgejo-runner rm -fr $(cat forgejo-runner-home) } "$@"