マネーフォワードで『わり算グループ』と『Plus Ops グループ』に所属しつつ、 バックエンドのエンジニアをしています古濱といいます、こんにちは。
お酒と Rust が好きです。最近良かったワインは PACINA の La Cerretina です。
今日はマネーフォワード社内でのライブラリ/ランタイムのバージョン管理に関する話を紹介しようと思います。
遡って 2 年ほど前
2018 年頃、マネーフォワードでは既にいくつもの主に Rails で書かれたアプリケーションが動いておりそれらのバージョンのハンドリングが課題になっていました。 具体的には以下の問題があったように記憶しています。
- アプリケーションで使っている Rails を始めとする主要ライブラリのバージョンがそもそも古く、新しいバージョンのリリースについていけていないものがある
- 利用している gem や Ruby のランタイムなどで脆弱性の報告とそれに合わせた新しいバージョンのリリースがあったときに、影響のある全てのアプリケーションでのバージョンアップの担保が難しい
当時の僕はバージョンの古いままになっている Rails アプリケーションのバージョンアップ作業を手伝ったり脆弱性の報告やその対応への興味から社内での対応の音頭を取る作業のお手伝いをしたりしていました。
プログラムを書くのがあまり得意ではなかった僕は(今も下手すぎて得意とはとても言い難いですが...) Google Spreadsheet で各アプリケーションごとのバージョンを管理し開発者に自プロダクトのバージョンをアップデートの度に記載してもらうような運用を選択していました。
当然のことながらみんなこういうのは忘れていくものなので自分で各アプリケーションの Gemfile.lock や .ruby-version をたまに眺めて up-to-date な状態を保つことをしており、結果として腕力による運用になっていました。
そんな中あるエンジニアの先輩が「こんなの依頼されてもめんどくさくてやってられるかよ」的な発言をご自身の times でされているのを眺めてカッとなってすぐさまローカル環境で流せるスクリプトを書きました。 晴れて各アプリケーションの開発者は面倒な運用から解放されました。 そしてしばらくはこのスクリプトを僕のローカル環境で実行する形で運用していました。
(当時の怒りの片鱗が少しだけ覗けるタイトル)
戻ってきて先月くらい
そんな具合でしばらくは何かバージョンを確認する必要がある度に僕のローカル環境でスクリプトを実行しては結果をみんなの見れる場所 (Slack, esa ...) に貼り付けるということをしていましたが、最近何度か立て続けに利用する機会がありました。
いい加減個人に依存した運用をやめたいじゃんと思った僕はその当時(というほど昔の話でもないですが)よく使っていた GitHub Actions への移行を考えました。 調べてみると GitHub Actions には workflow_dispatch という仕組みがちょうど追加されていたようで正にこれを活用できそうだったので遊びがてら移植してみました。
簡単な仕組みなので gist の形式でここに全部乗せておきます。
GitHub の blog にも画面の紹介はありますが Actions のタブから対象の workflow を選択して Run workflow
を押したらそれで実行されるようです。
導入も難しくなく調べるところから 2 時間ほどで完成したので楽しい移植でした。 かなりナイーブな実装になっていますが用途を考えるとこれで十分でしょう。 将来的には他の言語の lockfile に相当するファイルなどをパースしたくなるかもしれませんが必要に迫られたら実装しようと思っています。
バージョンの管理に関する僕の考え
開発組織においてマイクロサービス化が進むと各アプリケーションの開発チームが自分たちの持つアプリケーションに関して責任を持つようになり、基本的には開発チームが多くを決めて開発・運用を進めていくことになるのがマイクロサービス化した利点を最大限活用できる状態なのではと想像をしています。
しかし同時に個人の考えとしてマイクロサービス化した世界において どのアプリケーションでも最低限会社全体として担保したいこと
がゼロになるとは思っていないです。
僕たちが会社としてユーザーに対していくつものサービスを提供しておりそれらを安全にご利用いただくことを担保したい以上、アプリケーションごとにチームの独立性が高まった世界においてもライブラリやランタイムの(特に下限の)バージョン管理は依然重要な項目として組織横断的な役割を持った部署でも行う必要があるのではないでしょうか。
(真に polyglot な環境になってくるとまた考え方を変える必要がありそうですが)
まとめ
と大げさなことを書きましたが、各アプリケーションのライブラリやランタイムのバージョンを簡単に一覧で参照することのできるこの仕組みは、ここまで述べてきた全社的なバージョンの管理は勿論のこと、例えば自分たちのアプリケーションと同じ gem 等を使っている社内のアプリケーションを探してみるといったユースケースでも便利に感じています。
もしほかの開発組織に属するみなさんに対しても参考になる部分がありましたら嬉しいです。(なおもっとイケてる仕組みがあったらすぐさま乗り換えを検討するので教えて下さい)
ちなみに今回紹介したスクリプトはマネーフォワードでの組織横断的な取り組みの一環として以前の発表でも簡単に触れました。この資料では他にもうちの会社でやっている取り組みを紹介しているので良ければこちらも御覧ください。
ここまで読んでいただきありがとうございました、そろそろさようなら 2020 年。
マネーフォワードでは開発組織横断的な課題を技術や腕力で解決することに興味のあるエンジニアを募集しています。 ご応募お待ちしています。
【サイトのご案内】 ■マネーフォワード採用サイト ■Wantedly ■京都開発拠点
【プロダクトのご紹介】 ■お金の見える化サービス 『マネーフォワード ME』 iPhone,iPad Android
■ビジネス向けバックオフィス向け業務効率化ソリューション 『マネーフォワード クラウド』
■だれでも貯まって増える お金の体質改善サービス 『マネーフォワード おかねせんせい』