🐶
Github ActionsのSelf-hosted RunnerをUbuntuにAnsible+Dockerで作成する
はじめに
GitHub Actionsのself-hosted Runnerを自宅サーバーのVMにインストールしようと、Ansibleで環境を作成したので、その備忘録です。
Self-hosted Runnerは個人用であれば、GitHubのリポジトリのSettingsから追加することができます(freeのOrganizationではリポジトリ横断のRunnerを作成することはできません。Enterprise以上が必要です)。
下記はSettingsから追加しようとした画面ですが、書かれていないことがあり、ハマる可能性が高いです。
※この画面でトークンを取得しますが、PERSONAL ACCESS TOKENから起動する方法もありますので、こちらを使っても良いです。
前準備
サーバーを用意します。
自宅サーバーでも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