はじめに
Nuxt.js
で作成した業務用のWebアプリを、S3の Static website hosting
で運用しているのですが、個人メンテナンス & 更新頻度が少ないといった理由で、1.手元で yarn generate
→ 2.手動でS3にアップロード → 3.手動で全ファイルを公開、というひどい運用をしていました。
そこで、先日正式リリースされたGithub Actionsを使って、自動デプロイの環境を整えたのでその備忘録です。
自動デプロイの手順
- Githubの
release
ブランチへのプッシュをトリガーにGithub Actionsを実行 -
release
ブランチをチェックアウト -
python
のセットアップ -
awscli
のインストール -
nuxt
のビルド - 生成ファイル
dist
をS3にコピー - 完了をSlackに通知
全体の構成
実際に使用した設定ファイルを載せ、それぞれについて簡単に説明していきます。
基本的には初期テンプレートの Node.js
および python package
を参考にしています。
また、yamlの書き方とslackへの通知方法は下記記事を参考にさせていただきました。
参考:【GitHub】新GitHub Actionsを使ってAWS ECRにイメージをプッシュするCIを作ってみた
参考:GitHub Actionsを使ってAWS Lambdaへ自動デプロイ (詳説+デモ手順付きver)
name: Auto Deploy to AWS S3
on:
push:
branches:
- release
jobs:
deploy:
name: Deploy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Setup 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: Build
run: |
yarn install
yarn generate
- name: Copy to s3
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
run: aws s3 cp ./dist ${{ secrets.S3_UPLOAD_PATH }} --recursive --acl public-read
- name: Notify to Slack
run: curl -X POST -H 'Content-type:application/json' --data '{"text":"'"${GITHUB_REPOSITORY}"'\n【Deploy Success】"}' ${{ secrets.SLACK_WEBHOOK }}
デプロイ手順とyamlの対応
1. 特定ブランチへのプッシュをトリガーにGithub Actionsを実行
on:
push:
branches:
- release
push以外にも様々なトリガーを設定することができます。
参考:Events that trigger workflows
2. プッシュしたブランチをチェックアウト
steps:
- uses: actions/checkout@v1
uses: actions/hogehoge
は公式が用意しているアクションになります。
参考:GitHub Actions
3. pythonのセットアップ
- name: Setup Python 3.7 for awscli
uses: actions/setup-python@v1
with:
version: '3.7'
architecture: 'x64'
4. awscliのインストール
- name: Install awscli
run: pip install --upgrade pip awscli
5. nuxtのビルド
- name: Build
run: |
yarn install
yarn generate
複数行のコマンドは run |
の下に続けて書くことができます。
yarn generate
により、Webページの静的ファイルが dist
に生成されます。
6. 生成ファイルdistをS3にコピー
- name: Copy to s3
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
run: aws s3 cp ./dist ${{ secrets.S3_UPLOAD_PATH }} --recursive --acl public-read
事前にawscli
でS3にアップロードするために必要な権限を持つユーザーを作成し、そのアクセスキーIDとシークレトキーIDを使用してアップロードします。
env
の環境変数にそれらのキーIDを設定できますが、セキュリティ上yamlに載せるのが適切でないものについては、Githubの Setting → Secrets
に事前に登録しておくと、 ${{ secrets.HOGEHOGE }}
で取得することができます。
アップロードは aws s3 cp
コマンドを実行するだけですが、そのままWebで公開できるよう --acl public-read
オプションを追加しています。
7. 完了をSlackに通知
- name: Notify to Slack
run: curl -X POST -H 'Content-type:application/json' --data '{"text":"'"${GITHUB_REPOSITORY}"'\n【Deploy Success】"}' ${{ secrets.SLACK_WEBHOOK }}
curlで直接 Incoming Webhooks
のURLにJSONペイロードを送信します。
通知先のチャンネルとURLはSlack側で事前に確認しておきます。
↓通知結果↓
また、通知の内容や装飾は下記記事を参考に調整すると良いと思います。
参考:SlackのIncoming Webhooksを使い倒す
まとめ
Github Actionsが正式リリースされたので使ってみたところ、非常に簡単に自動デプロイの環境を整えることができました。
本記事は私が実際に使用した内容の説明のみとなりますが、今後はテストなども追加したちゃんとしたCI/CD環境を整えたらまた記事にします。