GitHub Actionsのself-hosted runner

(2020-11-07)

GitHub Actionsのself-hosted runnerは GitHubがホストする環境以外でジョブを実行できる機能。 権限やネットワークなどの都合で特定の環境でしか実行できない処理を行うことができ、GitHubへロングポーリングしてジョブを待ち構えるのでwebhookのように外からアクセスできるようにする必要がない。 実行時間やストレージによる料金は発生しない。

self-hosted runnerは単一リポジトリだけではなくOrganization、Enterprise単位でも追加できるSettings->ActionsからAdd runnerするとOS/アーキテクチャごとのself-hosted runner アプリケーションのインストールコマンドが出てくるので実行する。アップデートは自動で行われ、失敗し続けてバージョンが古くなるとジョブが実行できなくなる

Dockerで動かす。

$ cat Dockerfile 
FROM debian:buster

ARG USERNAME=user
ARG USER_UID=1000
ARG USER_GID=$USER_UID
ARG APP_VERSION=2.273.6

RUN groupadd --gid $USER_GID $USERNAME \
    && useradd --uid $USER_UID --gid $USER_GID -m $USERNAME \
    && apt-get update \
    && apt-get install -y sudo \
    && echo $USERNAME ALL=\(root\) NOPASSWD:ALL > /etc/sudoers.d/$USERNAME \
    && chmod 0440 /etc/sudoers.d/$USERNAME

USER $USERNAME
WORKDIR /home/$USERNAME

RUN sudo apt-get install -y curl && \
    mkdir actions-runner && cd actions-runner && \
    curl -O -L https://github.com/actions/runner/releases/download/v2.273.6/actions-runner-linux-x64-${APP_VERSION}.tar.gz && \
    tar xzf ./actions-runner-linux-x64-${APP_VERSION}.tar.gz 

WORKDIR /home/$USERNAME/actions-runner

RUN sudo ./bin/installdependencies.sh 

CMD ./config.sh --url $REPOSITORY_URL --token $TOKEN && ./run.sh

$ docker build -t runner .
$ docker run -e REPOSITORY_URL=https://github.com/***/**** -e TOKEN=**** runner

接続に成功するとリストに追加されステータスがIdleになる。

Self-hosted runners

runs-onself-hostedを指定するとself-hosted runnerで実行させることができ、アーキテクチャなどの条件に合うものがリポジトリのrunnerから優先して使われる。

name: self-hosted-runner-test

on: push

jobs:
  self-hosted-job:
    runs-on: [self-hosted, linux]
    steps:
    - id: step1
      run: echo "this job runs on self hosted runner"
  hosted-job:
    runs-on: ubuntu-latest
    needs: self-hosted-job
    steps:
    - run: echo "this job runs on github hosted runner"

指定したジョブがself-hosted runnerで実行されていることが確認できる。

2020-11-07 03:11:24Z: Listening for Jobs
2020-11-07 03:15:26Z: Running job: self-hosted-job
2020-11-07 03:15:33Z: Job self-hosted-job completed with result: Succeeded