name: "Setup Bun" description: "Setup Bun with caching and install dependencies" inputs: cross-compile: description: "Pre-cache canary cross-compile binaries for all targets" required: false default: "false" runs: using: "composite" steps: - name: Cache Bun dependencies uses: actions/cache@v4 with: path: ~/.bun/install/cache key: ${{ runner.os }}-bun-${{ hashFiles('**/bun.lockb') }} restore-keys: | ${{ runner.os }}-bun- - name: Get baseline download URL id: bun-url shell: bash run: | if [ "$RUNNER_ARCH" = "X64" ]; then case "$RUNNER_OS" in macOS) OS=darwin ;; Linux) OS=linux ;; Windows) OS=windows ;; esac echo "url=https://github.com/oven-sh/bun/releases/download/canary/bun-${OS}-x64-baseline.zip" >> "$GITHUB_OUTPUT" fi - name: Setup Bun uses: oven-sh/setup-bun@v2 with: bun-version-file: ${{ !steps.bun-url.outputs.url && 'package.json' || '' }} bun-download-url: ${{ steps.bun-url.outputs.url }} - name: Pre-cache canary cross-compile binaries if: inputs.cross-compile == 'true' shell: bash run: | BUN_VERSION=$(bun --revision) if echo "$BUN_VERSION" | grep -q "canary"; then SEMVER=$(echo "$BUN_VERSION" | sed 's/^\([0-9]*\.[0-9]*\.[0-9]*\).*/\1/') echo "Bun version: $BUN_VERSION (semver: $SEMVER)" CACHE_DIR="$HOME/.bun/install/cache" mkdir -p "$CACHE_DIR" TMP_DIR=$(mktemp -d) for TARGET in linux-aarch64 linux-x64 linux-x64-baseline linux-aarch64-musl linux-x64-musl linux-x64-musl-baseline darwin-aarch64 darwin-x64 windows-x64 windows-x64-baseline; do DEST="$CACHE_DIR/bun-${TARGET}-v${SEMVER}" if [ -f "$DEST" ]; then echo "Already cached: $DEST" continue fi URL="https://github.com/oven-sh/bun/releases/download/canary/bun-${TARGET}.zip" echo "Downloading $TARGET from $URL" if curl -sfL -o "$TMP_DIR/bun.zip" "$URL"; then unzip -qo "$TMP_DIR/bun.zip" -d "$TMP_DIR" if echo "$TARGET" | grep -q "windows"; then BIN_NAME="bun.exe" else BIN_NAME="bun" fi mv "$TMP_DIR/bun-${TARGET}/$BIN_NAME" "$DEST" chmod +x "$DEST" rm -rf "$TMP_DIR/bun-${TARGET}" "$TMP_DIR/bun.zip" echo "Cached: $DEST" # baseline bun resolves "bun-darwin-x64" to the baseline cache key # so copy the modern binary there too if [ "$TARGET" = "darwin-x64" ]; then BASELINE_DEST="$CACHE_DIR/bun-darwin-x64-baseline-v${SEMVER}" if [ ! -f "$BASELINE_DEST" ]; then cp "$DEST" "$BASELINE_DEST" echo "Cached (baseline alias): $BASELINE_DEST" fi fi else echo "Skipped: $TARGET (not available)" fi done rm -rf "$TMP_DIR" else echo "Not a canary build ($BUN_VERSION), skipping pre-cache" fi - name: Install dependencies run: bun install shell: bash