毎日gemをアップグレードする生活
2018/11/08(木) 表参道.rb #40
表参道.rb #40 🎉
自己紹介
● Twitter: 神速(@sinsoku_listy)
● GitHub: sinsoku (@sinsoku)
● 会社: 六本木の某社
● 副業: 株式会社grooves
@sinsoku_listy
@sinsoku
Railsのアップグレードの手順
1. テストをちゃんと書いておく
2. まずは他gemをアップグレードする
3. 本命の “rails” gemをアップグレードする
4. 動作確認する
5. 「たぶん動くと思うから、リリースしようぜ」
Railsのアップグレードの手順
1. テストをちゃんと書いておく
2. まずは他gemをアップグレードする ← これ
3. 本命の “rails” gemをアップグレードする
4. 動作確認する
5. 「たぶん動くと思うから、リリースしようぜ」
残念ながら...
● 泥臭いアップグレードの知見
● 即効性のあるアップグレードの知見
● 4.2 => 5.0 は昔ブログに書いたので参考に
○ 最速で Forkwell を Rails 5 にアップグレードしてみました
○ https://tech.grooves.com/entry/2016/07/01/184458
4.2 => 5.0 はv5.0.0のリリース日に終わってるので...
bundle updateのやりかた
● bundle updateでgemをアップグレードする
● だいたいテストが落ちる
● 理由を突き止める
○ gemの変更範囲を調べる
○ コードのdiffを読む
○ テストが通るように修正する
● 動作確認する
● テストで見つからなかった問題を調べる
○ gemの変更範囲をまた調べる
○ コードのdiffを(ry
月1だと更新されるgemは30個くらい?
すごく大変😥
戦略的なアップグレードが必要🔨
メドピアさん
1. 毎月1日に自動的にbundle updateプルリクを作る
2. bundle updateの担当者を3名割り当てる
3. 全員で集まって1〜2時間で差分を全てチェック
4. 修正が必要なら修正
5. テスト環境で1週間漬ける
6. リリース
https://tech.medpeer.co.jp/entry/2018/09/26/090000 の「メドピアにおけるライブラリアップデート 」から引
用。
masutaka/circleci-bundle-update-pr でプルリク作成を自動化
MoneyForwardさん
1. bundle updateはシェルスクリプトで実装
2. kyanny/compare_linkerでgemの比較URLを生成
3. packsaddle/ruby-saddlerでプルリクを作成
https://moneyforward.com/engineers_blog/2017/08/31/bye-tachikoma-gem/ に詳細が書かれています。
bundle update部分を色々と弄りやすくするため、あえてシェルスクリプトを使ってい
るっぽい?
アップグレード頻度や作業時間に関する記載は無かったので詳細は不明。
grooves
1. 毎日自動的にbundle updateプルリクを作る
2. 定時になって、まずレビューする
○ 定時にプルリクが作られているようにcronを設定してる
3. 他プルリクと同じようにレビューする
○ テストが通っているか?
○ CHANGELOGに変なのが無いか?
○ 関連する機能が壊れていないか?
4. マージすると自動デプロイされる
sinsoku/bundler-diffを使って比較URLとプルリク作成を自動化
bundler-diffを使ったプルリクのイメージ
毎日のアップグレードをする利点
● 差分を調べる範囲が小さく、短時間で終わる
● 落ちたテストの原因究明が楽
● 危険なgemが分かるようになる
○ 頻繁に変わるaws-sdkとかはあまり注意しなくても良い
○ テスト通っていればdevelopment, testは基本的にOK
○ OAuth系は危険(minorでログイン不可になったのは忘れない)
● gemの機能、実装を覚える
○ gemの用途を少しずつ把握できる
○ 知らなかったオプションを発見できる
○ 実装を知っているとgemにパッチを当てやすくなる
モチベーション的な話
● gemもプロダクトの一部
● 世界中の人がgem(プロダクト)を直してくれる
○ しかも無償で💰
● gemの改善も早くレビュー&マージして顧客に届けたい
● 微妙な変更はバージョン固定すればいい
● 最新verを使うとパッチ送るチャンスが増える
○ 転職するときのアピールになるかも?
○ ぜひForkwellで
sinsoku/bundler-diffは簡単に試せるので是非
$ gem install bundler-diff
$ cd <proj_dir>
$ bundle update
$ bundle diff
完全に忘れていた...
● ActiveRecord.pick
● ActiveRecord.create_or_finad_by
● pgのchange_table(bulk: true) でcommentに対応
は便利なので、興味ある人は検索してみると良いかも。
ご清聴ありがとうございました。

毎日gemをアップグレードする生活