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 actions 利用プラン
 

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