目次
1. 初めに
前回の記事 ではCI/CDツールであるGitHubActionsを用いてビルドやプッシュを自動化する環境を構築しました。
しかし、Gemをインストールする処理は他のステップに比べて処理時間が約10倍もかかっていました。 実行する度に約30個のGemを毎回最初からインストールしていたためです。
この問題を解決するため、キャッシュによりGemのインストールを高速化した結果、ワークフローの処理時間が約1/2になりました。 今回はその手順と実行結果をまとめました。
2. ブログ公開までのワークフロー
まず、このブログが公開されるまでのワークフローを高速化前と高速化後でまとめました。 ★の記載された行が変更箇所です。
2.1. 高速化前
- ユーザが
master
ブランチへ資産をプッシュする - GitHubActionsが
master
ブランチへのプッシュを検知する - GitHubActionsがタイムゾーンを設定する
- GitHubActionsがリポジトリをチェックアウトする
- GitHubActionsがRubyをセットアップする
- (★)GitHubActionsがGemをインストールする
- GitHubActionsがJekyll(セーフモードOFF)でビルドする
- GitHubActionsが
gh-pages
ブランチへ生成物をプッシュする - GitHubActionsが生成物をデプロイする
- GitHubPagesがブログを公開する
2.2. 高速化後
- ユーザが
master
ブランチへ資産をプッシュする - GitHubActionsが
master
ブランチへのプッシュを検知する - GitHubActionsがタイムゾーンを設定する
- GitHubActionsがリポジトリをチェックアウトする
- (★)GitHubActionsがGemをキャッシュに保存する
- GitHubActionsがRubyをセットアップする
- (★)GitHubActionsがGemをインストールする
- GitHubActionsがJekyll(セーフモードOFF)でビルドする
- GitHubActionsが
gh-pages
ブランチへ生成物をプッシュする - GitHubActionsが生成物をデプロイする
- 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. 参考サイト
- actions/cache: Cache dependencies and build outputs in GitHub Actions
- GitHub ActionsでCacheを使ってみた | freks blog
4. 高速化の実行結果
Gemのインストールを高速化した前後でワークフローの処理時間は約1/2になりました。 また、Gemのインストールの処理時間に至っては1/12になりました。
4.1. 実行ログ(高速化前)
ワークフローの処理時間は31秒でGemのインストールは24秒でした。
4.2. 実行ログ(高速化後)
ワークフローの処理時間は14秒でGemのインストールは2秒でした。
5. 最後に
今回はGitHubActionsのワークフローにおけるGemのインストールをキャッシュにより高速化しました。
これで毎回無駄な処理により時間を浪費せずに済みます。