GitHub Actionsとても便利ですよね。
コミットプッシュやPRマージだけではなく、Issueコメントやラベル追加をトリガーにしてワークフローを動かすことができるので、いろいろな定形処理を自動化できます。
あれもこれもといろいろなワークフローを追加したら、利用時間上限になってしまってワークフローのダイエットしないといけなくなった、、、なんてことも。
今回はそんなGitHub Actionsを、(有料だけど)もっとたくさん使えるようにと作った仕組みについての紹介です。
作った動機
主な理由としては1の時間のかかるジョブが増えてきたことですが、2や3の運用コスト、費用面でもメリットがありそうだと思って仕組みづくりをはじめました。
- AWS ECSなどでdocker buildしないといけないことが多くなったので、実行時間が長くなり利用時間上限を気にしたジョブ構成を考えないといけなくなってきた
- Jenkinsなどを動かしているEC2インスタンスのEOL対応や問題発生時の対応、依存ライブラリ追加・更新などの保守・運用がつらい
・ 実行環境がコンテナベースになると、アプリケーションごとに必要な環境を開発者が個別に用意しやすい(してもらえる) - CI実行待ちしないようにEC2インスタンス追加したり夜間停止したり、CIサービスでのメンバー数ベースの課金体系など(純粋に使った時間だけの課金にしたい)
・ 請求がAWSにまとまるほうが申請出しやすいという裏話
Self-hosted Runner(セルフホストランナー)とは?
独自のランナーをホストし、GitHubActionsワークフローでジョブを実行するために使用する環境をカスタマイズできます。
セルフホストランナーは、GitHubホストランナーが提供するよりも、ハードウェア、オペレーティングシステム、およびソフトウェアツールのより多くの制御を提供します。セルフホストランナーを使用すると、より多くの処理能力またはメモリを備えたカスタムハードウェア構成を作成して、より大きなジョブを実行したり、ローカルネットワークで利用可能なソフトウェアをインストールしたり、GitHubホストランナーが提供していないオペレーティングシステムを選択したりできます。セルフホストランナーは、物理、仮想、コンテナ、オンプレミス、またはクラウドのいずれでもかまいません。
GitHub Actionsのワークフローを実際に動かす環境を自分で用意したところにできるということです。しかも、セルフホストランナーは自由な環境に配置できます。
セルフホストランナーをdocker image化すればよさそうです。
GitHubがホストするランナー:
・ GitHubによって管理および保守されています。
・ GitHubプランで無料の分を使用し、無料の分を超えた後に1分あたりの料金を適用します。
セルフホストランナー:
・ 利用者がオペレーティングシステムと他のすべてのソフトウェアを更新する責任があります。
・ GitHub Actionsで自由に使用できますが、ランナーマシンのメンテナンス費用はお客様の負担となります。
セルフホストランナーならGitHub Actionsを自由に使えます。ただし、ランナーマシンが動く環境の利用料金は自己負担です。
docker image化したランナーマシンをAWS CodeBuildで動かせば使った時間だけ課金にできそうですね。
仕組み
rvillage/self_hosted_runnerリポジトリに作ったものは全部公開してあります。
全体の流れ
No | ||
---|---|---|
1. workflowがGitHubホストランナー上で CodeBuildを起動する |
||
2. CodeBuild上でセルフホストランナーが 起動する |
||
3. workflowがセルフホストランナー上で メインジョブを実行する |
||
4. workflow実行終了、 CodeBuildも自動終了する |
できるようになったこと
- docker buildなどの時間がかかる処理をセルフホストランナーで動かすことで利用時間上限を気にしなくてよくなった
- CIサーバの保守・運用がセルフホストランナーのdocker imageを管理するだけになった
- 常時稼働するサーバをなくして純粋に利用する時間分だけ課金する仕組みにできた
- CI待ちを解消するための並列起動数をCodeBuild側の制約だけに絞り込めた
以上ができるようになったことです。
稼働後の運用では手がかかるところは減った印象ですが、最初の初期構築はもう少し簡略化できたらいいなと思っています。
また、課金体系はGitHub Actionsが$0.008/minに対して、同程度のスペックのCodeBuildだと$0.01/minなのでちょっと高くなってしまいました。1段階低スペックの料金は$0.005/minなのでジョブの処理負荷に合わせて使い分けできれば利用料金としてはいい感じになるんじゃないかと思います。
できるかまだ確認していないこと
actions/checkout
といったほぼ毎回使うものは動作確認できていますが、actions/cache
など動作未確認のものがたくさんあります。セルフホストランナーのdocker image自体にライブラリ追加すれば使えるものもあると思いますが、GitHubホストのランナーではないのでどうしても使えないものもあるかもしれません。
ちょっとずつですが、GitHubホストランナーと同じように使えるActionsを増やしていきたいと思います。
本当はECS Fargateを使いたかった話
最初に答えを言ってしまうと、privileged
が設定できないからです。docker in docker環境でdocker buildできるようにするにはprivileged
をONにする必要があるのですが、Fargateでは設定不可のためCodeBuildを選択しました。
ただ、docker buildは必要ないよという場合は、Fargateのほうがおすすめかも知れません。Fargate Spotを使ったときの料金が魅力的すぎなので。
- 1vCPUあたり$0.000343468/min
- 1GBメモリあたり$0.000037567/min
- GitHubホストランナー準拠のスペック(2vCPU,7GBメモリ)だと$0.000949905/min