GitHub ActionsのSelf-Hosted RunnerをEC2上に構築する

## はじめに
GitHub Actionsのワークフローを使用する際に全社共有のRunnerを利用されてはいないでしょうか？
その際に、大多数の方がRunnerを利用されるため処理が遅くなる現象に遭遇したことが一度はあるかと思います。
今回はそのような事象への解決策として、GitHub ActionsのSelf-Hosted RunnerをAWS EC2に構築できるCFnテンプレートを作成しました。

### 概要
作成したCFnテンプレートですが、以下のような２部構成になっています。
- GitHubActions-selfhosted-runner-NW
    - ネットワーク周辺等リソースを作成する
- GitHubActions-selfhosted-runner-EC2
    - Runnerを置くためのEC2

今回は、GitHubActions-selfhosted-runner-EC2のテンプレートにRunnerを起動するためのスクリプトをどのように組み込んだのかご紹介したいと思います。

:::note warn
ご紹介するCFnテンプレートですが、作成途中のため完全体ではありません。本記事執筆のため、起動したのですが失敗してました、、、苦笑
:::

### Self-Hosted Runnerのメリット
- 共有Runnerの他の利用者の負荷を気にしなくても良い
- Runnerが止まることなく、負荷のかかる処理を行うことが可能
- 特定の環境に最適化したビルドやテストを行うことが可能

## 登場する技術たち
- GitHub Actions
    - GitHubが提供しているCI/CDツール
    - 公式ドキュメント👉https://docs.github.com/en/actions
- CloudFormmation
    - AWSリソースを自動作成するサービス
    - 公式ドキュメント👉https://docs.aws.amazon.com/ja_jp/cloudformation/
- AWS EC2 (AWSを代表するサービスですね)
    - 仮想サーバ
    - 公式ドキュメント👉https://docs.aws.amazon.com/ja_jp/ec2/

## 組み込み手順
- Runnerを起動するスクリプトを取得する
    - Runnerを作成したいリポジトリを選択する
    - Settings > Actions > Runners > New self-hosted runner
(以下の画像を参照)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942105/9403ff9a-f356-69ab-b17d-b1fb5a932106.png)

- 上記の画像のスクリプトのうち"Download"と"Configure"の箇所を用いて、EC2のUserDataにスクリプトを記述する

＊追加の記述もあるが、そちらは後ほど説明

### 実際に組み込んだスクリプト
```template_EC2.yml (一部抜粋)
EC2Instance:
    UserData:
        Fn::Base64: !Sub |
          #!/bin/bash
          set -ex

          # Update and install prerequisites
          sudo apt-get update
          sudo apt-get install -y curl tar

          # assign a user for Ubuntu
          su - ubuntu -c "

          # Create a folder for the runner
          mkdir -p /home/ubuntu/actions-runner
          cd /home/ubuntu/actions-runner

          # Download the latest runner package
          curl -o actions-runner-linux-x64-2.317.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.317.0/actions-runner-linux-x64-2.317.0.tar.gz

          # Extract the installer
          tar xzf ./actions-runner-linux-x64-2.317.0.tar.gz

          # Configure the runner
          ./config.sh --url ${GitHubRepoURL} --token ${GitHubRunnersToken} --labels ${GitHubRunnersLabels} --name ${GitHubRunnersName}

          # Last step, run it
          ./run.sh &

          # Ensure the runner starts on reboot
          crontab -l > mycron || true
          echo '@reboot cd /home/ubuntu/actions-runner && ./run.sh &' >> mycron
          crontab mycron
          rm mycron
          "
          
```
- こちらはRunnerをインストールするための前提条件の更新とユーザの切り替えのための記述です (今回はUbuntuを使用しています)👇
```
　　　　　 # Update and install prerequisites
          sudo apt-get update
          sudo apt-get install -y curl tar

          # assign a user for Ubuntu
          su - ubuntu -c "
```

- こちらはRunnerがシステム起動時に自動で起動するためのものです👇
```
　　　　　 # Ensure the runner starts on reboot
          crontab -l > mycron || true
          echo '@reboot cd /home/ubuntu/actions-runner && ./run.sh &' >> mycron
          crontab mycron
          rm mycron
          "
```

## 実際に起動してみた
実際に作成したテンプレートで起動してみましたが、今回はうまくいきませんでした、、、泣
EC2のシステムログ上には起動しているように見えるのですが、、、👇
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3942105/d0f7b79e-8d7f-0d06-56f9-1fed489839ea.png)


## まとめ
今回は失敗に終わりましたが、テンプレートを改良して開発プロセスの向上に貢献できたらと思います👍
今後はAutoScalngの機能を盛り込むなど更なるバージョンアップに励んでいきたいと思います！