検証環境なのですが、Herokuでデプロイができずやらかしかけた話です。
DBの更新も含んでいたため、デプロイ完了時にサービスが止まることが想定でき、お客様に止まる事と終了したら確認して欲しいとお伝えしていたため長時間お待たせすることができず焦った体験談になります。
誰かしらが同じような問題に直面した時の一助になればと思いさらします。
ざっくりとした環境
Ruby 2.7系
Rail 6.1系
Node 14系
経緯
問題発生まで
その日はお客様から修正依頼が来ており、社内レビューが終了したため検証環境にデプロイしようとしていました。
今回の修正ではDBのテーブルにカラムの追加があり、主要機能でその追加したカラムを参照することから、デプロイ終了後にmigrateを実行しないと主要機能が使えなくなる内容でした。
そのため、お客様に検証環境が一時期使えなくなることと終了したら確認して欲しいと連絡を入れてデプロイを開始。
デプロイはPCからのコマンドで何度も行っている作業なのでデプロイ先が検証環境なことと修正したブランチをデプロイしようとしていることを確認して実行しました。
普段からデプロイに30分弱かかるのでデプロイが終わったらmigrateを実行しないとなと考えながら他の作業をしていました。
そろそろ終わったかとコンソールを確認するとデプロイが失敗している!!
つい先週もデプロイしているので何でだと思いながらも上司に報告し、調査を開始しました。
最初の対応
Herokuのデプロイ失敗は初めてのことだったため焦りながらも、HerokuにDashboardにデプロイ時のログが残ることを確認して自分でログを残す必要がないことを確認しました。
その後、デプロイの失敗が一時的なものかと安易に思いもう一度デプロイを実行しました。
この時は今回の修正ではテーブルにカラムの追加と画面の修正だけで特にデプロイに失敗するような変更はしていないのにと思いながら、再度実行したら大丈夫だろうと思いログもあまり確認しておりませんでした。
ただ、残念ながら今回のデプロイも失敗。
一時的なものでないと判断しデプロイ時のログを最初から確認していきました。
ログの全文は割愛しますがログを初めから見ていたらfailed
の文字が。
[4/4] Building fresh packages...
Done in 36.83s.
Compiling...
Compilation failed:
Browserslist: caniuse-lite is outdated. Please run:
npx browserslist@latest --update-db
Why you should do it regularly: https://github.com/browserslist/browserslist#browsers-data-updating
Error: error:0308010C:digital envelope routines::unsupported
npx browserslist@latest --update-db
と書かれていますしこのコマンドを実行すればエラーも無くなるだろうと考え上司に報告しました。
上司からも初めて見る内容だが、ログにも出ているし一度その対応をしてみてくれと言われました。
ローカルでの開発環境はdocker及びdocker-composeを使用しているので、コンテナに入ってnpx browserslist@latest --update-db
を実行することに。
実行した結果yarn.lock
ファイル内でバージョン指定が変更になっていること、ローカルのコンテナを再起動して問題なく動くことを確認してから3回目のデプロイを実行しました。
ですが3回もデプロイ失敗。
3回目のデプロイ時のログを確認したところ、先ほどのコマンドを実行するように書かれていたエラーは解消されたものの後続でエラーが続けて出ていることがわかりました。
このエラーは2回目の際にも出ていたのですが、その前のエラーを解消すれば治るだろうと思い確認していませんでした。
2回目の対応
そろそろ、最初のデプロイ開始から1時間。
お客様に後ほど確認いただくと連絡していたので焦りながらも継続して出ているエラーの調査に入りました。
エラー内容は下の通りでここからは何もわからないのでgoogle先生に質問しました。
Error: error:0308010C:digital envelope routines::unsupported
そうするとNodeのバージョンについて言及しているページが。
- 「 Error: error:0308010C:digital envelope routines::unsupported 」 の対処法
- 【Next.js】Error: error:0308010C:digital envelope routines::unsupportedなエラー
Nodeのバージョンなんて今回の修正では変更していないよなと思いながらも、思い当たる節がありました。
それは、別の仕事においてCIの参照しているイメージが更新されており、Nodeのバージョンが変更になったことでCIが落ちるようになったという出来事でした。
もしかしてHerokuで使用されるデフォルトのNodeのバージョンが変わったのかも...と思いながら、落ちているデプロイのログと先週の成功しているデプロイのログを見比べたところ案の定、Nodeのバージョンが成功した以前のはResolving node version 16.x...
だったのがResolving node version 18.x...
になっており想像通りの理由だというのがわかりました。
ローカルのdocker環境では14系を指定しており、前から違うじゃないかと思いながらも一旦16系か14系を使用するよう固定してしまえば良さそうだと一安心。
上司に連絡し、一旦14系で固定するように変更したことで無事4回目でデプロイが成功しました。
その後、デプロイ後の作業を行なって、お客様へ確認いただくように無事連絡できました。
最後に
最初のデプロイ開始してから1時間30分。
検証環境だという事もあって問題なかったのですがこれがサービスを止めてでの本番作業だったらとゾッとしました。
また、以前同じような場面に遭遇していたのですぐに当たりをつけられましたが知らなければ今回はNodeのバージョンなんて変えていないはずと的外れな検証をしていたはずです。
なのでこの文章を読んだ誰かしらが、同じような問題に直面した時の一助になればと思います。
長文&駄文を失礼いたしました。