先日公開したPHPマニュアル日本語版ビルド用Dockerイメージ(iwamot/phd-ja)について、CircleCI でテストにパスした場合にだけ、イメージを Docker Hub にプッシュするようにしてみました。

ただ、なんでもかんでもプッシュするわけにはいかないので、下記のように処理させています。

master ブランチを GitHub リポジトリにプッシュした場合
CircleCI 上でイメージをビルドし、テストにパスした場合にだけ、latest イメージが Docker Hub にプッシュされます。
タグを GitHub リポジトリにプッシュした場合
CircleCI 上でイメージをビルドし、テストにパスした場合にだけ、同名タグ付きのイメージと latest イメージが Docker Hub にプッシュされます。
master 以外のブランチを GitHub リポジトリにプッシュした場合
CircleCI 上でイメージをビルドし、テストします。パスしても Docker Hub にはプッシュしません。
パスしなかった場合、そのブランチから master ブランチへのプルリクエストはマージできません(GitHub の「Branch protection rules」を利用)。

処理の詳細は .circleci/config.yml で定義されています。実装にあたっては「CircleCI2.0でDockerをビルドしてDocker HubにPushするまで」という記事がたいへん参考になりました。

なお、テストフェーズでは「ビルドされたマニュアルのトップページが参照できること」を確認しています。下記が該当部分です。

- run:
    name: Run test
    command: docker run --network container:phd-ja appropriate/curl --retry 10 --retry-connrefused http://localhost/phd-ja/

今回ご紹介したCI環境で今は満足していますが、改善すべき点があるかもしれません。何かお気づきの方は、お知らせいただければ幸いです。