掴めばなかなか使いやすそうな github actions

githubでCIと言えば少し前まではcircle CIだったが、どうやら今はgithub actionsが熱いらしい。使ってみたところ最初こそ雰囲気を掴めず少し苦労したが、ある程度ルールが分かったらかなり使いやすいと感じたので、今後は積極的に使っていこうと思っている。が、まぁその感覚に到るまではそこそこ苦労した部分もあったので、その辺を忘備録として残す。

ワークフローの基本構成と、service, containerあたりを抑えておけば、ひとまずだいたい読める。

ただある程度高度になると、github actionsそのもの以外の要因でハマりそうな予感はある。 特にdocker周りは知識の強化が必要かも。。。  

基本的な内容

公式ドキュメント

日本語でかつ流石の充実具合なので困ったら参照するのが良い docs.github.com

最初にやること

githubのActionsからworkflow ファイルのテンプレート選ぶことができるのでまずはそこから始めると良い。rubyのものやnodeのものなどをよく使うか?

ワークフローとかジョブとかステップとかアクションとか

ワークフローファイルの基本構成は以下。それぞれの名前とファイル内の対応する箇所は抑えておけばだいたい読める。

ワークフローを設定する - GitHub Docs

ワークフローには、少なくとも1つのジョブが必要であり、ジョブには個々のタスクを実行する一連のステップが含まれます。 ステップでは、コマンドを実行するか、アクションを使用することができます。 独自のアクションを作成することも、GitHubコミュニティで共有されているアクションを使用し、必要に応じてカスタマイズすることもできます。

 ## サービスとコンテナ

- Containerの話 container を設定すると、stepsがその環境で実行されるらしい。serviceと組み合わせて使うと、ポート等ネットワーク設定を気にしなくてよくなるので、基本これで良い気がする。

サービスコンテナについて - GitHub Docs

コンテナ内でジョブとサービスを実行すれば、ネットワークアクセスはシンプルになります。 サービスコンテナへは、ワークフロー中で設定したラベルを使ってアクセスできます。 サービスコンテナのホスト名は、自動的にラベル名にマップされます。 たとえばredisというラベルでサービスコンテナを作成したなら、そのサービスコンテナのホスト名はredisになります。

サービスコンテナでポートを設定する必要はありません。 デフォルトで、すべてのコンテナは同じDockerネットワークの一部となってお互いにすべてのポートを公開し合い、Dockerネットワークの外部へはポートは公開されません。

ハマった箇所

作業ディレクトリの変更

トップディレクトリをapi/clientの形にしているので、この処理が必要だった。

GitHub Actions で作業ディレクトリを変更したい https://blog.takuchalle.dev/post/2020/02/20/github_actions_change_directory/

Rails環境で必要な設定

MySQL 8.0

MySQL 8.0での認証方式にgithub actions側が付いてこれてないらしい?以下の設定が必要 docker - How to pass "mysql_native_password" to MySQL service in GitHub Actions? - Stack Overflow

別解。試しはしたがうまくいかなかった。 GithubActionsでMySQL8.0のRSpecを動かす - Qiita

その他

  • キャッシュを利用するとCIのスピードを改善できるらしい、がひとまず保留
  • シークレットとは? GitHubのSecretsを活用して、GitHub Actionsで安全に機密情報を扱う - Qiita

    GitHub repositoryにyamlファイルを書くことで、Commit時やPR反映時等色々な場面で利用できるGitHub Actions。 そんなGitHub Actionsに処理を書いていると、外部サービスと連携するためにアクセストークンのような機密情報を保持したくなります。 この記事では、その機密情報の扱うためのSecretsの使い方について記載します。

  • ヘルスチェックの意味が分からんが、どうやらこれはdocker周りの話 - withはactionのパラメータ
  • ワークフローをスケジュールするときは、ワークフローファイルで POSIX cron 構文を使用できる ワークフローを設定する - GitHub Docs