ぎんさんマインド

いちエンジニアの思考とか趣味についてつらつらと書いてみるかもしれない。

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

-  FROM ruby:2.4.6
+ FROM ruby:2.6.6

カバレッジが低いので不安だが、いったんローカルはこれでうまくいった。

 

んで次にcircle ci の更新。

ci側も同様にimageの更新

-  image: circleci/ruby:2.4.6-node
+ image: circleci/ruby:2.6.6-node 

 ただこれで一度つまづいて、rubyのバージョンをあげるとnodeのバージョンも一緒に上がる。

2.4.6 https://hub.docker.com/layers/circleci/ruby/2.4.6-node/images/sha256-89766c25837d02700f79082ca6d1196c4333ee173a6b12d13709a61beea14c1c?context=explore

2.6.6 https://hub.docker.com/layers/circleci/ruby/2.6.6-node/images/sha256-285a7bd7ff370f3b9069895cc9bfdac23740a67dc5edd0f344f0335857719cac?context=explore

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時間くらい