目次

1. 初めに

前回の記事 ではCI/CDツールであるGitHubActionsを用いてビルドやプッシュを自動化する環境を構築しました。

しかし、Gemをインストールする処理は他のステップに比べて処理時間が約10倍もかかっていました。 実行する度に約30個のGemを毎回最初からインストールしていたためです。

この問題を解決するため、キャッシュによりGemのインストールを高速化した結果、ワークフローの処理時間が約1/2になりました。 今回はその手順と実行結果をまとめました。

2. ブログ公開までのワークフロー

まず、このブログが公開されるまでのワークフローを高速化前と高速化後でまとめました。 ★の記載された行が変更箇所です。

2.1. 高速化前

  1. ユーザがmasterブランチへ資産をプッシュする
  2. GitHubActionsがmasterブランチへのプッシュを検知する
  3. GitHubActionsがタイムゾーンを設定する
  4. GitHubActionsがリポジトリをチェックアウトする
  5. GitHubActionsがRubyをセットアップする
  6. (★)GitHubActionsがGemをインストールする
  7. GitHubActionsがJekyll(セーフモードOFF)でビルドする
  8. GitHubActionsがgh-pagesブランチへ生成物をプッシュする
  9. GitHubActionsが生成物をデプロイする
  10. GitHubPagesがブログを公開する

2.2. 高速化後

  1. ユーザがmasterブランチへ資産をプッシュする
  2. GitHubActionsがmasterブランチへのプッシュを検知する
  3. GitHubActionsがタイムゾーンを設定する
  4. GitHubActionsがリポジトリをチェックアウトする
  5. (★)GitHubActionsがGemをキャッシュに保存する
  6. GitHubActionsがRubyをセットアップする
  7. (★)GitHubActionsがGemをインストールする
  8. GitHubActionsがJekyll(セーフモードOFF)でビルドする
  9. GitHubActionsがgh-pagesブランチへ生成物をプッシュする
  10. GitHubActionsが生成物をデプロイする
  11. GitHubPagesがブログを公開する

3. 自動化環境の高速化手順

3.1. キャッシュによるGemインストールの高速化

Gemのインストールを高速化するために変更した箇所を以下に示します。 また、 前回の記事 のワークフローをベースにしています。

.github/workflows/push-to-gh-pages-branch.yml

name: Push To gh-pages Branch

on:
  push:
    branches:
      - master # 2. GitHubActionsが`master`ブランチへのプッシュを検知する

jobs:
  deploy:
    runs-on: ubuntu-20.04

    concurrency:
      group: $ - $

    steps:
      # 3. GitHubActionsがタイムゾーンを設定する
      - name: Set Timezone
        uses: szenius/set-timezone@v1.0
        with:
          timezoneLinux: "Asia/Tokyo"

      # 4. GitHubActionsがリポジトリをチェックアウトする
      - name: Checkout Repository
        uses: actions/checkout@v2

+     # 5. GitHubActionsがGemをキャッシュに保存する
+     - name: Store Gem to Cache
+       uses: actions/cache@v2
+       with:
+         path: vendor/bundle
+         key: ${{ runner.os }}-gem-${{ hashFiles ('**/Gemfile.lock') }}
+         restore-keys: |
+           $-gem-

      # 6. GitHubActionsがRubyをセットアップする
      - name: Setup Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: 2.7

      # 7. GitHubActionsがGemをインストールする
      - name: Bundle Install According to Gemfile
        run: |
-         bundle install
+         bundle config path vendor/bundle
+         bundle install --jobs 4 --retry 3

      # 8. GitHubActionsがJekyll(セーフモードOFF)でビルドする
      - name: Jekyll Build
        run: |
          bundle exec jekyll build

      # 9. GitHubActionsが`gh-pages`ブランチへ生成物をプッシュする
      - name: Push to gh-pages Branch
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: $
          publish_branch: gh-pages
          publish_dir: ./_site
          force_orphan: true
          user_name: "github-actions[bot]"
          user_email: "github-actions[bot]@users.noreply.github.com"

3.1.1. 参考サイト

  1. actions/cache: Cache dependencies and build outputs in GitHub Actions
  2. GitHub ActionsでCacheを使ってみた | freks blog

4. 高速化の実行結果

Gemのインストールを高速化した前後でワークフローの処理時間は約1/2になりました。 また、Gemのインストールの処理時間に至っては1/12になりました。

4.1. 実行ログ(高速化前)

ワークフローの処理時間は31秒でGemのインストールは24秒でした。

GitHubActions_log

4.2. 実行ログ(高速化後)

ワークフローの処理時間は14秒でGemのインストールは2秒でした。

GitHubActions_log

5. 最後に

今回はGitHubActionsのワークフローにおけるGemのインストールをキャッシュにより高速化しました。

これで毎回無駄な処理により時間を浪費せずに済みます。