モチベーション
- dependabotだとライブラリの自動バージョンアップはできるのだが、RubyやGoなどのランタイムのバージョンまでは対応してないので一箇所で管理できるようにしたかった
- 実は一箇所で管理すること自体は既に https://github.com/sue445/ci-config-itamae でやってたのだが、手元に動かす方式だと忘れるのでCIで動かすようにしたかった
- CI化は割とすぐに終わったのだが、パブリックリポジトリの設定とプライベートリポジトリの設定が混在してたのでこのリポジトリもプライベートリポジトリでずっと運用していた。しかしリポジトリの数が多すぎて*1 ActionsのQuotaを使い切りそうになったのでパブリックリポジトリの設定とプライベートのリポジトリの設定を分離して前者を全公開にした
リポジトリ
動いてる風景
対応形式
- Go: https://github.com/sue445/myapp_version_upgrader/blob/main/.github/workflows/upgrade_go.yml
- Ruby: https://github.com/sue445/myapp_version_upgrader/blob/main/.github/workflows/upgrade_ruby.yml
- Terraform: https://github.com/sue445/myapp_version_upgrader/blob/main/.github/workflows/upgrade_terraform.yml
どんな感じで設定するのかはGitHub Actionsの設定ファイルを見ればだいたい分かると思います。
仕組み
- 対象のリポジトリを
git clone
- cloneしたリポジトリに対して Itamae を流し、
Gemfile
や.circleci/config.yml
などをいい感じに修正 - ファイルが修正されて差分が発生すればPullRequestを投げる
といった一連の流れを全てGitHub Actions上で行っています
各リポジトリに適用してるItamaeのレシピファイル
https://github.com/sue445/myapp_version_upgrader/tree/main/cookbooks
完全に自分のアプリの構成に依存してるので他の人が流用したい場合には色々手を入れる必要があると思います。
こだわりポイント
CI用にGitHub Appを作った
GitHub Actionsのデフォルトのトークン( secrets.GITHUB_TOKEN
)は自分自身のリポジトリの権限しか持っておらず、かといってパーソナルアクセストークンだと利用するリポジトリの範囲を絞れなくて嫌だったので専用のGitHub Appを作りました。
GitHub Appについて詳しくは下記エントリを参照。