
# Self-hosted runners
[GitHub Actions](https://docs.github.com/en/actions) is used to do CI on Stack.
In the case of the Linux/AArch64 platform, since 8 February 2025, that is done
with a GitHub-hosted runner (currently in public preview). Previously, that was
done in a separate `linux-arm64` job of the `integration-tests.yml` workflow
that ran on a self-hosted runner for Linux and ARM64. Given that the
GitHub-hosted runner is only in preview, the documentation of the self-hosted
runner is being preserved for the time being.
## Introduction
The current basic setup was:
* FP Complete has an Oracle Cloud account that provides a free tier that
includes a really powerful ARM64 machine;
* within Oracle Cloud, FP Complete are running an Ubuntu/ARM64 instance; and
* on that instance, FP Complete are running the GitHub Runner software.
The runner name is `stack-github-action3` and the machine name is
`stack-github-action3`.
Occasionally Oracle will turn off the machine because:
* Oracle thinks it is not being used (because of the free tier); and/or
* other things, like disk space filling up.
The disk space can fill up due to obsolete Docker images, versions of GHC
installed by Stack or obsolete snapshots created by Stack.
## Managing the `stack-github-action3` runner
With the appropriate authority installed on the server, a maintainer can manage
the runner remotely using SSH, with command
`ssh ubuntu@arm-runner.stackage.org`.
!!! info
The authority is the addition of the maintainer's SSH public key to the end
of file `~/.ssh/authorized_keys` on the server.
This is best done using [`tmux`](https://github.com/tmux/tmux/wiki), a terminal
multiplexer, as follows:
~~~sh
$ # In a shell, command tmux to create a new session with a single window with a
$ # single pane (a pseudo terminal). The session will be displayed on the screen
$ # by a client:
$ tmux new-session
$ # Send the following command to that pseudo terminal, to connect to the
$ # remote host:
$ ssh ubuntu@arm-runner.stackage.org
$ # In the remote host, change to the actions-runner directory:
$ cd actions-runner
$ # In the remote host, start the runner:
$ ./run.sh
$ # Detach the current client from the session by the key combination of
$ # 'C-b' 'd' (where 'C-b' is CTRL+b). The session will continue to run in the
$ # background:
$ C-b d
~~~
The available disk space can be queried with command `df -h`; the relevant entry
is for filesystem `/dev/sda1`.
If the available space is low, that may be due to unncessary GHC versions
installed in Stack's `programs` directory.
## Re-configuring a removed `stack-github-action3` runner
A self-hosted runner is automatically removed from GitHub if it has not
connected to GitHub Actions for more than 14 days.
Re-adding a self-hosted runner to GitHub requires it to be configured, and
GitHub will suggest a configuration command like:
~~~text
./config.sh --url https://github.com/commercialhaskell/stack --token
~~~
However, to re-use and configure the runner machine, you have first to delete
the `.runner` file inside the `actions-runner` directory. This allows the runner
to be registered without having to re-download the self-hosted runner
application.
## The `ghc-arm-5` runner
From 9 February 2024, the Haskell Foundation sought to provide an alternative
runner named `ghc-arm-5` but that was based on NixOS and proved to be
incompatible.
## Alternatives to the self-hosted runners
One alternative to the self-hosted runners is to build statically-linked Stack
executables for Linux/AArch64 on macOS/AArch64. This can be done thanks to
the multi-architecture Docker images built and published by Olivier Benz, at
https://gitlab.com/benz0li/ghc-musl.
GitHub provides a GitHub-hosted macOS/AArch64 runner (`macOS-14`).
Unfortunately, that is macOS/M1 and the M1 machine architecture does not support
nested virtualisation. This rules out using Docker, as the runner is itself a
virtual machine.
However, this solution can be applied locally and the build outputs for the
Linux/AArch64 platform added manually to the result of the GitHub workflow.
The experimental Haskell script `etc/scripts/release-linux-aarch64.hs` is
intended to facilitate the building of statically-linked Stack executables for
Linux/AArch64 on macOS/AArch64.