🥟

BunをCI(GitHub Actions)で使ってみた

2023/09/14に公開

はじめに

Bun 1.0がリリースされましたね。
https://bun.sh/blog/bun-v1.0

とはいえNode.jsやnpmなどから移行するのはまだまだ非現実的だし現状使い道がなさそうだなぁと思っていたところ、Xで以下のような投稿を見かけました。
https://twitter.com/yusukebe/status/1701156407641555340?s=20

確かにCIでdevDependenciesにしか依存していないLintやテストなどであれば使えそうだなぁと思ったので、使ってみることにしました。

Bunについて

BunはJavaScriptとTypeScriptのアプリケーション向けのオールインワンのツールキットです。

その核となるのがBunランタイムで、Node.jsのドロップインの代替品として設計された高速なJavaScritランタイムです。Zigで書かれていて、JavaScriptCoreで動き、起動時間とメモリ使用量を劇的に削減します。

さらにランタイム以外にも以下の機能が実装されており、いずれも既存のツールより大幅に高速で、既存のNode.jsプロジェクトでほとんど変更する必要なく使用できます。

  • スクリプトランナー
  • パッケージマネージャー
  • バンドラー
  • テストランナー
  • パッケージランナー

https://bun.sh/docs

BunをGitHub Actionsで使用する

BunをGitHub Actionsで使用する場合、oven-sh/setup-bunというactionが公式から提供されています。
https://github.com/oven-sh/setup-bun

以下はワークフローの一例です。

.github/workflows/example.yml
name: Example

on: pull_request

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Setup Bun
        uses: oven-sh/setup-bun@v1

      - name: Install dependencies
        run: bun install

      - name: Run lint
        run: bun run lint

https://bun.sh/guides/runtime/cicd

CIの速度改善について

条件

共通

  • dependencies + devDependencies: 約30

Before

  • ランタイム:Node.js 18系
  • パッケージマネージャー:pnpm 8系

After

  • ランタイム:Bun 1系
  • パッケージマネージャー:Bun 1系

結果

Before

  • パッケージインストールにかかった時間:11.6s
  • ジョブ全体にかかった時間:28s

After

  • パッケージインストールにかかった時間:4.18s(約64%減)
  • ジョブ全体にかかった時間:22s(約21.5%減)

おわりに

BunをCI(GitHub Actions)で使ってみましたが、思っていたよりも簡単に導入することができました。

試したリポジトリが小規模だったので、CIの速度改善の影響は軽微でしたが、特にパッケージインストールにかかった時間は大幅に削減されており、中・大規模のリポジトリでは大きな影響があるのではないでしょうか。

Discussion