APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

GitHub Actions利用時のnpm ciの時間を短縮する

はじめに

以前 「Azure Pipelines利用時のnpm ciの時間を短縮する」という投稿で、Azure Pipelinesでのビルド成果物のキャッシュをご紹介しました。

今回は同様のことをGitHub Actionsで行ってみたいと思います。

キャッシュを活用する

npmのキャッシュ

早速指定をしてみたいと思います。 今回利用するのはAngularプロジェクト。

もともとの GitHub Actionsの指定は次のようなものです。

jobs:
  build:
    name: build angular
    runs-on: ubuntu-latest

    steps:
    - name: Checkout repo
      uses: actions/checkout@v3
      with:
        fetch-depth: 0
    - name: Use Node.js
      uses: actions/setup-node@v3
      with:
        node-version: 16
    - run: npm ci 
    - run: npm run lint
    - run: npm run build

これに npm用のキャッシュを追加するわけですが、実はとても、非常に、簡単です。 なぜならば、すでにそのような仕組みが actions/setup-node に用意されているから!! ( Node.jsのビルドとテスト#依存関係のキャッシングの例 ) やるべきことは cache: 'npm' という指定を追加するだけ(npmを利用している前提です)

jobs:
  build:
    name: build angular
    runs-on: ubuntu-latest

    steps:
    - name: Checkout repo
      uses: actions/checkout@v3
      with:
        fetch-depth: 0
    - name: Use Node.js
      uses: actions/setup-node@v3
      with:
        node-version: 16
        cache: npm                   # <------------ この行を追加
    - run: npm ci 
    - run: npm run lint
    - run: npm run build

これだけでキャッシュが有効になり、導入前は 35秒前後かかっていた npm ciの部分がキャッシュが有効になる場合は 15秒前後に短縮されます。

Angularのキャッシュを有効にする

これだけでは終わりません。実はもう1つキャッシュを有効にできる部分があります。それはAngularのビルド実行時のキャッシュです。(今回ご紹介するやり方はAngular v14が対象です。)

Angularのビルドですが、これがわりと時間のかかる処理となっています。そうした時間のかかる部分を改善するためにAngularではビルド時のキャッシュ機能を提供しています。v14ではng cache で紹介されている通りの内容です。

今回はこれを有効にします。github actionsで特定のフォルダをキャッシュするには actions/cache を利用します。

jobs:
  build:
    name: build angular
    runs-on: ubuntu-latest

    steps:
    - name: Checkout repo
      uses: actions/checkout@v3
      with:
        fetch-depth: 0
    - name: Use Node.js
      uses: actions/setup-node@v3
      with:
        node-version: 16
        cache: npm
    # Angular 用のキャッシュ指定ここから
    - name: Cache angular build
      uses: actions/cache@v3
      with:
        path: .angular/cache
        key: angular-${{ runner.os }}-${{ hashFiles('package-lock.json') }}
    # Angular 用のキャッシュ指定ここまで
    - run: npm ci 
    - run: npm run lint
    - run: npm run build

指定する内容はAzure Pipelinesのときと似た内容になります。

結果

2つのキャッシュを設定した場合の結果は以下のとおりです

対象 キャッシュ無効 キャッシュヒット
npm i 35秒前後 15秒前後
Angular ビルド 45秒前後 15 秒前後

今回対象となったAngularプロジェクトはまだ新規作成して間がなく、機能もそれほど組み込まれていません。 それでも合計すると30秒程度短縮可能です。機能が増えていくとAngularビルドがキャッシュがない場合には数分かかるようになります。 そうなってくるとキャッシュの効果も大きくなります。

こうした簡単で小さなことでも積み重ねると大きな差となります。ビルドのように繰り返し何度も実行されるものであればなおさらです。 せっかく用意されている機能ですから徹底的に活用していきましょう。