{
    "componentChunkName": "component---src-templates-blog-post-tsx",
    "path": "/2021/05/07/",
    "result": {"data":{"site":{"siteMetadata":{"title":"otegal.dev"}},"markdownRemark":{"id":"60e08e6a-5e5e-5fb4-8e78-b4540d5020b6","excerpt":"なにこれ 2年くらい過去のメモが発掘されました。 もうLaravel5.8もサポート外ではあるし、ここまで放置しないため直接は役に立たないが、考え方、やり方は参考になるかもしれないので記録として残すことにします。 行ったアップグレード作業の進め方 1日でPHP7.3 + Laravel5.…","html":"<h1>なにこれ</h1>\n<p>2年くらい過去のメモが発掘されました。<br>\nもうLaravel5.8もサポート外ではあるし、ここまで放置しないため直接は役に立たないが、考え方、やり方は参考になるかもしれないので記録として残すことにします。</p>\n<h1>行ったアップグレード作業の進め方</h1>\n<ol>\n<li>1日でPHP7.3 + Laravel5.8まであげきる。（ローカル環境で）</li>\n<li>更新されていないライブラリを他ライブラリに置き換える</li>\n<li>独自でFW拡張した箇所はLaravel標準機能を利用するように変更する</li>\n<li>更新したコードベースで動作するインスタンスを立てる</li>\n<li>テスト</li>\n<li>リリース手順作ってレビューしてもらう</li>\n<li>リリース</li>\n</ol>\n<h1>詳細</h1>\n<h2>1. 1日でPHP7.3 + Laravel5.8まであげきる。（ローカル環境で）</h2>\n<h3>なんでこんなことを？</h3>\n<p>Laravelの5.1から5.8ってマイナーバージョンやん？と思うでしょう。違うのです。。。<br>\nLaravelにセマンティックバージョニングが適応されたのは（確か）6系からです。。。<br>\n5.1から5.8はメジャーバージョンが7個上がったと捉えてくれるとイメージしやすいかと思います。</p>\n<p>メジャーバージョン7個上げるなんていろんなブログ探しても見つからなかったので、どのくらい大変かイメージすらできない状況でした。ビジネスサイドにも稼働時間の説明ができない。<br>\nなのでイメージを掴むためにまずは、枝葉を捨ててアップデートをやり切る事で残作業の規模感を把握する方法をとることにした記憶があります。</p>\n<p>5.1から5.8へのアップグレードガイドなど存在しないので、地道に5.1→5.2→5.3→…→5.8とアップグレードしていきます。\n前提としてある程度クリティカルな箇所にはテストコードが書かれている状況で取り組みました。</p>\n<p>とにかくまずは走り切ってみて<strong>代替対応や慎重な検討が必要</strong>などの項目をリストアップしていきます。</p>\n<h3>PHP編</h3>\n<p>ローカル開発環境はdockerイメージの更新で終わり！</p>\n<p>と思っていたのですが、いくつか拡張モジュールが死んでいた。。\n問題に直面したのは以下の3モジュール</p>\n<ul>\n<li>mailparse</li>\n<li>memcached</li>\n<li>mcrypt</li>\n</ul>\n<p><strong>mailparse</strong>\n過去は利用していたが、機能削除により不要になっていたのでインストールしないように変更。お役目御免。</p>\n<p><strong>memcached</strong>\nRedis利用に全部置き換わっているので不要。お役目御免。</p>\n<p><strong>mcrypt</strong>\nmcryptはphp7.2からコアモジュールから削除されました。対応方法は2通り。</p>\n<ul>\n<li>mcryptを利用しないで他で作り直す</li>\n<li>mcryptを利用するためPECLから持ってくる (<a href=\"https://pecl.php.net/package/mcrypt\">https://pecl.php.net/package/mcrypt</a>)</li>\n</ul>\n<p>調査フェーズでは一旦PECLからmcryptをダウンロードした。要検討項目として別途対応とする。</p>\n<p>その後の検討メモはこんなの書いていた。</p>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">暗号化についてはOpenSSLを利用する。\n\n選定理由\n現在のコードはOpenSSLで暗号化している。\n\nLaravelでの暗号化はOpenSSLを利用している。\n参考 https://readouble.com/laravel/5.3/ja/encryption.html\n\nmcryptからOpenSSLの移行をする際の参考記事が豊富\n\n参考\nhttps://qiita.com/terra_yucco/items/6fa12af04c86f74089b4\nhttps://qiita.com/sapi_kawahara/items/bbfbc57fd12ff348f216\n</code></pre></div>\n<h3>Laravel編</h3>\n<h4>1日でupdateしてみて検証するためのもの</h4>\n<p>以下までできたらupdate完了とする</p>\n<ul>\n<li><code class=\"language-text\">composer update</code>が完了する</li>\n<li>トップページが表示されるところを確認</li>\n</ul>\n<h4>超重要な気づき</h4>\n<p>アップグレードガイドの言っていることがわからない場合はGitHubでLaravelのコードを読みに行く。これ大事。</p>\n<h3>5.2</h3>\n<h4>アップグレードガイド</h4>\n<p><a href=\"https://readouble.com/laravel/5.2/ja/upgrade.html\">https://readouble.com/laravel/5.2/ja/upgrade.html</a></p>\n<h4>やってないこと</h4>\n<ul>\n<li>SelfHandlingはいらなくなったらしいが、実装してくと時間かかるのでパス</li>\n</ul>\n<p><a href=\"https://readouble.com/laravel/5.2/ja/upgrade.html#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%90%E3%82%B9%E3%81%A8%E3%83%8F%E3%83%B3%E3%83%89%E3%83%A9\">https://readouble.com/laravel/5.2/ja/upgrade.html#%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%83%90%E3%82%B9%E3%81%A8%E3%83%8F%E3%83%B3%E3%83%89%E3%83%A9</a></p>\n<h4>ガイドに乗っていない箇所でエラー吐いた箇所</h4>\n<p><code class=\"language-text\">\"laravelcollective/html\": \"5.1.*\"</code> を <code class=\"language-text\">\"laravelcollective/html\": \"5.2.*\"</code>に変更する</p>\n<h3>5.3</h3>\n<h4>アップグレードガイド</h4>\n<p><a href=\"https://readouble.com/laravel/5.3/ja/upgrade.html\">https://readouble.com/laravel/5.3/ja/upgrade.html</a></p>\n<h4>やってないこと</h4>\n<ul>\n<li>認証スカフォールドで新しい認証用Controllerは用意しない。いらなそう</li>\n<li>mcryptが完全に死にました。詳しくはこちらで\n<ul>\n<li><a href=\"https://readouble.com/laravel/5.3/ja/upgrade.html#%E6%9A%97%E5%8F%B7%E5%8C%96\">https://readouble.com/laravel/5.3/ja/upgrade.html#%E6%9A%97%E5%8F%B7%E5%8C%96</a></li>\n</ul>\n</li>\n<li>データベースにキューイングするときのテーブルが変更になったようです\n<ul>\n<li>migration書き換えないとね</li>\n<li><a href=\"https://readouble.com/laravel/5.3/ja/upgrade.html#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E5%A4%89%E6%9B%B4\">https://readouble.com/laravel/5.3/ja/upgrade.html#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E5%A4%89%E6%9B%B4</a></li>\n</ul>\n</li>\n<li>ブロードキャストの進化があるがガイド通り設定しても動かぬ\n<ul>\n<li><a href=\"https://readouble.com/laravel/5.3/ja/upgrade.html#%E3%83%96%E3%83%AD%E3%83%BC%E3%83%89%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88\">https://readouble.com/laravel/5.3/ja/upgrade.html#%E3%83%96%E3%83%AD%E3%83%BC%E3%83%89%E3%82%AD%E3%83%A3%E3%82%B9%E3%83%88</a></li>\n</ul>\n</li>\n</ul>\n<h4>ガイドに乗っていない箇所でエラー吐いた箇所</h4>\n<ul>\n<li><code class=\"language-text\">\"laravelcollective/html\": \"5.3.*\",</code> を <code class=\"language-text\">\"laravelcollective/html\": \"5.3.*\"</code>に変更する。\n以降は全部これでしょう。割愛しますね。</li>\n<li><code class=\"language-text\">App\\Libs\\Laravel\\Queue\\QueueServiceProvider</code>という独自のサービスプロバイダの解決行えなかったのでコメントアウト</li>\n<li><code class=\"language-text\">Illuminate\\Database\\Eloquent\\ScopeInterface</code>が存在しないよのエラー。コメントアウト。</li>\n</ul>\n<h3>5.4</h3>\n<h4>アップグレードガイド</h4>\n<p><a href=\"https://readouble.com/laravel/5.4/ja/upgrade.html\">https://readouble.com/laravel/5.4/ja/upgrade.html</a>\ntinkerは絶対いれてください。お願いします。デバッグしやすいねん。</p>\n<h4>やってないこと</h4>\n<p>特筆ない</p>\n<h4>ガイドに乗っていない箇所でエラー吐いた箇所</h4>\n<ul>\n<li>iseedが死んじゃうううう</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">In IseedServiceProvider.php line 35:\nCall to undefined method Illuminate\\Foundation\\Application::share()  </code></pre></div>\n<p><a href=\"https://readouble.com/laravel/5.4/ja/upgrade.html#share%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AE%E5%89%8A%E9%99%A4\">https://readouble.com/laravel/5.4/ja/upgrade.html#share%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E3%81%AE%E5%89%8A%E9%99%A4</a>\nshare()というメソッドは死にました。</p>\n<p>なので以下で対応可能</p>\n<ul>\n<li><code class=\"language-text\">Orangehill\\Iseed\\IseedServiceProvider::class</code>をコメントアウトする</li>\n<li>最新のiseedを入れてcomposer update</li>\n<li>その後<code class=\"language-text\">Orangehill\\Iseed\\IseedServiceProvider::class</code>をコメントから戻して composer update</li>\n</ul>\n<h3>5.5</h3>\n<h4>アップグレードガイド</h4>\n<p><a href=\"https://readouble.com/laravel/5.5/ja/upgrade.html\">https://readouble.com/laravel/5.5/ja/upgrade.html</a></p>\n<h4>やってないこと</h4>\n<p>非互換いろいろあるらしい。なにもしてません。</p>\n<h4>ガイドに乗っていない箇所でエラー吐いた箇所</h4>\n<ul>\n<li>japanese-holiday/japanese-holidayで依存関係の解決ができない。最新版の2.0.4を試してもダメ。さようなら。日本の祝日</li>\n</ul>\n<h3>5.6</h3>\n<h4>アップグレードガイド</h4>\n<p><a href=\"https://readouble.com/laravel/5.6/ja/upgrade.html\">https://readouble.com/laravel/5.6/ja/upgrade.html</a></p>\n<h4>やってないこと</h4>\n<p><code class=\"language-text\">fideloper/proxy依存指定を^4.0へアップデートしてください。</code> そういうものはcomposer.jsonにありません。</p>\n<h4>ガイドに乗っていない箇所でエラー吐いた箇所</h4>\n<ul>\n<li>phpspecがあるとsymfonyのverupができない。エラーになる。ので削除しました。phpならXunit系っすよー！！！</li>\n<li>SHAHashServiceでinfoメソッドを実装する必要あり。Haserという抽象クラスに定義が追加されたため</li>\n</ul>\n<h3>5.7</h3>\n<h4>アップグレードガイド</h4>\n<p><a href=\"https://readouble.com/laravel/5.7/ja/upgrade.html\">https://readouble.com/laravel/5.7/ja/upgrade.html</a></p>\n<h4>やってないこと</h4>\n<p>なんかよみづらい。さらっと見た感じ、対応する箇所少ない。</p>\n<h4>ガイドに乗っていない箇所でエラー吐いた箇所</h4>\n<ul>\n<li>エラー</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">> @php artisan package:discover\nIn Container.php line 960:\nUnresolvable dependency resolving [Parameter #0 [ &lt;required> $app ]] in class Illuminate\\Support\\Manager                                 </code></pre></div>\n<p>解決方法は<a href=\"https://github.com/laravel/framework/issues/26766\">https://github.com/laravel/framework/issues/26766</a></p>\n<h3>5.8</h3>\n<h4>アップグレードガイド</h4>\n<p><a href=\"https://readouble.com/laravel/5.8/ja/upgrade.html\">https://readouble.com/laravel/5.8/ja/upgrade.html</a></p>\n<h4>やってないこと</h4>\n<p>なんかよみづらい。composer.json以外なにもやってない</p>\n<h4>ガイドに乗っていない箇所でエラー吐いた箇所</h4>\n<ul>\n<li>エラー</li>\n</ul>\n<div class=\"gatsby-highlight\" data-language=\"text\"><pre class=\"language-text\"><code class=\"language-text\">> @php artisan package:discover\nIn AirbrakeExceptionHandler.php line 9:                                                                               \nClass adamtester\\laravelairbrake\\Handler\\AirbrakeExceptionHandler contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Illuminate\\Contracts\\Debug\\ExceptionHandler::shouldReport)</code></pre></div>\n<p>5.8から<code class=\"language-text\">Illuminate\\Contracts\\Debug\\ExceptionHandler</code>にメソッドは1つ追加されてまんがな。\n<a href=\"https://laravel.com/api/5.8/Illuminate/Contracts/Debug/ExceptionHandler.html#method_shouldReport\">https://laravel.com/api/5.8/Illuminate/Contracts/Debug/ExceptionHandler.html#method_shouldReport</a></p>\n<p>とりあえずvendorの<code class=\"language-text\">adamtester\\laravelairbrake\\Handler\\AirbrakeExceptionHandler</code>に<code class=\"language-text\">shouldReport(Exception $e)</code>を追記してからcomposer updateをしたら成功した。<br>\nこの独自で拡張したライブラリにも変更入れる。プルリク作っておきます。</p>\n<h2>2. 更新されていないライブラリを他ライブラリに置き換える</h2>\n<p>とりあえず上げ切って対応保留した箇所の整備を行います。\nmcryptとかjapanese-holidayとかです。</p>\n<p>細かいことは気にせずにアップグレードをやり切って対応リストを作成しておけば、他メンバーにお願いすることも可能になっています。<br>\n残りのタスクを見て規模感まではイメージできるようになっています。</p>\n<p>最近流行りのライブラリに載せ替えたり、issue巡ったりできるので、結構楽しいフェーズですね。</p>\n<h2>3. 独自でFW拡張した箇所はLaravel標準機能を利用するように変更する</h2>\n<p>極力FW提供の機能を活用するように変更してました。<br>\n今後のアップデート時にも邪魔になりますし、運がよければFW側で機能拡充してくれますので。</p>\n<p>この作業はアップデートを走り抜けた人が担当すると話早いと思います。</p>\n<h2>4. 更新したコードベースで動作するインスタンスを立てる</h2>\n<p>当時、EC2ベースで動かしていた背景もあって、既存の開発サーバにデプロイしても動かない状況だったのでEC2で新しいインスタンスを立てました。<br>\n一部ECSを活用していたので、その時にコンテナ技術の恩恵を本当に噛み締めました。<br>\nこの時に全部リプレイスすれば良かったなと心残りです。。。</p>\n<h2>5. テスト</h2>\n<p>どこまでやるかは事業特性や組織風土にも関わってくると思うので、その時の状況に応じてください。<br>\n当時はユーザ体験を著しく損なうと思われる箇所以外はサクッと確認に留めていました。</p>\n<h2>6. リリース手順作ってレビューしてもらう</h2>\n<p>production用のインスタンス作成なり、リリース手順なりをチェックするフェーズです。<br>\n残念ながら、このフェーズは自分は新規プロジェクトの方にほぼ付きっきりでそこまで関われず。。。</p>\n<h2>7. リリース</h2>\n<p>LBの設定をいじりながら徐々に新サーバに流してバグが発生していないか、サーバメトリクスは問題ないかなどをチェックして、適応範囲を増やしていきました。<br>\n旧サーバも切り戻し用に1週間程度は残していた気がします。</p>\n<h1>おわりに</h1>\n<p>エンジニア的にはそこそこ面白かったです。<br>\n事業としては旨味が少ない割に時間とるので、あんまりかなと。</p>\n<p>なので、お互いに共通で関心がある事を主目的で話していた記憶が蘇りました。\nセキュリティ攻撃に受けたらすぐには適応できないので事業畳むしかない状態ですよー。とか、アプリがサクサク動くようになるので回遊時間伸びるかもしれませんよー。とか、環境が新しくなるのでエンジニア採用時のマイナスも除去できますよー。とか。</p>\n<p>個人的には二度とこのようなバージョンアップをする状況を作りたくないなと思います。終わり。</p>","frontmatter":{"title":"【過去メモ発掘！】PHP5.6 + Laravel5.1からPHP7.3 + Laravel5.8にアップグレードした時の奮闘メモ","tags":["PHP","Laravel"],"date":"2021-05-07","description":null}}},"pageContext":{"id":"60e08e6a-5e5e-5fb4-8e78-b4540d5020b6","previousPostId":"62fb6e48-3242-5903-9a82-a90f4c95c334","nextPostId":"5d1fe586-5939-5ba8-b433-162ba663a8ee"}},
    "staticQueryHashes": ["2841359383"]}