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までやってくれる

deploy-pd.yaml
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 }}は一意。

deploy-pd.yaml
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をキャッシュするよう書いておけばキャッシュされる、と思われる

deploy-pd.yaml
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 }}

参考

  • SNSでシェアしよう
  • Twitterでシェア
  • FaceBookでシェア
  • Lineでシェア
  • 記事タイトルとURLをコピー
トップへ戻るボタン

\ HOME /

トップへ戻る