GitHub Actions をローカル環境で実行したい（Self-hosted runners）

# Intro
2019年の GitHub Universe で GitHub Actions が正式リリースされました :tada:

GitHub Actions について詳しく知りたい方は [紹介ページ](https://github.com/features/actions) や [開発者向けドキュメント](https://help.github.com/ja/actions/automating-your-workflow-with-github-actions) をご覧ください。

ソースコードと CI/CD 機能が同じサービス内で管理できるのは実に収まりがいいです:octocat: 
また Matrix Build といった強力な特徴があるため CircleCI 等の他社製サービスからの乗り換えを検討している方も多いのではないかと思います。

自分も試しに Electron のテスト（e2eを含む）と Mac 用、Windows 用のパッケージングを GitHub Actions で試したところ、（ほとんど）問題なく動作しそれぞれの OS 向けのパッケージを成果物として作成できました。
https://github.com/Kurom96/electron-boilerplate
楽です :smiley: 


ご存知の人もいるかと思いますが、Mac で Windows 用のパッケージを作成しようと思うと環境構築が割と面倒です。
空いてる Windows PC があったらそれ借りてパッケージ作った方が幸せになれます。

# Self-hosted runners

GitHub Universe が開催された 11/13 から遡ること 8日、GitHub ブログに以下の記事が投稿されました。

[![スクリーンショット 2019-11-15 15.56.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86201/e19a263d-8729-d8f7-3ae9-43770b4c5e7c.png)](https://github.blog/changelog/2019-11-05-github-actions-self-hosted-runners/)

英語力が乏しい私でもなんとなく理解できそうな長さの内容です…
**GitHub Actions の実行環境を自分でホストすることができるようになりました！！**
って書いてあるっぽいです :pencil: 

2ヶ月ほど前から GitHub Actions をさわってきましたが、GitHub上のVMだけに「こんなときはどうしようかな」と考えるシチュエーションがいくつかありました。
ローカルで実行できるなら、そのほとんどがこれで解決されてしまいそうな勢いです。

こんなときはどうしようかなリスト
1. 証明書等をリポジトリで管理したくない
2. ビルド環境が特殊で GitHub の VM に構築できない
3. リポジトリがプライベートで月毎の稼働時間をオーバーしてしまいそう


# 注意点:exclamation::exclamation::exclamation:
Public のリポジトリで Self-hosted runners を追加するのはとても危険です。
悪意ある Push で予期せぬ情報の取得や破壊行為が生じかねません。
お気をつけください :fearful: 

# やってみる

https://github.com/Kurom96/electron-boilerplate
この Electron のリポジトリを例に説明します。
Actions のワークフローは構築済みです。

このリポジトリをコピー、または fork して **Private** リポジトリで作業しましょう。
リポジトリの Settings ページを開くと Actions のタブがあります。


以下、Actions permissions と Self-hosted runners の2つの項目があります。

![スクリーンショット 2019-11-15 17.00.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86201/fd38c097-9f2e-0a2e-2278-b15a352a3936.png)

Actions permissions は、その名の通り Actions の実行許諾なので今回は触りません。
一番上のが選択されているままでOKです。

### ランナーを登録する
先程のSelfhosted runnerの項目内にあるAdd Runner ボタンを押下します。
ランナー追加の手順が書かれたダイアログが表示されます。
このとき、黄色い注意のメッセージが表示される場合 Public リポジトリです。

ここでは MacOS の場合の手順を紹介します。
ツールをダウンロードして展開します。

```
$ mkdir actions-runner && cd actions-runner
$ curl -O https://githubassets.azureedge.net/runners/2.160.2/actions-runner-osx-x64-2.160.2.tar.gz
$ tar xzf ./actions-runner-osx-x64-2.160.2.tar.gz
```

以下のコマンドは、先程のボタン押下後のページのダイアログに記載されているものです。
コマンド内の波括弧の部分はダイアログですでに置き換わって表示されているため、
画面からそのままコピペでいけます。
ランナーの名前とワークフォルダ名を問われるので適当に答えましょう。

```
$ ./config.sh --url https://github.com/{user}/{repo} --token {token}
```

準備ができたので実行します。

```
$ ./run.sh

√ Connected to GitHub

2019-11-15 08:27:05Z: Listening for Jobs
```

ランナーが待ち受け状態になりました。
GitHub のページで確認すると…
![スクリーンショット 2019-11-15 17.28.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86201/ca9af920-d873-5f5f-befa-222dd4f0e772.png)

### ランナーをワークフローに登録する

ワークフローファイル（.github/workflows/*.yml）内の runs-on を変更します。

```
runs-on: self-hosted
```

書き方がいくつかあるようで、例えば Windows と Mac の2つがホストされている場合、OSやアーキテクチャを指定することができるようです。
以下のように書けば MacOS のランナーを指定したことになります。

```
runs-on: [self-hosted, macos]
```

というか `runs-on` にはランナー名を指定できるようにしてほしいなぁ…

さ、コミットしてリポジトリにプッシュします。
このリポジトリではプッシュをトリガーにテストとパッケージビルドのジョブが順番に実行されます。

```
2019-11-15 04:50:10Z: Running job: test
2019-11-15 04:50:43Z: Job test completed with result: Succeeded
2019-11-15 04:50:49Z: Running job: build (self-hosted)
2019-11-15 04:52:08Z: Job build (self-hosted) completed with result: Succeeded
```

無事実行できました。
Actionsタブのワークフローに成果物が登録されています。

![スクリーンショット 2019-11-15 17.48.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86201/cb72503f-b382-3966-3e7e-6cce427b4f75.png)

# 所感

正直言うと Self-hosted runners は使わない方がいいです。

これ使っちゃうと結局用意された環境に依存してしまうからです。
Jenkinsおじさんに近しい役割の方がまた誕生します。

ただ、困った時の逃げ道として、これがあることは大きいです。
もし GitHub Actions 使ってて VM の壁にぶつかったらお試しください。

# 参考

* https://github.blog/2019-11-05-self-hosted-runners-for-github-actions-is-now-in-beta/