GitHub ActionsでCI/CDを無料で試す
今回試すこと
- GitHub Actionsを使ってデプロイを自動化する。
- デプロイ用のコメントをつけて push すると開発環境にデプロイする。
- develop ブランチに push(merge)するとステージング環境にデプロイする。
- releaseタグを作成すると本番環境にデプロイする。
- 特定のコメントをつけて push するとデプロイは行わない。
今回作成した内容はこちらで公開しています。
GitHub Actionsとは?
GitHub の CI/CD 機能です。
他の CI/CD サービス同様、リポジトリに対する push や pull request 等のイベントをトリガーに、あらがじめ定義していたワークフローに従って処理を自動実行することができます。
これにより、 push したらテストを実行にデプロイ。といった作業が自動で且つ 無料(利用上限あり) で出来るというありがたいサービスです。
GitHub Actions のドキュメントはこちら。
無料枠
2021/09/22時点で下記の通り利用上限が設定されているようです。
無料の GitHubアカウントでも月に2000時間も使えるなんて、個人用途では十分過ぎますね。
ただし、 CI/CD を動かす OS は自由に選択できるのですが、その OS によっては実際の実行時間よりも多く消費されます。
- Windows の場合:実際の実行時間の2倍の時間が消費される。
- macOSの場合:実際の実行時間の10倍の時間が消費される。
例えば macOS で100分間 GitHub Actions を利用すると、10倍の1000分利用したことになります。
が、公開リポジトリの場合は、上記のような制限はないようです。
実際に使ってみる
GitHub Actions の使い方は非常に簡単。リポジトリの .github/workflows にワークフローを記載した yaml を配置するだけです。
yaml のファイル名は自由で、複数ファイル配置しても大丈夫です。
作成したワークフローと解説
# 任意の名前
name: Workflow
# このワークフローを実行するトリガーの種類。今回は push をトリガーに実行する。
on: [push]
jobs:
# 特定のコメントが push された場合、スキップするためのチェックジョブ(名前(check)は任意)
check:
# 使用するOS
runs-on: ubuntu-latest
# ジョブを実行する条件
# commit コメントに [SKIP] か WIP が含まれていたらジョブを実行しない
if: "!contains(github.event.head_commit.message, '[SKIP]') && !contains(github.event.head_commit.message, 'WIP')"
# 実行する処理をsteps配下に配列で記載する
steps:
# 任意の処理名
- name: commit message checking
# 実行する処理コマンド
run: echo "${{ github.event.head_commit.message }}"
# node_modules をキャッシュするためのジョブ
# GitHub Actionsを実行する度に npm install すると毎回時間がかかるので、 package.json に変更がなければキャッシュを利用する
npm_cache:
# check ジョブが完了してからこのジョブを実行する
# needs の記述がない場合、 check ジョブを同時にこのジョブが実行される
needs: [check]
# このジョブを実行する OS を指定
runs-on: ubuntu-latest
steps:
# リポジトリのソースコードをチェックアウト
- uses: actions/checkout@v2
# 使用する node.js を定義
- name: Set up Node
uses: actions/setup-node@v1
with:
node-version: '10.x'
# node_modules をキャッシュする
# package.json のハッシュをキーにすることでファイルに変更がキャッシュを利用
# 変更があれば npm install を実行するようにする
- name: Cache node_modules
id: cache-node_modules
uses: actions/cache@v1
with:
path: node_modules
key: ${{runner.os}}-venv-${{hashFiles('package.json')}}
# キャッシュがなければ npm install を実行
- name: Install dependencies
if: steps.cache-node_modules.outputs.cache-hit != 'true'
run: npm install
# デプロイを行うジョブ
deploy:
# npm_cache ジョブの後に実行する
needs: [npm_cache]
runs-on: ubuntu-latest
# 以下のいずれかの条件の場合にこのジョブを実行する
# ・release-* のタグが作成した場合
# ・develop ブランチに push した場合
# ・コミットメッセージに [DEPLOY_DEV] を含めた場合
if: contains(github.ref, 'tags/release-') || github.ref == 'refs/heads/develop' || contains(github.event.head_commit.message, '[DEPLOY_DEV]')
steps:
# リポジトリのソースコードをチェックアウト
- uses: actions/checkout@v2
# 使用する node.js を定義
- name: Set up Node
uses: actions/setup-node@v1
with:
node-version: '10.x'
# キャッシュした node_modules を利用
- name: Cache node_modules
id: cache-node_modules
uses: actions/cache@v1
with:
path: node_modules
key: ${{runner.os}}-venv-${{hashFiles('package.json')}}
# コミットメッセージに [DEPLOY_DEV] を含めた場合の処理
- name: Deploy dev
if: contains(github.event.head_commit.message, '[DEPLOY_DEV]')
run: |
sudo sh deploy.sh
env:
# 環境毎に異なる環境変数を設定
# 公開したくないような値は secrets に登録した値を利用
KEY: ${{secrets.DEV_KEY}}
# develop ブランチに push した場合の処理
- name: Deploy staging
if: github.ref == 'refs/heads/develop'
run: |
sudo sh deploy.sh
env:
# 環境毎に異なる環境変数を設定
# 公開したくないような値は secrets に登録した値を利用
KEY: ${{secrets.STG_KEY}}
# release-* のタグが作成した場合の処理
- name: Deploy production
if: contains(github.ref, 'tags/release-')
run: |
sudo sh deploy.sh
env:
# 環境毎に異なる環境変数を設定
# 公開したくないような値は secrets に登録した値を利用
KEY: ${{secrets.PROD_KEY}}
Secrets の登録
GitHub のリポジトリのページから Settings > Secrets を開き、 New repository secret から登録します。
GitHub Actions の実行結果
GitHub のリポジトリのページから Actions を開き、 New repository secret から登録します。
自動テスト&デプロイ
別の記事にしている自動テストのコードやServerlessでの自動デプロイと組み合わせることで、ソースコードをPushしたらテストを実行して、それが通ったらサーバにデプロイする。といった動作を無料で簡単に作れます。