Jekyllで書いたブログをCircleCIでbuildしてS3にdeployする
このブログはjekyllで書いていて、配信はS3に上げたあとCloudFrontを使って配信している。 毎回手でdeployするのはめんどくさいので以下のようにしている。
- gihubでプルリクエストを作成
- 自動でCircleCIでbuildしてhtmlとしてただしそうかチェック
- よさそうならmasterにマージ
- masterにマージされたら、同じチェックをしてその後S3にアップロード
- アップロードが終わったらCloudFrontのキャッシュを消す
CircleCIの設定ファイルは以下のようになっていて、BUCKET_NAME
やCLOUDFRONT_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