OTOBANK Engineering Blog

オトバンクはコンテンツが大好きなエンジニアを募集しています!

CircleCI で composer を高速化させる

こんにちは!@riaf です。 今日は PHP BLT #1 ですね! (LTネタの仕込みもせずにこんな記事を書いていて良いのでしょうか)

弊社では、サービスの CI / デプロイ等に CircleCI を利用しています。 最近の PHP 開発では、Composer を使うことが多いと思うのですが、Symfony Components とかを使い始めると、依存するパッケージが多くなってしまって、CI 時の composer install に思いの外時間がかかってしまうこと、ありますよね。

特に、頻繁にテストが行われるようになると、Composer が GitHub の API リミットに引っかかってしまい、アーカイブではなくソースコードを clone してリミットを回避するので、より時間がかかるようになってしまいます。

「どうにかしたいですよねー」という声が上がってきたので、「よーし、いっちょやってやろうじゃないですか」と、ちょっと工夫することで遅い時は 1 分程度かかってしまっていた composer install がちょっと手を加えることで 5 秒程度で終わるようになりました。

ソースコード取得を回避する

まずは何より、GitHub からのパッケージ取得をアーカイブで行うようにします。 API リミットは、認証すれば格段に緩和されるので、これだけでも非常に効果があるかと思います。

GitHub の OAuth トークンを作って、CircleCI の Environment Variables ($GITHUB_OAUTH_TOKEN) に設定しました。 circle.yml には次のように記述しています。

dependencies:
    pre:
        - composer config -g github-oauth.github.com $GITHUB_OAUTH_TOKEN

composer ディレクトリをキャッシュに加える

さらに、日常的な CI では composer.lock によってバージョンが確定している状態なので、これをキャッシュすることで、ネットワークアクセスをほぼ行わないようにすることができます。

dependencies:
    cache_directories:
        - ~/.composer/cache

どちらも、circle.yml に少し変更を加えるだけですので、composer install が遅くて困っている方は、ぜひ試してみてください ;p