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したらテストを実行して、それが通ったらサーバにデプロイする。といった動作を無料で簡単に作れます。