ARM-Powered GitHub Action Runners using the Raspberry Pi 5

December 11, 2024
3 minutes

While working on a side project recently, I reached the free tier limit for GitHub Action minutes. For this project, I created multiple Docker images for the ARM architecture to be deployed as AWS Lambda functions. This prompted me to explore self-hosted runners.

Conveniently, I had a Raspberry Pi 5 lying around - a model with 8GB of RAM and an ARM processor. The ARM architecture was a perfect fit for this experiment since it eliminated the need to cross-compile Docker images to another architecture.

The Setup

I used Ansible to automate the setup process and deployed one GitHub runner for each CPU core (four in total for the Raspberry Pi 5), utilizing the myoung34/github-runner Docker image. Below is the Ansible playbook I used to configure the runners.

- name: Create runner work directories
  file:
    path: '/docker/github-runner/runner-{{ item }}'
    state: directory
    mode: '0755'
  with_items: '{{ range(1, github_runner_count + 1) | list }}'

- name: Start GitHub runner containers
  docker_container:
    name: 'github-runner-{{ item }}'
    image: myoung34/github-runner:ubuntu-noble
    restart_policy: unless-stopped
    volumes:
      - '/var/run/docker.sock:/var/run/docker.sock'
      - '/docker/github-runner/runner-{{ item }}:/tmp/runner/work'
    env:
      REPO_URL: 'https://github.com/your-repository'
      RUNNER_TOKEN: '{{ github_access_token }}'
      RUNNER_NAME: 'runner-{{ item }}'
      RUNNER_WORKDIR: '/tmp/runner/work'
  with_items: '{{ range(1, github_runner_count + 1) | list }}'

If you prefer using Docker Compose or systemd, you can find several usage examples at https://github.com/myoung34/docker-github-actions-runner/wiki/Usage.

Ensure you use the correct RUNNER_TOKEN for your organization or repository. For more information on setting up self-hosted runners, refer to https://docs.github.com/actions/hosting-your-own-runners/about-self-hosted-runners.

The build environment

Compared to the hosted GitHub runners, the myoung34/github-runner image is missing some common development tools, such as the AWS CLI. However, using Docker, you can easily extend the image to include additional tools:

FROM myoung34/github-runner:2.321.0-ubuntu-noble

RUN apt-get update && apt-get install -y \
    nodejs npm unzip curl && \
    curl "https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip" -o "awscliv2.zip" && \
    unzip awscliv2.zip && \
    ./aws/install --update && \
    rm -rf awscliv2.zip aws

Results

Running self-hosted runners on the Raspberry Pi 5 has been successful. Although I didn't conduct extensive benchmarks, I observed slightly faster builds, particularly for ARM-based Docker images.

Have you attempted to set up a self-hosted GitHub Action runner on a Raspberry Pi? I'd love to hear how it went!

Comments

Join the conversation by mentioning this post on Bluesky.

Loading comments...