GitHub Actionsでブログをデプロイする
公開日 2020-02-08
このブログはJekyllで作られ、S3にファイルを置き、CloudFrontで配信するという構成になっている。
手元でファイルをビルドしてs3_websiteを使ってS3、CloudFrontへデプロイしていたのだが、このs3_websiteの調子がよろしくないので、デプロイで失敗するようになった。また、s3_websiteはメンテナー不在でこの先不安なので、どうにかしなきゃという状態だった。
月に1回記事を作ればいいほうなので、毎回手動でデプロイしてもよいのだが、GitHub Actionsを試してみたら、成功した。自動化だ。
{% raw %}
name: Deploy
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: setup Ruby
uses: actions/[email protected]
- name: setup Node.js
uses: actions/[email protected]
- name: build
run: |
npm i
bundle install
npm run publish
- name: sync s3
uses: jakejarvis/s3-sync-action@master
with:
args: --exclude '.git*/*' --delete --follow-symlinks
env:
SOURCE_DIR: 'dist'
AWS_REGION: 'ap-northeast-1'
AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }}
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
- name: invalidate
uses: chetan/[email protected]
env:
DISTRIBUTION: ${{ secrets.DISTRIBUTION }}
PATHS: '/*'
AWS_REGION: 'ap-northeast-1'
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
{% endraw %}
手順はmaster
ブランチに更新があれば
- RubyとNode.jsをセットアップ
- node modulesとgemをインストール
- npm scriptを実行してビルド、
- S3にビルドしたファイルをアップロード
- CloudFrontの更新を実行する
このブログ、HTMLはjekyllでビルドしているが、CSSやJavaScriptはwebpackでビルドしているので、このような感じになった。
実行時間は5分程度。node module、gemのインストールとビルドに時間がかかっている。テストを実行しているわけでもないし、気付いたらデプロイ完了していればいいので、キャッシュなどはとりあえずいいかといったところ。
一つ書き忘れていたことがあった。それはS3を実行するIAMユーザーのポリシー。もともとAmazonS3FullAccessとCloudFrontFullAccessのポリシーを与えていたが、S3のアップロードでエラーが出た。
幸いにもkejarvis/s3-sync-actionのissueにワークアラウンドがあったので、ポリシーを変更した。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:*",
"s3:PutObject",
"s3:GetObjectAcl",
"s3:GetObject",
"s3:ListBucket",
"s3:DeleteObject",
"s3:PutObjectAcl"
],
"Resource": [
"arn:aws:s3:::count0.org",
"arn:aws:s3:::count0.org/*"
]
}
]
}