From ee850e8db07cfa3178c53484ea392025c34320df Mon Sep 17 00:00:00 2001 From: Liviu Burcusel Date: Fri, 12 Dec 2025 11:31:30 +0100 Subject: [PATCH] Initial commit --- README.md | 68 ++++++++++++ runner/data/.runner.example | 12 +++ runner/data/config.yml | 203 ++++++++++++++++++++++++++++++++++++ runner/docker-compose.yml | 18 ++++ 4 files changed, 301 insertions(+) create mode 100644 README.md create mode 100644 runner/data/.runner.example create mode 100644 runner/data/config.yml create mode 100644 runner/docker-compose.yml diff --git a/README.md b/README.md new file mode 100644 index 0000000..1407b31 --- /dev/null +++ b/README.md @@ -0,0 +1,68 @@ +# Forgejo runner + +## Installation + +### Prerequisites + +- git +- working Forgejo server +- working docker installation + +### Setup + +#### **Clone the repository** + +```bash +git clone ssh://git@git.burcusel.nl:2222/public/forgejo-runner.git +``` + +#### **Customize docker_compose.yml** + +Edit `docker_compose.yml` and change following keys + +- services.runner + - image // Set the version to the latest + - container_name // Give the container a meaningful name + - cpus, cpuset // Optional if you want to control how many cpus are used + +```bash +vim runner/docker-compose.yml +``` + +#### **Up we go!** + +```bash +docker compose up -d +``` + +#### **Register your runner** + +In your newly created container run `forgejo-runner register` and follow on screen instruction. You can get more info in +the [documentation](https://forgejo.org/docs/latest/admin/actions/runner-installation/#standard-registration). + +After successfully register edit `.runner` file and modify **labels** section with the values from `.runner.example` + +```bash +docker exec -it ${YOUR-CONTAINER-NAME} /bin/sh +forgejo-runner register +``` + +#### **Finalize setup** + +Edit `docker_compose.yml` and comment the current active command line and un-comment the next one. It should look like this: + +```bash +services: + runner: + ... + # command: '/bin/sh -c "while : ; do sleep 1 ; done ;"' + command: '/bin/sh -c "sleep 5; forgejo-runner daemon --config /data/config.yml"' + ... +``` + +After changes are made, rebuild the container. + +```bash +docker compose down +docker compose up -d +``` diff --git a/runner/data/.runner.example b/runner/data/.runner.example new file mode 100644 index 0000000..02fe55e --- /dev/null +++ b/runner/data/.runner.example @@ -0,0 +1,12 @@ +{ + "WARNING": "This file is automatically generated by forgejo-runner. Do not edit it manually unless you know what you are doing. Removing this file will cause act runner to re-register as a new runner.", + "id": 0, // Autogenerated ID of the runner + "uuid": "00000000-0000-0000-0000-000000000000", + "name": "forgejo-runner", + "token": "0000000000000000000000000000000000000000", + "address": "https://your-server.com/", + "labels": [ + "node24:docker://node:24-trixie", + "docker:docker://docker:dind" + ] +} diff --git a/runner/data/config.yml b/runner/data/config.yml new file mode 100644 index 0000000..476016d --- /dev/null +++ b/runner/data/config.yml @@ -0,0 +1,203 @@ +# Example configuration file, it's safe to copy this as the default config file without any modification. + +# You don't have to copy this file to your instance, +# just run `forgejo-runner generate-config > config.yaml` to generate a config file. + +# +# The value of level or job_level can be trace, debug, info, warn, error or fatal +# +log: + # + # What is displayed in the output of the runner process but not sent + # to the Forgejo instance. + # + level: info + # + # What is sent to the Forgejo instance and therefore + # visible in the web UI for a given job. + # + job_level: info + +runner: + # Where to store the registration result. + file: .runner + # Execute how many tasks concurrently at the same time. + capacity: 1 + # Extra environment variables to run jobs. + envs: + A_TEST_ENV_NAME_1: a_test_env_value_1 + A_TEST_ENV_NAME_2: a_test_env_value_2 + # Extra environment variables to run jobs from a file. + # It will be ignored if it's empty or the file doesn't exist. + env_file: .env + # The timeout for a job to be finished. + # Please note that the Forgejo instance also has a timeout (3h by default) for the job. + # So the job could be stopped by the Forgejo instance if it's timeout is shorter than this. + timeout: 3h + # The timeout for the runner to wait for running jobs to finish when + # shutting down because a TERM or INT signal has been received. Any + # running jobs that haven't finished after this timeout will be + # cancelled. + # If unset or zero the jobs will be cancelled immediately. + shutdown_timeout: 3h + # Whether skip verifying the TLS certificate of the instance. + insecure: false + # The timeout for fetching the job from the Forgejo instance. + fetch_timeout: 5s + # The interval for fetching the job from the Forgejo instance. + fetch_interval: 15s + # The interval for reporting the job status and logs to the Forgejo instance. + report_interval: 1s + # At the end of a job, retry configuration for sending logs to remote. + # report_retry: + # # Maximum number of retry attempts. + # max_retries: 10 + # # Initial delay between retries. Delay between retries doubles up to `max_delay`. + # initial_delay: 100ms + # # Maximum delay between retries, defaults to 0, 0 is treated as no maximum. + # max_delay: 0 + # The labels of a runner are used to determine which jobs the runner can run, and how to run them. + # Like: ["macos-arm64:host", "ubuntu-latest:docker://node:20-bookworm", "ubuntu-22.04:docker://node:20-bookworm"] + # If it's empty when registering, it will ask for inputting labels. + # If it's empty when executing the `daemon`, it will use labels in the `.runner` file. + labels: [] + +cache: + # + # When enabled, workflows will be given the ACTIONS_CACHE_URL environment variable + # used by the https://code.forgejo.org/actions/cache action. The server at this + # URL must implement a compliant REST API and it must also be reachable from + # the container or host running the workflows. + # + # See also https://forgejo.org/docs/next/user/actions/advanced-features/#cache + # + # When it is not enabled, none of the following options apply. + # + # It works as follows: + # + # - the workflow is given a one time use ACTIONS_CACHE_URL + # - a cache proxy listens to ACTIONS_CACHE_URL + # - the cache proxy securely communicates with the cache server using + # a shared secret + # + enabled: true + # + ####################################################################### + # + # Only used for the internal cache server. + # + # If external_server is not set, the Forgejo runner will spawn a + # cache server that will be used by the cache proxy. + # + ####################################################################### + # + # The port bound by the internal cache server. + # 0 means to use a random available port. + # + port: 0 + # + # The directory to store the cache data. + # + # If empty, the cache data will be stored in $HOME/.cache/actcache. + # + dir: "" + # + ####################################################################### + # + # Only used for the external cache server. + # + # If external_server is set, the internal cache server is not + # spawned. + # + ####################################################################### + # + # The URL of the cache server. The URL should generally end with + # "/". The cache proxy will forward requests to the external + # server. The requests are authenticated with the "secret" that is + # shared with the external server. + # + external_server: "" + # + # The shared cache secret used to secure the communications between + # the cache proxy and the cache server. + # + # If empty, it will be generated to a new secret automatically when + # the server starts and it will stay the same until it restarts. + # + secret: "" + # + ####################################################################### + # + # Common to the internal and external cache server + # + ####################################################################### + # + # The IP or hostname (195.84.20.30 or example.com) to use when constructing + # ACTIONS_CACHE_URL which is the URL of the cache proxy. + # + # If empty it will be detected automatically. + # + # If the containers or host running the workflows reside on a + # different network than the Forgejo runner (for instance when the + # docker server used to create containers is not running on the same + # host as the Forgejo runner), it may be impossible to figure that + # out automatically. In that case you can specify which IP or + # hostname to use to reach the internal cache server created by the + # Forgejo runner. + # + host: "" + # + # The port bound by the internal cache proxy. + # 0 means to use a random available port. + # + proxy_port: 0 + # + # Overrides the ACTIONS_CACHE_URL variable passed to workflow + # containers. The URL should generally not end with "/". This should only + # be used if the runner host is not reachable from the workflow containers, + # and requires further setup. + # + actions_cache_url_override: "" + +container: + # Specifies the network to which the container will connect. + # Could be host, bridge or the name of a custom network. + # If it's empty, create a network automatically. + network: "host" + # Whether to create networks with IPv6 enabled. Requires the Docker daemon to be set up accordingly. + # Only takes effect if "network" is set to "". + enable_ipv6: false + # Whether to use privileged mode or not when launching task containers (privileged mode is required for Docker-in-Docker). + privileged: true + # And other options to be used when the container is started (eg, --volume /etc/ssl/certs:/etc/ssl/certs:ro). + options: + # The parent directory of a job's working directory. + # If it's empty, /workspace will be used. + workdir_parent: + # Volumes (including bind mounts) can be mounted to containers. Glob syntax is supported, see https://github.com/gobwas/glob + # You can specify multiple volumes. If the sequence is empty, no volumes can be mounted. + # For example, if you only allow containers to mount the `data` volume and all the json files in `/src`, you should change the config to: + # valid_volumes: + # - data + # - /etc/ssl/certs + # If you want to allow any volume, please use the following configuration: + # valid_volumes: + # - '**' + valid_volumes: [] + # Overrides the docker host set by the DOCKER_HOST environment variable, and mounts on the job container. + # If "-" or "", no docker host will be mounted in the job container + # If "automount", an available docker host will automatically be found and mounted in the job container (e.g. /var/run/docker.sock). + # If it's a url, the specified docker host will be mounted in the job container + # Example urls: unix:///run/docker.socket or ssh://user@host + # The specified socket is mounted within the job container at /var/run/docker.sock + #docker_host: "tcp://docker:2375" + docker_host: "automount" + # Pull docker image(s) even if already present + force_pull: false + # Rebuild local docker image(s) even if already present + force_rebuild: false + +host: + # The parent directory of a job's working directory. + # If it's empty, $HOME/.cache/act/ will be used. + workdir_parent: diff --git a/runner/docker-compose.yml b/runner/docker-compose.yml new file mode 100644 index 0000000..b977ae9 --- /dev/null +++ b/runner/docker-compose.yml @@ -0,0 +1,18 @@ +services: + runner: + image: data.forgejo.org/forgejo/runner:12 + container_name: forgejo-runner + user: "0:0" + # cpus: 4.0 + # cpuset: "4-7" + volumes: + - ./data:/data + - /var/run/docker.sock:/var/run/docker.sock + networks: + - net + restart: unless-stopped + command: '/bin/sh -c "while : ; do sleep 1 ; done ;"' + # command: '/bin/sh -c "sleep 5; forgejo-runner daemon --config /data/config.yml"' + +networks: + net: {}