GitHubActionsでnode_modulesのキャッシュを削除する
3分目次
ORMにPrismaを使用しているExpress製APIをAppEngineにGitHubActionsでデプロイしてたのだがワケわからんエラーに遭遇。
Prismaは./prisma/schema.prisma
のファイルをどこかのタイミングで./node_modules/.prisma/client/schema.prisma
にコピーしてるぽくて、モデルを変更した際に、キャッシュされた方の古い./node_modules/.prisma/client/schema.prisma
がAppEngineにデプロイされてた模様。
GitHubActions、無料枠2000分だから自動でキャッシュしてくれてたのはありがたいのだけどこういうエラーもあるのかぁ〜と。
結論
キャッシュを削除する方法はない
ので、キャッシュのキー一覧?に存在しないキーを与えて、新しいキーとして処理させる
問題コード
ほぼあちこちからコピペしたやつ
mainブランチへのコミットがあったらbuild→deployまでやってくれる
name: production
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x]
steps:
- name: Node${{ matrix.node-version }}でビルド
uses: actions/checkout@v2
- name: Nodeセットアップ
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
- run: npm ci
- run: npm run build
- name: AppEngineにデプロイ
uses: google-github-actions/deploy-appengine@v0.3.1
with:
project_id: ${{ secrets.GCP_PROJECT_ID }}
deliverables: app.yaml
credentials: ${{ secrets.GCP_SA_KEY }}
version: ${{ github.run_id }}
解決方法
👇 キャッシュのキーの部分を変更する。
key: ${{ runner.os }}-build-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
このキーにキャッシュ一覧?に存在しないキーを与えれば新しいキーとして処理されるよう。
今回は毎度キャッシュしないでいいので、${{ github.run_id }}
を加えることにした。
${{ github.run_id }}
は一意。
name: production
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x]
steps:
- name: Node${{ matrix.node-version }}でビルド
uses: actions/checkout@v2
- name: Nodeセットアップ
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
- name: node_modulesをキャッシュしない
uses: actions/cache@v2
env:
cache-name: cache-node-modules
with:
path: ~/.npm
key: ${{ runner.os }}-build-${{ github.run_id }}-${{ env.cache-name }}-${{ hashFiles('**/package-lock.json') }}
- run: npm install
- run: npm run build
- name: AppEngineにデプロイ
uses: google-github-actions/deploy-appengine@v0.3.1
with:
project_id: ${{ secrets.GCP_PROJECT_ID }}
deliverables: app.yaml
credentials: ${{ secrets.GCP_SA_KEY }}
version: ${{ github.run_id }}
余談だけどactions/cache@v2
のくだりはキーを明示的にするためにわざわざ書いたけど、今回の趣旨とは逆に依存関係をキャッシュしたいときは長ったらしくactions/cache@v2
を使わずともsetupの段階でnpmをキャッシュするよう書いておけばキャッシュされる、と思われる
name: production
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [14.x]
steps:
- name: Node${{ matrix.node-version }}でビルド
uses: actions/checkout@v2
- name: Nodeセットアップ
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
cache: 'npm' # ここ
- run: npm ci
- run: npm run build
- name: AppEngineにデプロイ
uses: google-github-actions/deploy-appengine@v0.3.1
with:
project_id: ${{ secrets.GCP_PROJECT_ID }}
deliverables: app.yaml
credentials: ${{ secrets.GCP_SA_KEY }}
version: ${{ github.run_id }}