CircleCI で継続的 composer update する

みなさんは日々 composer update していますか?

f:id:enomotodev:20180831192902p:plain

使用しているフレームワークの周辺パッケージの更新に追従し続けるのは大変そうにみえますが、きちんとテストを書いていれば日々の composer update もそれほど苦ではないと思います。

反対に composer update をしていないと依存しているパッケージのセキュリティのバグに脅かされたり、いざパッケージのバージョンをあげることになっても差分が大きすぎて、composer update したらテストがほとんどコケる…ということになりがちです。

そのため個人的には週に1回くらいは composer update をし、パッケージを最新にすることによって、常に更新に追従し続ける必要があると考えています。

Ruby には circleci-bundle-update-pr という gem があり、CircleCI で継続的 bundle update することができるのですが、PHP には同じようなことができるパッケージが無かったので、circleci-bundle-update-pr を参考に circleci-composer-update-pr というパッケージを自作してみました。

使い方

まずは CircleCI を使用していることが前提なので、まだ使ってない方は是非使ってみてください!(確か無料プランでもプライベートレポジトリ1つはプロジェクトを追加できたはずです)

CircleCI との連携が終わったら、 circle.yml または .circleci/config.yml に次のように記述して Cron を設定します。

version: 2
jobs:
  build:
    # ...
  continuous_composer_update:
    docker:
      - image: composer:latest
    working_directory: /work
    steps:
      - run:
          name: Set timezone to Asia/Tokyo
          command: echo "date.timezone=Asia/Tokyo" > "$PHP_INI_DIR/conf.d/date_timezone.ini"
      - checkout
      - restore_cache:
          name: Restore composer cache
          keys:
            - composer-{{ .Environment.COMMON_CACHE_KEY }}-{{ checksum "composer.lock" }}
            - composer-{{ .Environment.COMMON_CACHE_KEY }}-
      - run:
          name: Setup requirements for continuous composer update
          command: composer global require enomotodev/circleci-composer-update-pr
      - deploy:
          name: Continuous composer update
          command: $COMPOSER_HOME/vendor/bin/circleci-composer-update-pr <username> <email> master

workflows:
  version: 2
  build:
    jobs:
      - build:
          # ...
  nightly:
    triggers:
      - schedule:
          cron: "00 10 * * 5" # 毎週金曜日の19時に実行される
          filters:
            branches:
              only: master
    jobs:
      - continuous_composer_update

これで毎週金曜日の19時に composer update が実行されて GitHub に PR が作られます。

f:id:enomotodev:20180831192129p:plain

このように自動で PR を作ってくれるので、あとはテスト結果を見て問題なさそうだったら Merge ボタンをポチるだけとなります。

差分へのリンクもあるので、気になるパッケージの更新は差分も確認することができます。

まとめ

最近は Docker や Kubernetes などのコンテナ技術が流行っていて、ミドルウェアバージョンも簡単に上げることができるようになってきています。

サーバサイドエンジニアとしては使用しているフレームワークの周辺パッケージのバージョンを追従しながら、アップデートの差分を見ることによって、周辺パッケージの知識も少しずつ増やしていければ良いのかなと思っています。

CAREER SKILLS ソフトウェア開発者の完全キャリアガイド

CAREER SKILLS ソフトウェア開発者の完全キャリアガイド

Docker/Kubernetes 実践コンテナ開発入門

Docker/Kubernetes 実践コンテナ開発入門