ランサーズ等のサービスを開発・運用する中で得た知識やノウハウを紹介しています。

Labels:  CakePHP, composer, PHP, イベント/登壇 投稿者:kanazawa

CakePHP2→3バージョンアップの開始

SREチームの金澤です。

ランサーズのCakePHP2→3へのバージョンアップを開始しました。

これから何回かに分けてお話したいと思います。

第1回目は、バージョンアップ方針と
CakePHP新旧バージョンの共存方法についてお話したいと思います。

プロダクト規模

ランサーズのプロダクト規模は概ね以下のようになります。
この規模のソースを、普段の開発を止めずにバージョンアップする必要があります。

ディレクトリ ファイル数 ステップ数
Config 約190 約60000
Console 約170 約30000
Controller 約350 約110000
Lib 約1100 約153000
Model 約420 約105000
View 約2800 約240000
合計 約5030 約698000

CakePHP1.3→2.8の段階的バージョンアップ

そのため、CakePHP1.3→2.8移行は段階的に、controller単位で、1年以上かけて行いました。

その内容について、2018年のPHPカンファレンスでも発表させていただきました。

移行中のディレクトリ構成は以下のようになっていました。

+ app(※CakePHP1.3のコード)
 + config
 + controller
 + lib
 + model
+ cake
 + ※CakePHP1.3本体
+ cake28(※CakePHP2.8のコード)
 + Config
 + Controller
 + Lib
 + Model
+ vendor
 + cakephp
  + ※CakePHP2.8本体

この方法の欠点は、
Controllerに焦点を当て、初めにModel、Libをコピーする形をとったため、
普段の開発で両バージョンのModel、Libを修正しなければならなくなったことです。

CakePHP3ではModelが大幅に変更されていることもあり、同じアプローチでは取れません。
そもそも、両バージョンに修正行う構成は避けたいところです。

CakePHPの処理の流れの概要は以下のようになります。

普段の開発で、両バージョンの修正が必要な状態にならないようにするためには、
原則、矢印の終端のコードから移行していく必要があります。

CakePHP2とCakePHP3の共存

まず、CakePHP本体の共存から開始します。

CakePHP1.3→2.8移行のときは、CakePHP1.3をcakeディレクトリに配置し、
CakePHP2.8はvendorディレクトリでcomposer管理していました。

CakePHP2とCakePHP3を共存させるために、CakePHP3をcomposer管理します。

CakePHP2をcake28/Vendor/cakephp に移動します。
CakePHP2本体そのものに手をいれることを想定し、git管理します。

+ cake28(※CakePHP2のコード)
 + Config
 + Controller
 + Lib
 + Model
 + Vendor
  + cakephp
   + ※CakePHP2本体
+ vendor
 + cakephp
  + ※CakePHP3本体

加えて、config、srcディレクトリを作成し、ここにCakePHP3のコードを書いていきます。

+ config(※CakePHP3のコード)
 + .env
 + App.php
+ src(※CakePHP3のコード)
 + Controller
 + Lib
 + Model
+ cake28(※CakePHP2のコード)
 + Config
 + Controller
 + Lib
 + Model
 + Vendor
  + cakephp
   + ※CakePHP2本体
+ vendor
 + cakephp
  + ※CakePHP3本体

旧バージョンでの開発抑止

CakePHP1.3→2.8のバージョンアップが長引いた要因の一つに、
普段の開発がCakePHP1.3で進められていたことがあります。

バージョンアップの進捗状況を壁にも書いていたのですが、途中で棚卸をした段階で、
多くの新規コントローラーがCakePHP1.3に追加されていたことが判明しました。

フレームワークのバージョンアップは長丁場になります。
その間にも普段の新規開発は行われるため、
なるべくこれらを新バージョンで開発してもらう工夫が必要になります。

CIで旧バージョンの新規開発をチェックする

バージョンアップを行うにあたり、CIで文法チェックを行っていましたが、これは非常に効果がありました。

※詳細は以前のブログに詳しく書いています。

ランサーズの開発は、CIのチェックを通らないとマージできないように設定しています。

新規開発を新バージョンで進めてもらうために、CIのチェックに
CakePHP旧バージョンでの開発を抑止するチェックを入れる予定です。

CakePHP2→4バージョンアップについて

この単位で段階的にバージョンアップするのであれば、
CakePHP2→4へのバージョンアップもできるかも知れないと思い、検討しました。

しかし、CakePHP4では、要求するPHPUnitの最低バージョンが8.3.3以上になります。
CakePHP2では、PHPUnit6以上になるとUTが正しく動作しなくなります。

CakePHP2のUTを利用しながらバージョンアップを行いたいので、現状はCakePHP3に留めました。
CakePHP4へのバージョンアップは、UTをCakePHP3ベースに切り替え、
PHPUnitを8.3.3以上にバージョンアップできたタイミングで検討したいと思います。

今後の予定

次回は、最大の難関であるModelのバージョンアップについて書きたいと思います。

CakeFest2019に登壇します

2019/11/7 – 2019/11/10にCakeFestが東京で開催されます。

CakeFestはCakePHPの世界的なイベントで、2019年は日本で開催されることになりました。
※ランサーズは前回の2017年に続き、2019年もスポンサーになっています。

「CakePHP3への滑らかな移行を考える」というテーマが採択されました。
本記事の内容も踏まえて発表する予定です。

ランサーズではサービスを成長させてくれるエンジニア、デザイナーを募集しています!
ご興味がある方は、以下URLよりご応募ください。


【中途採用】
サービスリードエンジニア
テックリード(アーキテクト)
フロントエンドエンジニア
サーバーサイドエンジニア
業務エンジニア(社内システム基盤・基幹システム)

【インターン・学生バイト】
19新卒対象サマーインターン
エンジニアインターン

その他採用情報

関連記事

thumbnail
Web系ベンチャー各社の開発体制・開発プロセスについて | Weekdayランサーズ勉強会

こんにちは、ランサーズのtomohiroです。 ランサーズでは、自社で開催する勉強会で、 『WeekendLancers(週末ランサーズ)』というイベントを開催してきたのですが、少しご無沙汰になっていました。今回改めて再開しようと調整した結果、平日の夜(4月2 …

thumbnail
プログラミング言語Go読書会#11(7.3-7.5)[2017/05/31]

どうも、ameshoです。 先日Lancersで開催された「Go 読書会 #11」の記録をQiitaに書きました。 http://qiita.com/amesho/items/d7085e4bb8ea3073d1fc よろしくお願いします。

ランサーズ開発ランチ(Lunchers#5)〜PHPカンファレンス福岡2018予行練習編〜

初めまして。 6月に開発部の採用・広報として入社いたしました@miyatachiharu_L (宮田)です! ランサーズのエンジニアさんたちの魅力を、 沢山の方に発信していけるように、頑張ります! どうぞ、よろしくお願いいたします。   ランサーズは …