GitHubActionsのself-hosted機能を使ってAWS EC2でCI/CDしてみる

# はじめに
CI/CDしてますか？
GitHubActionsにはself-hosted機能があり、これを使うと任意のサーバーでGitHubActionsを動作させることが出来ます。
普通に使う分にはこんなことをする必要は無いんですが、開発が活発になってくるとGitHubActionsの無料利用枠の上限を超えてしまう可能性があります。
調べた感じ、無料利用枠を超えた場合の対処策は大きく2つあります。

- 自前でサーバーを用意して、そこでGutHubActionsを動作させる
- おとなしく超過分の料金をGitHubに支払う

そこで今回は前者の対応をしてみたので、その備忘録になります。具体的にはGitHubActionsのself-hosted機能を使ってAWS EC2でCI/CDしてみたいと思います。
自前で用意するサーバーはオンプレミスである必要はなく、クラウド環境でも良いのでEC2を選択しました。

# EC2の起動
まずは自前サーバーとしてEC2を用意します。
なお、画面のキャプチャでは個人情報やよくわからない乱数が表記された部分等を一部マスクしています。

まずはEC2のコンソール画面に遷移します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/d7cd0d90-0d09-5353-32aa-b07a28ab2170.png)

「インスタンスの起動」ボタンを押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/76dd5fa2-d6ff-3f58-f8aa-2976a362657a.png)

起動するインスタンスの設定をしていきます。
今回は以下の内容で起動します。この辺りはお好みに合わせて適宜変更してください。

- self-hosted-testというタグをつける
- AMIはAmazon Linux 2 を使用する
- インスタンスタイプは一番安いt2.microを使用する
- 任意のキーペアを選択する
- ネットワークはデフォルトのものを使用する
- セキュリティグループは今回用に新規作成する
- ストレージは8GB
- 高度な詳細は触らない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/aac826e4-10e9-aea0-3ee7-24b88ff3c21f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/4bd7ec3b-2e66-b73d-a373-5b26629811e4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/5a5abfc4-620a-4b7e-2a59-24bb8ac10500.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/9cd8ad6c-335e-ab2a-7aa2-8609e8cb7df3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/073104f3-4f96-3a72-0b4c-f0d8b726cb12.png)

以上の設定でサーバーを起動しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/5181154f-c2e8-6d47-b218-423008220030.png)

新規作成されたセキュリティグループはこのようになっています。
インバウンドはSSHフルオープン、アウトバウンドはフルオープンです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/997c66d0-d4f5-0949-d28d-292d2bc96da2.png)

# New self-hosted runner
それでは起動したEC2でGitHubActionsを動作できるようにしていきましょう。
リポジトリのSetting→Runnersをクリックして、「New self-hosted runner」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/63ed60a9-a553-e9d7-31cd-5f5fe47cc7a3.png)

Linuxを選択すると、サーバー側で行うべきコマンドが出てきますので、これをコピペしてEC2で順に実行していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/ce7728cf-d468-b370-78bc-dc51b262eb2e.png)

なお、``./config.sh ～～``のコマンドを打つといくつか質問を聞かれますが、何も入力せずEnterでOKです。
```bash
$
$ mkdir actions-runner && cd actions-runner
$ curl -o actions-runner-linux-x64-2.299.1.tar.gz -L https://github.com/actions/runner/releases/download/v2.299.1/actions-runner-linux-x64-2.299.1.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100  135M  100  135M    0     0  69.1M      0  0:00:01  0:00:01 --:--:-- 94.1M
$ tar xzf ./actions-runner-linux-x64-2.299.1.tar.gz
$ ./config.sh --url https://github.com/xxxxxx/yyyyyyyyyyyyyyy --token XXXXXXXXXXXXXXXXXXX

--------------------------------------------------------------------------------
|        ____ _ _   _   _       _          _        _   _                      |
|       / ___(_) |_| | | |_   _| |__      / \   ___| |_(_) ___  _ __  ___      |
|      | |  _| | __| |_| | | | | '_ \    / _ \ / __| __| |/ _ \| '_ \/ __|     |
|      | |_| | | |_|  _  | |_| | |_) |  / ___ \ (__| |_| | (_) | | | \__ \     |
|       \____|_|\__|_| |_|\__,_|_.__/  /_/   \_\___|\__|_|\___/|_| |_|___/     |
|                                                                              |
|                       Self-hosted runner registration                        |
|                                                                              |
--------------------------------------------------------------------------------

# Authentication


√ Connected to GitHub

# Runner Registration

Enter the name of the runner group to add this runner to: [press Enter for Default]

Enter the name of runner: [press Enter for ip-xxx-xxx-xxx-xxx]

This runner will have the following labels: 'self-hosted', 'Linux', 'X64'
Enter any additional labels (ex. label-1,label-2): [press Enter to skip]

√ Runner successfully added
√ Runner connection is good

# Runner settings

Enter name of work folder: [press Enter for _work]

√ Settings Saved.

$
```

この後、手順通り``./run.sh``と実行していきたいところですが、``./run.sh``だとRunnerがフォアグランドで起動してしまいます。ということはSSHターミナルを閉じると止まってしまいます。
この機能はバックグラウンドで常時起動しておいてほしいサービスですので、サービスとして起動することにします。
サービスとして起動するには、公式にマニュアルがありますので、それに則って行っていきます。

https://docs.github.com/ja/actions/hosting-your-own-runners/configuring-the-self-hosted-runner-application-as-a-service

```bash
$ sudo ./svc.sh install
Creating launch runner in /etc/systemd/system/actions.runner.xxxxxxxxxxxxxxxxxxxxx.ip-xxx-xxx-xxx-xxx.service
Run as user: ec2-user
Run as uid: 1000
gid: 1000
Created symlink from /etc/systemd/system/multi-user.target.wants/actions.runner.xxxxxxxxxxxxxxxxxxxxx.ip-xxx-xxx-xxx-xxx.service.service to /etc/systemd/system/actions.runner.xxxxxxxxxxxxxxxxxxxxx.ip-xxx-xxx-xxx-xxx.service.
$
$ sudo ./svc.sh start
/etc/systemd/system/actions.runner.xxxxxxxxxxxxxxxxxxxxx.ip-xxx-xxx-xxx-xxx.service.service
● actions.runner.xxxxxxxxxxxxxxxxxxxxx.ip-xxx-xxx-xxx-xxx.service.service - GitHub Actions Runner (xxxxxxxxxxxxxxxxxxxxx.ip-xxx-xxx-xxx-xxx.service)
   Loaded: loaded (/etc/systemd/system/actions.runner.xxxxxxxxxxxxxxxxxxxxx.ip-xxx-xxx-xxx-xxx.service.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2022-11-29 00:54:09 UTC; 7ms ago
 Main PID: 3506 (runsvc.sh)
   CGroup: /system.slice/actions.runner.xxxxxxxxxxxxxxxxxxxxx.ip-xxx-xxx-xxx-xxx.service.service
           ├─3506 /bin/bash /home/ec2-user/actions-runner/runsvc.sh
           └─3508 /bin/bash /home/ec2-user/actions-runner/runsvc.sh

Nov 29 00:54:09 ip-xxx-xxx-xxx-xxx.ap-northeast-1.compute.internal systemd[1]: Started GitHub Actions Runner (xxxxxxxxxxxxxxxxxxxxx.ip-xxx-xxx-xxx-xxx.service).
$
```
無事に起動しました。

GitHubの画面に行って、このような画面になれば疎通の確認も取れています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/3435ba63-e58b-57a8-6efe-f413a16eae94.png)

# 動作確認
それでは実際に動くか動作確認して行きましょう。
変更するのは、workflowの``runs-on``をself-hostedに変更するだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/24086b32-d466-9926-3339-39766c1cdac8.png)

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/273110/772a1f87-b8d4-f60c-c3a0-b7dd69af96bd.png)

無事、self-hostedでGitHubActionsが動きました！

現場からは以上です。