こんにちは、ソフトウェアエンジニアの荻島です。 当社で現在受諾案件の運用開発(バグ修正や追加改修)を主に対応しています。
最近の業務の一つとしてやや古いPHPで稼働しているWordPressのバージョンアップを絶賛対応中なので、本日のエントリーはそれにまつわるあれこれを書ければと思っています。
バージョンアップに至った経緯
発端はある機能の実現のために必要なライブラリが現行のPHPでは動かないということが発覚したことでした。
対象のプロジェクトで使用しているPHPは7系で、既に最新の7.4もEOLを迎えていたため、
- バージョンアップ時に最新の8系にアップデートを行う
- 使用しているWP本体のバージョンやプラグインなども最新の8系に対応したものにアップデートする
- アップデート後に本来実装したかった機能を実装する
という話に広がり、今回の改修PJがスタートした形です。
※システムのバージョンアップをした方がいい理由に関しては先日弊社CTOの山岡が記事を書いているのでそちらも是非読んでみてください! tech.innovator.jp.net
一次調査開始!
最初はどこから手を付けて良いのか分からない状態だったので、まずは全体の工数感の洗い出しのために一次調査としてフェーズを切り、対応が必要そうな部分の洗い出しを行いました。
幸いなことに今回の案件は
- 本番環境はAWS上で稼働
- メディアファイルはS3に上がっていてCloudFrontから配信されている
- サーバーはEC2だがEBSにあるのはソースコードと若干のキャッシュファイルだけ
という状態だったので比較的インフラ周りは気にすることが少なそうだなという印象。 アプリケーション側の主な対応は
- プラグインのアップデート
- 独自実装している部分(とそれに使われているライブラリ)のアップデート
であろうとアタリをつけて手元の開発環境で調査を実施、いくつか課題を発見しました。
課題①:ローカル開発環境
現行のローカル環境はDockerのAlpineベースのコンテナを利用しているのですが、何も考えずにPHPのバージョン指定だけ変えたところ、PHPのバージョンアップに伴い拡張周りの変更などが入った影響でイメージがビルドできなくなりました。しかも自分はAlpine系のコンテナに関する知見(主にAPK周り)がなく、なかなかうまく解決ができず...
こちらに関しては本番のOSとローカルのOSが元々揃っていなかったのと、自分でなんとかできるようにするしかなかったことから、コンテナを自分でも多少触ったことのあるDebianベースのものに切り替えることにしました。
課題②:メジャーバージョンの壁
ローカル環境が一先ず動くようになったところで次は
- 元々少し古めのバージョンのPHPで動いていたこともあり、全体的にプラグインのソースも古め
- プラグインを最新にするにはそもそもPHPのバージョンを上げないといけない
- PHPのバージョン一気に8系まで上げると一部プラグインが壊れて動かなくなる
という合わせ技の課題にぶつかりました。
ここに関しては
- ローカルの環境を7系最新の7.4まで上げる
- WP本体やプラグインを最新にする(この時点で対応していないプラグインやライブラリに対処)
- ローカル環境を8系に上げる
- 再度プラグインとライブラリを精査して対応していないものに対処
という風に少し段階を踏んで調査を進めることにしました。
課題③:DBスキーマの変更を伴うプラグインの更新
一部のプラグインではアップグレード時にDBのスキーマ変更が必要なものがありました。 対象のプロジェクトではサーバーを冗長構成にしているのですが、DBは一つのRDSインスタンスを共有しているのでプラグインのバージョンアップは同時に行わないとプラグインが動かなくなるということが判明。
元々は段階的に新しいPHPのインスタンスをリリースできればなーと考えていたのですが、これにより本番デプロイ時は一気に全てのインスタンスを入れ替える必要が出てきてしまいました...
まとめ
一次調査で当初は予想していなかった課題もいくつか出てきましたが、ローカル環境がDocker化されていたおかげで比較的容易に調査が行なえ、おおよそやらないといけないところも見えてきました。
今回の調査では普段の改修や追加あまり意識することのないようなプラグインのコードや使用している外部ライブラリの実装/テストコードになどにも目を向けることになり、改めて先輩方から聞いていた
- 技術選定時にはメンテナンスされているかを重視しないといけない
- バージョンアップはとにかく地道にやるだけ
- やれば力が付く、レガシー案件は宝の山
みたいなところを肌で感じられるいい機会になりました。
バージョンアッププロジェクトはまだまだ始まったばかりなので、しっかりと移行をやりきって経験値にしていきたいと思います!
お読み頂きありがとうございました!