Rubyのバージョンを上げた
どうもぎんさんです。
最近はコロナの影響でいろいろあって辛い思いをしています。
リアルな勉強会にいけないのはモチベーション管理的に困る
それ以外にも仕事もいろいろ変わり、6月から週2で1プロジェクトの面倒みつつOJTとして新人教育みたいなこともやってます。
そのプロジェクトは開発から2年ほど経っててある程度落ち着いてますが、課題としては多々あります。
まず一つにテストが書かれていないということ
カバレッジにしてみると20%くらい。開発時に忙しかったのかな?と思う。
次に各種Ruby,Railsなどの各種Gemsのバージョンが追従し切れてない点。
アサイン時で2.4.6でした。
とりあえずメインの目的は新人教育で、それはspecを書いてもらって、カバレッジの向上で何とかしようかなと思いつつ、私の方で各バージョンあげて行こうかなとなりまして、いろいろと相談しつつ、とりあえずまずrubyのバージョンあげて行こうかなということでやってきました。
一応環境的には
Ruby 2.4.6
Rails 5.1.4
CI/CD circle ci
deploy先 heroku
でgithubでコード管理しつつ、dockerでどかっと(激うまギャグ)デプロイみたいなよくあるCI/CD環境
やったこと
とりあえずリリースノートとか漁りつつ、変更点とコードを舐めて、まぁいけるやろーって感じだったんで、
dockerfile,gemfile,おまけで.ruby-versionを更新して docker-compose build
カバレッジが低いので不安だが、いったんローカルはこれでうまくいった。
んで次にcircle ci の更新。
ci側も同様にimageの更新
- image: circleci/ruby:2.4.6-node
+ image: circleci/ruby:2.6.6-node
ただこれで一度つまづいて、rubyのバージョンをあげるとnodeのバージョンも一緒に上がる。
nodeのバージョンが上がるとwebpackのバージョン管理が代わり、webpackerの方も代わり、連鎖的に落ちていった。
一応これの解決法としてdockerのmulti stage buildを使って個別に管理するというやり方もあるが、私はそれを知らなかった 脳筋なので気合でいろいろアップデートかけて頑張った。
dockerfileやpackage.jsonでnodeのバージョンを更新、とりあえず欲しがってるバージョンを指定して対応した。
後ほど、ci側のimageがしれっとnodeのバージョン上げてきてエラー吐かれたので、マイナーバージョンまで指定すると痛い目をみる。
で、いざpushしてみると`.circleci/config.yml`の方でcacheを使ってたので、それが古くて落ちる。
https://circleci.com/docs/ja/2.0/caching/
ここだとv1でやってるが、これをv2,v3を上げていくことで、ひとまず対応、その間新人くんが上げてくれたPRが尽く落ちた。だらしない先輩ですまない
ここまでやってようやっとciが通った。
で、一通り確認してからマージ(私は管理者だ)
するとheroku側で deploy failed何でかと思いみてたらbuild packにnodeが入ってない。
https://jp.heroku.com/elements/buildpacks
古いやつだとなくても動くのかな?とりま追加して対応。これで全てうまくいった。
この間4日(二週間)新人くんの面倒みつつ、rubocopの調教もしつつ(レビュー軽減対応)だったのでなかなか時間がかかった。
ここまでで得た教訓としては
ciミスるとみんなに迷惑かけて人数多ければそれだけプレッシャーかかる。
エラーログ読みにくい。ローカルでうまくいくのに〜って感じで再現しにくい。
その間いろいろ迷惑かけるが、まずは落ち着け。デプロイに失敗しても落ち着け。
有識者がいたらきけ、それが一番早い
ということ。
以上
所要時間1時間くらい