GitHub Actions 依存関係キャッシュを検証する

こんにちは。最近GitHub Actionsをいじりはじめた、「みやまえゆたか」です。

GitHub Actionsには依存関係をキャッシュする機能があります。 -> 依存関係をキャッシュしてワークフローのスピードを上げる - GitHub ヘルプ

キャッシュするとどれくらい効果があるのか? 検証してみました。

実験1(Java + Gradle)

cache/examples.md · GitHub にならってワークフローを記述します。

環境は「Java & Gradle」です。

検証に使ったプロジェクトのキャッシュサイズ~/.gradle/caches/は162Mでした。

name: TEST
 
on: [push]

jobs:
  test:
    
    runs-on: ubuntu-latest
    
    steps:
    - name: Checkout repository
      uses: actions/checkout@v2

    - name: Set up JDK
      uses: actions/setup-java@v1
      with:
        java-version: 11
   
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew

    # キャッシュする場合は以下を挿入
    - uses: actions/cache@v1
      with:
        path: ~/.gradle/caches
        key: ${{ runner.os }}-gradle-${{ hashFiles(‘**/*.gradle’) }}
        restore-keys: |
          ${{ runner.os }}-gradle-
    # ーーーーーーーーーーーーーーーー

    - name: Test with Gradle
      run: ./gradlew test

    - name: Caches size
      run: du -sh ~/.gradle/caches/

結果

キャッシュした場合と、しない場合。3回やってみます。

(※事前に1度実行し、キャッシュは生成済である)

1回目

  • キャッシュなし: 1m05s
  • キャッシュあり: 50s 🚀

2回目

  • キャッシュなし: 1m08s
  • キャッシュあり: 39s 🚀

3回目

  • キャッシュなし: 1m17s
  • キャッシュあり: 54s 🚀

「キャッシュする」 とパフォーマンスが上がるようです。

実験2 (Python + pip)

次の環境は「Python + pip」です。

requirements.txtには、pandas, numpy, urllib3などのライブラリを20個ほど記入しています。

キャッシュサイズ~/.cache/pip/は61Mでした。

name: TEST

on: [push]

jobs:
  build:
 
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2
 
    - name: Set up Python 3.8
      uses: actions/setup-python@v1
      with:
        python-version: 3.8

    - name: Upgrade pip
      run: python -m pip install —-upgrade pip

    # キャッシュする場合は以下を挿入
    - uses: actions/cache@v1
      with:
        path: ~/.cache/pip
        key: ${{ runner.os }}-pip-${{ hashFiles(‘**/requirements.txt’) }}
        restore-keys: |
          ${{ runner.os }}-pip-
    # ーーーーーーーーーーーーーーーー

    - name: Install dependencies
      run: pip install -r requirements.txt

    - name: Run python
      run: python test.py

    - name: Caches size
      run: du -sh ~/.cache/pip

test.pyにはprint(“test”)とだけ記述してあります。

結果

1回目

  • キャッシュなし: 34s 🚀
  • キャッシュあり: 54s

2回目

  • キャッシュなし: 37s 🚀
  • キャッシュあり: 49s

3回目

  • キャッシュなし: 45s 🚀
  • キャッシュあり: 1m02s

ブレはありますが、「キャッシュする」 とパフォーマンスが下がりました。

結論

プロジェクトによってキャッシュの効果がある場合と、むしろ逆効果な場合がありました。

よって、uses: actions/cacheを加筆したワークフローと、していないワークフローを用意し、どちらが早くなるかを検証してみると良いと思います!!

ASKUL Engineering BLOG

2021 © ASKUL Corporation. All rights reserved.