くりにっき

フルスタックキュアエンジニアです

複数のアプリのバージョンを一箇所で集中管理してCIから一括バージョンアップできるようにした

モチベーション

  • dependabotだとライブラリの自動バージョンアップはできるのだが、RubyやGoなどのランタイムのバージョンまでは対応してないので一箇所で管理できるようにしたかった
  • 実は一箇所で管理すること自体は既に https://github.com/sue445/ci-config-itamae でやってたのだが、手元に動かす方式だと忘れるのでCIで動かすようにしたかった
  • CI化は割とすぐに終わったのだが、パブリックリポジトリの設定とプライベートリポジトリの設定が混在してたのでこのリポジトリもプライベートリポジトリでずっと運用していた。しかしリポジトリの数が多すぎて*1 ActionsのQuotaを使い切りそうになったのでパブリックリポジトリの設定とプライベートのリポジトリの設定を分離して前者を全公開にした

リポジトリ

github.com

動いてる風景

対応形式

どんな感じで設定するのかはGitHub Actionsの設定ファイルを見ればだいたい分かると思います。

仕組み

  1. 対象のリポジトリgit clone
  2. cloneしたリポジトリに対して Itamae を流し、Gemfile.circleci/config.yml などをいい感じに修正
  3. ファイルが修正されて差分が発生すれば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について詳しくは下記エントリを参照。

sue445.hatenablog.com

*1:パブリックとプライベート合わせて30リポジトリくらいで大半がパブリックリポジトリ