Jekyllで書いたブログをCircleCIでbuildしてS3にdeployする

このブログはjekyllで書いていて、配信はS3に上げたあとCloudFrontを使って配信している。 毎回手でdeployするのはめんどくさいので以下のようにしている。

CircleCIの設定ファイルは以下のようになっていて、BUCKET_NAMECLOUDFRONT_DISTRIBUTION_IDは別途設定画面で環境変数に設定している。

version: 2
jobs:
  build:
    docker:
       - image: circleci/ruby:latest-node-browsers
    working_directory: ~/repo
    steps:
      - checkout
      - restore_cache:
          keys:
          - v1-dependencies-{{ checksum "Gemfile.lock" }}
          # fallback to using the latest cache if no exact match is found
          - v1-dependencies-
      - run:
          name: install dependencies
          command: |
            bundle install --jobs=4 --retry=3 --path vendor/bundle
      - save_cache:
          paths:
            - ./vendor/bundle
          key: v1-dependencies-{{ checksum "Gemfile.lock" }}
      - run:
          name: build
          command: |
            bundle exec jekyll build
      - run:
          name: test
          command: |
            bundle exec htmlproofer ./_site --check-html --disable-external --empty-alt-ignore true
      - persist_to_workspace:
          root: .
          paths:
            - ./_site
  deploy:
    docker:
      - image: circleci/python:2.7-jessie
    working_directory: ~/repo
    steps:
      - attach_workspace:
          at: .
      - run:
          name: Install awscli
          command: sudo pip install awscli
      - run:
          name: Deploy to S3
          command: aws s3 sync ./_site/ s3://$BUCKET_NAME/ --delete
      - run:
          name: Invalidate CloudFront Cache
          command: aws cloudfront create-invalidation --distribution-id $CLOUDFRONT_DISTRIBUTION_ID --paths "/*"
workflows:
  version: 2
  build-deploy:
    jobs:
      - build
      - deploy:
          requires:
            - build
          filters:
            branches:
              only: master