これはWHITEPLUS Advent Calendar 2018の4日目の記事です。
はじめに
株式会社ホワイトプラスのエンジニアの @ngmy です。
ホワイトプラスでは、自宅にいながら衣類をクリーニングに出せるリネットというサービスを開発しています。
ホワイトプラスの技術スタックに関しては、弊社CTOの @exmeat が書いた1日目の記事を読んでいただくとわかりやすいと思います。
私は普段はクリーニングと長期保管を行うリネット保管というサービスの開発を担当しています。また、要素技術としてPHPとLaravelが得意なので、リネット全体のPHPとLaravelの基盤整備も担当しています。
直近では、リネット全体のPHPとLaravelのアップグレードを行っています。私が入社した2016年10月時点でリネットはPHP 5.6とLaravel 4.2で動いていましたが、今回これをPHP 7.2とLaravel 5.5にアップグレードしようとしてします。
今年の5月からアップグレードの作業に着手していて、8月中旬にいったんLaravel 5.3にアップグレードしてリリースしています。その後、先述のリネット保管の開発のために2週間ほどアップグレード作業を中断・9月から再開して、12月中旬にPHP 7.2とLaravel 5.5にアップグレードしてリリースしようと今まさに絶賛追い込み中です。ガンバりましょう。
また、ただアップグレードするだけでなく、CircleCI 2.0で動かしているCIにPHPStanによる静的解析を導入したり、CIを高速化したりといったことにも取り組んでいます。
今日は、CircleCIで動いている弊社リネットのPHPアプリケーションのCIを高速化するために行ったことについて書きたい思います。
(PHPStanによる静的解析の導入についても、WHITEPLUS Advent Calendar 2018の別日に書く予定です。)
リネットのPHPアプリケーションのCIについて
リネットのPHPアプリケーションのCIは、CircleCI 2.0で動いています。
これ自体は、2017年3月頃に私が構築したものです。
CIでは主に次のことを行なっています。
- GitHubへのPush毎に動くCI
- 1日1回夜間に動くCI(いわゆる夜間ビルド)
- PHPUnitによるユニットテスト
- PHPUnitとXdebugによるコードカバレッジ解析(コードカバレッジのHTMLレポートの生成、コードカバレッジの推移のSlackへの通知等)
- PHP_CodeSniffer、PHPMDによる静的解析
GitHubへのPush毎に動くCIと夜間ビルドの2つに分けている理由は、PHPUnitとXdebugによるコードカバレッジ解析にとにかく時間がかかり、また当時はプロダクションコードのデプロイまでをGitHubへのPush毎に動くCIの中で行っていたこともあり、CIの実行時間を短くしてリリースを素早く行えるようにすること最優先したためです。
夜間ビルドは構築当時でも2時間以上は余裕でかかっていた記憶があります。
そしてリネットの成長とともに実コードが増え、テストコードも増え(増えたよね?)、今年の8月ついにこれになりました。
えるしっているか CircleCIは 5時間でタイムアウトする
夜間ビルドの実行時間が5時間を超えるようになり、CircleCIがタイムアウトするようになりました。
さすがにこのままではまずいということで、PHPとLaravelのアップグレードの作業の中で、CIの高速化にも取り組むことにしました。
続きはこちらをご覧ください。
株式会社ホワイトプラス's job postings