みんなのマーケットの バックエンド/SRE を担当している、マノメです。
今回は、GitHub Actions で起こった障害に巻き込まれて失敗に気づいた、という例をご紹介したいと思います。
なお本記事は、6/10 に開催した 「失敗に学べ!くらしのマーケットの開発「失敗」LT 会 vol.1」 での LT 内容を再構成したものです。
GitHub Actions の活用
この記事を読んでいる方は既にご存知かもしれないですが、GitHub Actions は、以下のような特徴がある超便利な CI/CD ツールです。
- GitHub 謹製の CI / CD ツール
- 基本無料 (月ごとの時間制限あり、それ以降は課金)
- 実行環境は Linux / Win / Mac を選べる
- 様々な言語が動かせる (Docker イメージもいける)
- OS や言語のバージョンをマルチビルドできる
- シークレットキーの設定も簡単
- docker-compose が使える (最近知った)
- yaml でタスクを書くだけで作れる
ほかにも特色はいろいろありますが…。
弊社では、この GitHub Actions をプロダクトの一部でほんのり活用しています。
テストなどがコケている場合、master ブランチにマージできないようになっており、コードの品質をある程度保てるようにしています。
突然、Actions が終わらなくなる
ある日、突然 GitHub Actions のタスクが終了しなくなりました。
これによって、困ることがあります。
- 追加でお金がかかるようになるかもしれない!
- Actions は、一定の時間以上は課金制になってしまう
- Pull Requests がマージできない
結局調べた結果、Nodejs のダウンロードが起因する障害でした。
(この時起きていたことの詳細はこちら: actions/setup-node/issues/132)
要するに、Nodejs の ダウンロードができなくなり(503)、Actions の「Use Node.js 12.x」が止まっていました。 これによって、タスクがリトライを繰り返し、なかなかエラー終了しない状態になっていました。
timeout を設定しよう
もしも Actions に何かあった時のために、タイムアウトする設定を入れると安心できます。
Actions 全体でかかった時間が計測されているので、その時間にリミットをかけられる機能です。
Actions はタスクを yaml で表現します。
この中で、build のオプションとして timeout-minutes
を設定するだけでタイムアウト値を設定できます。
しかし、私はここでさらに失敗しました。
タスクにかかる時間が 1 分弱であるのに対してタイムアウト値を 1 分に設定していましたが、
コードの量や Actions 内のネットワーク環境の影響などでタスクの時間が 1 分を超えることがある、というのを考慮できていませんでした。
そのため、全然 Actions が Success にならなくなっていました。
Actions のタスクの実行時間は、状況に応じて変わります。
実行時間は適切なバッファをもたせつつ、適切な時間を設定するようにしましょう。
まとめ
今回は Github Actions をクリティカルなものに使っていなかったため、影響がほぼなかったのが幸いでした。
こういう細かい設定をちゃんと設定して、もしものときに備えておきましょう。
そして、どんどん GitHub Actions を活用していきましょう!