GitHub Actions が正式リリースされたので、当ブログの自動ビルドシステムを AWS CodePipeline + AWS CodeBuild から GitHub Actions へ移行してみました。

GitHub Actions とは

GitHub Actions は、継続的インテグレーション (CI) を GitHub で直接行えるシステムです。今までは GitHub の外部に Jenkins を立てたり CircleCI などのサービスを用いて CI を回していましたが、 GitHub Actions のお陰で外部サービスを利用せずとも CI を回すことができるようになりました。

この GitHub Actions はパブリックリポジトリなら無料です。プライベートリポジトリでは Free プランなら月あたり 2000 分実行できます。なかなかの太っ腹です。

当ブログは、 GatsbyJS でブログを構築し、 GitHub にブログのソースコードが push されるたび WebHook を発行し、 AWS CodePipeline と AWS CodeBuild を用いて、自動でブログをビルド、デプロイするシステムを構築しましたが、今回は料金や管理のしやすさから GitHub Actions に移行してみました。

アクションの定義

定義方法などは異なりますが、基本的に AWS における buildspec.yml とやっていることは同じです。 今回は、 .github/workflows/build.yml に GitHub Actions のアクション定義を置いてみました。

name: Build

on:
  push:
    branches: master

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v1
    - name: Install Node.js 10.x
      uses: actions/setup-node@v1
      with:
        node-version: 10.x
    - name: npm install & build
      run: |
        npm ci
        npm run build --if-present
    - name: Install Python 3.7 for awscli
      uses: actions/setup-python@v1
      with:
        version: 3.7
        architecture: x64
    - name: Install awscli
      run: pip install --upgrade pip awscli
    - name: Deploy
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      run: |
        aws s3 sync --exact-timestamps --delete public/ s3://blog.livewing.net
        aws cloudfront create-invalidation --distribution-id ************** --paths '/*'

ここで、 ${{ secrets.AWS_ACCESS_KEY_ID }}${{ secrets.AWS_SECRET_ACCESS_KEY }} の部分は、 AWS へのアクセスキーとシークレットを表します。これらの変数は、リポジトリの Settings → Secrets から登録することができます。これらのキーへは AWS IAM を用いて S3 と CloudFront への最低限の許可を与えておきます。

おわり

あとは、今まで通り GitHub に push すれば自動的にブログがビルドされて更新されます。

今までは GitHub の外部のサービスを用いて自動的にデプロイを行っていましたが、 GitHub Actions によって CI が GitHub にまとめられるようになって管理工数が削減されるようになったのは素晴らしいです。是非試してみてください。