🐶

Github ActionsのSelf-hosted RunnerをUbuntuにAnsible+Dockerで作成する

2024/08/05に公開

はじめに

GitHub Actionsのself-hosted Runnerを自宅サーバーのVMにインストールしようと、Ansibleで環境を作成したので、その備忘録です。

Self-hosted Runnerは個人用であれば、GitHubのリポジトリのSettingsから追加することができます(freeのOrganizationではリポジトリ横断のRunnerを作成することはできません。Enterprise以上が必要です)。

下記はSettingsから追加しようとした画面ですが、書かれていないことがあり、ハマる可能性が高いです。

※この画面でトークンを取得しますが、PERSONAL ACCESS TOKENから起動する方法もありますので、こちらを使っても良いです。
https://github.com/actions/runner/issues/1264

前準備

サーバーを用意します。
自宅サーバーでもEC2でも何でもOKです。私は自宅のVMにUbuntu22.04を作ってます。

Ansibleのディレクトリ・ファイル構成

VSCodeなどで適当にディレクトリを作成して、下記の構成を作っていきます。

├── hosts
│   └── runner.yml
├── roles
│   └── runner
│       ├── tasks
│       │   └── main.yml
│       └── templates
│           ├── Dockerfile.j2
│           └── compose.yml.j2
└── runner.yml

hosts/runner.yml

デプロイ先を作ります。
ここはよしなに変更してください。

group_name:
  vars:
    runner_version: "2.317.0"
  hosts:
    runner-1:
      ansible_host: "your-vm-hosts"
      ansible_user: "ubuntu"

runner.yml

ここも適当です。この通り書いておくと良いと思います。

---
- hosts: all
  become: true
  roles:
    - runner

roles/runner/templates/Dockerfile.j2

ここはハマったのですが、rootでは./config.shが起動しないのと、.NET Coreが必要なことです。
他の人も指摘していますね。https://qiita.com/misohagi/items/077123e4931decbb5ed3
libicu-devをお忘れなく。
<<>> は自分用に書き換えるか、パラメータ化してください。

FROM ubuntu:22.04

RUN apt-get update && apt-get install -y curl tar sudo libicu-dev && apt-get clean

ARG USERNAME=runner
ARG GROUPNAME=runner
ARG UID=1000
ARG GID=1000
ARG PASSWORD=runner
RUN groupadd -g $GID $GROUPNAME && \
    useradd -m -s /bin/bash -u $UID -g $GID -G sudo $USERNAME && \
    echo $USERNAME:$PASSWORD | chpasswd && \
    echo "$USERNAME   ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers
USER $USERNAME

WORKDIR /actions-runner

RUN curl -o actions-runner-linux-x64-{{runner_version}}.tar.gz -L https://github.com/actions/runner/releases/download/v{{runner_version}}/actions-runner-linux-x64-{{runner_version}}.tar.gz
RUN tar xzf ./actions-runner-linux-x64-{{runner_version}}.tar.gz

RUN ./config.sh --url https://github.com/<< your account >>/<< your repository >> --token << Github shown token >>

roles/runner/templates/compose.yml.j2

compose側で挙動を弄りたかったので、調整。

version: "3"
services:
  runner:
    build: .
    command: ["./run.sh"]

roles/runner/tasks/main.yml

長いです。余分なものもあるかもですが、一応動作する形になります。

- name: Install aptitude
  apt:
    name: aptitude
    state: latest
    update_cache: true

- name: Install required system packages
  apt:
    pkg:
      - apt-transport-https
      - ca-certificates
      - curl
      - software-properties-common
      - python3-pip
      - virtualenv
      - python3-setuptools
    state: latest
    update_cache: true

- name: Add Docker GPG apt Key
  apt_key:
    url: https://download.docker.com/linux/ubuntu/gpg
    state: present

- name: Add Docker Repository
  apt_repository:
    repo: deb https://download.docker.com/linux/ubuntu focal stable
    state: present

- name: Update apt and install docker-ce
  apt:
    name: docker-ce
    state: latest
    update_cache: true

- name: Install Docker Module for Python
  pip:
    name: docker

- name: Start Docker
  service:
    name: docker
    state: started
    enabled: yes

- name: Add ubuntu user to the docker group
  user:
    name: ubuntu
    groups: docker
    append: yes

- name: Logout for reset tty
  meta: reset_connection

- name: Install Docker Compose
  ansible.builtin.apt:
    name: docker-compose-plugin
    state: present

- name: Copy Dockerfile
  template:
    src: Dockerfile.j2
    dest: /home/ubuntu/Dockerfile
  tags: compose

- name: Copy compose.yml
  template:
    src: compose.yml.j2
    dest: /home/ubuntu/compose.yml
  tags: compose

- name: Stop and Delete Docker Containers and images and volumes(ignore errors)
  shell: docker compose down --rmi all --volumes
  ignore_errors: yes
  tags: compose

- name: Start Docker Containers
  shell: docker compose up -d
  tags: compose

Ansibleの実行

SSH通ることを確認し、下記を実行すれば環境ができるはず。

ansible-playbook -i hosts/runner.yml runner.yml

Discussion