1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

GitHub Actions - キャッシュ

Posted at

内容

GitHub Actionsでのキャッシュの使用方法について記載する

キャッシュは、処理上で使用するパッケージの再利用によってWorkflowの高速化や、
Job間でファイルの受け渡し等に利用できる

actions/cacheは、actions/cache1個でキャッシュのsave/restoreする方法と、
actions/cache/save, actions/cache/restoreでキャッシュのsave/restoreする方法がある

actions/cacheは、actions/cacheを実行したJob終了時にキャッシュがsaveされ、actions/cache実行タイミングでrestoreされる
actions/cache/save, actions/cache/restoreは、それぞれを実行したタイミングでsave/restoreされる

設計

キャッシュする際のパラメータpath, keyについての検討事項

path

インストールした依存パッケージをキャッシュする場合、
CI/CDでnpm ciする際は ~/.npm をキャッシュしようで記載されているように、
node_modulesがキャッシュされている場合にnpm ciを実行するとnode_modulesが作り直されるためキャッシュの意味がなくなってしまうことがある
これに対して上記記事通り、~/.npmをキャッシュするようにするか、
cache-hitを使用して、キャッシュが存在する場合にインストールstepをスキップする対処が考えられる

key

ドキュメントにあるようにkeyに ${{ runner.os }}-${{ hashFiles('**/package-lock.json') }} を使用することで、
インストールしたパッケージの依存関係(package-lock.json)に変化があった場合にキャッシュを更新することができる

依存パッケージ云々とは関係なく、job間でファイルを受け渡したい場合等は、
${{ github.sha }}でworkflow実行時のコミットごとにキャッシュを更新する等が考えられる

実装例(依存パッケージキャッシュ)

ドキュメントにある通り、
まずキャッシュをrestoreして、キャッシュが存在すればキャッシュを使用し、
存在しなければ依存パッケージインストールを行うのが一般的と思われる
キャッシュが存在する場合に、cache-hitで判定してパッケージインストールをスキップすることができるが、
インストール済パッケージのインストールは即終了するはずなので実行してしまってもそれほど問題はないはず

以下、Node.js、Pythonの依存パッケージをインストールしてキャッシュする例
キャッシュした依存パッケージを複数jobで使用するようなケースを想定して、
キャッシュsave用のjobと、キャッシュをrestoreして使用するjobで分けている

jobs:
  cache_env:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4
  
      - name: Setup Node
        uses: actions/setup-node@v4
        with:
        node-version-file: 'package.json'
        cache: npm
  
      - name: Install Dependency For Node
        shell: bash
        working-directory: ./
        run: |
          npm install -g npm@9.X
          npm ci
  
      - name: Setup Python
        uses: actions/setup-python@v5
        with:
        python-version-file: '.python-version'
  
      - name: Install poetry
        uses: snok/install-poetry@v1
  
      - name: Install Dependency For Python
        shell: bash
        working-directory: ./
        run: |
          poetry lock --no-update
          poetry install --no-interaction
  
      - name: Cache Save
        uses: actions/cache/save@v4
        with:
        path: |
            node_modules
            .venv
        key: ${{ github.sha }}

  restore_env_job_1:
    needs: [cache_env]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
        node-version-file: 'package.json'
        cache: npm

      - name: Setup Python
        uses: actions/setup-python@v5
        with:
        python-version-file: '.python-version'
  
      - name: Install poetry
        uses: snok/install-poetry@v1

      - name: Restore Env
        uses: actions/cache/restore@v4
        with:
          path: |
            node_modules
            .venv
          key: ${{ github.sha }}

参考

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?