count0.org

GitHub Actionsでブログをデプロイする

08 February 2020 misc

このブログはJekyllで作られ、S3にファイルを置き、CloudFrontで配信するという構成になっている。

手元でファイルをビルドしてs3_websiteを使ってS3、CloudFrontへデプロイしていたのだが、このs3_websiteの調子がよろしくないので、デプロイで失敗するようになった。また、s3_websiteはメンテナー不在でこの先不安なので、どうにかしなきゃという状態だった。

月に1回記事を作ればいいほうなので、毎回手動でデプロイしてもよいのだが、GitHub Actionsを試してみたら、成功した。自動化だ。


name: Deploy

on:
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: setup Ruby
      uses: actions/setup-ruby@v1.0.0
    - name: setup Node.js
      uses: actions/setup-node@v1.1.0
    - 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/invalidate-cloudfront-action@v1.2
      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 }}

手順は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/*"
      ]
    }
  ]
}