GitHub Actionsでself-hosted runnersを試す

こんにちは。LIFULL株式会社の花岡です。
11/05から、GitHub Actionsでself-hosted runnersが使えるようになりました。この機能を使用すると、GithHub Actionsの実行環境を自分で指定することができます。
今回プライベートで軽く触ってみたので、今回はその利用方法をご紹介したいと思います。

## self-hosted runnersについて
GitHub Actionsでは、基本的にはGitHub側で用意している仮想環境でworkflowを実行するのですが、self-hosted runnersを使用すると実行環境を自分で指定することができます。例えばオンプレ環境でworkflowを実行したいとか、閉鎖環境内で無いと実行できないテストがある等、自前で用意した特殊な実行環境でテストしたい時に便利です。

(但し、publicリポジトリでは決して使用しないでください。悪意のあるコードがpushされて、実行環境で実行されてしまう可能性があります。)

その他詳しい情報については、[About self-hosted runners](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/about-self-hosted-runners)や[Adding self-hosted runners](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/adding-self-hosted-runners)を参照下さい。

## 実行手順

今回はAWS上のEC2を実行環境にしてビルドを実行してみたので、その時の実行手順をご紹介します。

### 構成

ものすごく単純ですが、今回試した構成は以下の様な感じです。(プライベート用の環境で試しました)

![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316438/a9a92b5d-b83e-3542-6aaf-2ffdaca92431.png)

NACLは以下の様に設定しました。
Inbound側はリターントラフィック用のポートを許可しておけば、workflowを実行することが可能です。

- Inbound 

|プロトコル|port|IP|ALLOW/DENY|
|---|---|---|---|
|TCP|327658-65535|0.0.0.0/0|ALLOW|
|すべて|すべて|すべて|DENY|

Outboundは、http,httpsに加えてgit用にsshを許可しています。
- Outbound

|プロトコル|port|IP|ALLOW/DENY|
|---|---|---|---|
|SSH|22|0.0.0.0/0|ALLOW|
|HTTP|80|0.0.0.0/0|ALLOW|
|HTTPS|443|0.0.0.0/0|ALLOW|
|すべて|すべて|すべて|DENY|

### 手順

self-hosted runnersの追加はGitHubリポジトリの方で実施します。
設定にはAdminが必要なので注意してください。

- リポジトリの『Settings』⇨『Actions』から、『Add runner』をクリックします
![add_runner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316438/2b4d9775-3eb4-944e-438d-59995d1e0f41.png)

- OSを選択します。Windows, Mac, Linuxから選べます。今回は『Linux』を選択します。
- Self-hosted runnersにrunnerが追加されていることを確認します。
![runner.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316438/7457e65e-1405-ab29-9a70-a681a5657d01.png)

- 実行環境で以下のコマンドを入力します。(成功すると`Connected to GitHub`と表示されます。)

```
$ mkdir actions-runner && cd actions-runner
$ curl -O https://githubassets.azureedge.net/runners/2.161.0/actions-runner-linux-x64-2.161.0.tar.gz
$ tar xzf ./actions-runner-linux-x64-2.161.0.tar.gz
$ ./config.sh --url https://github.com/xxx/xxx --token XXXXX
$ ./run.sh

√ Connected to GitHub
2019-12-03 22:14:23Z: Listening for Jobs
```

- GitHub側で接続できていることを確認する。接続すると、表示が「Idle」に変わる。
![idle.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316438/744d5b40-6b36-683b-cc9f-84329193631e.png)

- Workflowを書きます。runs-onに`self-hosted`を追加します。

```
name: Go
on: [push]
jobs:

  build:
    name: Build
    # self-hosted を追加する
    runs-on: [self-hosted, linux]
    steps:

    - name: Set up Go 1.13
      uses: actions/setup-go@v1
      with:
        go-version: 1.13
      id: go

    - name: Check out code into the Go module directory
      uses: actions/checkout@v1

    - name: Get dependencies
      run: |
        go get -v -t -d ./...
        if [ -f Gopkg.toml ]; then
            curl https://raw.githubusercontent.com/golang/dep/master/install.sh | sh
            dep ensure
        fi

    - name: Build
      run: go build -v .
```

- git push して、実行環境でJobが成功していることを確認します。

```
2019-12-03 22:14:49Z: Running job: Build
2019-12-03 22:15:03Z: Job Build completed with result: Succeeded
```

## 終わりに
このように、self-hosted runnersを使うと自前の実行環境を簡単に用意することができます。
自分で実行環境を用意したいという方は利用してみてはいかがでしょうか。