name: bun-linux
env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}
  TEST_TAG: bun-test'

on:
  push:
    branches: [main, bun-actions]
    paths:
      - "src/**/*"
      - "test/**/*"
      - "build.zig"
      - "Makefile"
      - "Dockerfile"
  pull_request:
    branches: [main]
    paths:
      - "src/**/*"
      - "test/**/*"
      - "build.zig"
      - "Makefile"
      - "Dockerfile"
  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

jobs:
  linux:
    name: ${{matrix.tag}}
    runs-on: ${{matrix.runner}}
    timeout-minutes: 90
    strategy:
      matrix:
        include:
          - cpu: haswell
            tag: linux-x64
            arch: x86_64
            build_arch: amd64
            runner: linux-amd64
            webkit_url: "https://github.com/oven-sh/WebKit/releases/download/oct8/bun-webkit-linux-amd64-lto.tar.gz"
            webkit_basename: "bun-webkit-linux-amd64-lto"
          - cpu: westmere
            tag: linux-x64-baseline
            arch: x86_64
            build_arch: amd64
            runner: linux-amd64
            webkit_url: "https://github.com/oven-sh/WebKit/releases/download/oct8/bun-webkit-linux-amd64-lto.tar.gz"
            webkit_basename: "bun-webkit-linux-amd64-lto"
          - cpu: native
            tag: linux-aarch64
            arch: aarch64
            build_arch: arm64
            runner: linux-arm64
            webkit_url: "https://github.com/oven-sh/WebKit/releases/download/oct8/bun-webkit-linux-arm64-lto.tar.gz"
            webkit_basename: "bun-webkit-linux-arm64-lto"

    steps:
      - uses: actions/checkout@v3
      - name: Checkout submodules
        run: git -c submodule."src/bun.js/WebKit".update=none submodule update --init --recursive --depth=1 --progress -j $(nproc)
      - uses: docker/setup-buildx-action@v2
        id: buildx
        with:
          install: true
      - name: Run
        run: |
          rm -rf ${{runner.temp}}/release
      - name: Login to GitHub Container Registry
        uses: docker/login-action@v2
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Build and push
        uses: docker/build-push-action@v3
        with:
          context: .
          push: false
          cache-from: type=gha
          cache-to: type=gha,mode=max
          build-args: |
            ARCH=${{matrix.arch}}
            BUILDARCH=${{matrix.build_arch}}
            CPU_TARGET=${{matrix.cpu}}
            WEBKIT_URL=${{matrix.webkit_url}}
            GIT_SHA=${{github.sha}}
            WEBKIT_BASENAME=${{matrix.webkit_basename}}
          platforms: linux/${{matrix.build_arch}}
          target: artifact
          outputs: type=local,dest=${{runner.temp}}/release
      - name: Zip
        run: |
          # if zip is not found
          if [ ! -x "$(command -v zip)" ]; then
            sudo apt-get update && sudo apt-get install -y zip --no-install-recommends
          fi

          if [ ! -x "$(command -v strip)" ]; then
            sudo apt-get update && sudo apt-get install -y binutils --no-install-recommends
          fi

          cd ${{runner.temp}}/release
          chmod +x bun-profile bun

          mkdir bun-${{matrix.tag}}-profile
          mkdir bun-${{matrix.tag}}

          strip bun

          mv bun-profile bun-${{matrix.tag}}-profile/bun-profile
          mv bun bun-${{matrix.tag}}/bun

          zip -r bun-${{matrix.tag}}-profile.zip bun-${{matrix.tag}}-profile
          zip -r bun-${{matrix.tag}}.zip bun-${{matrix.tag}}
      - uses: actions/upload-artifact@v3
        with:
          name: bun-${{matrix.tag}}-profile
          path: ${{runner.temp}}/release/bun-${{matrix.tag}}-profile.zip
      - uses: actions/upload-artifact@v3
        with:
          name: bun-${{matrix.tag}}
          path: ${{runner.temp}}/release/bun-${{matrix.tag}}.zip
      - name: Release
        id: release
        uses: softprops/action-gh-release@v1
        if: github.ref == 'refs/heads/main'
        with:
          prerelease: true
          generate_release_notes: true
          body: "This is the canary release of Bun that corresponds to the commit [${{ github.sha }}]"
          name: "Canary (${{github.sha}})"
          tag_name: "canary"
          files: |
            ${{runner.temp}}/release/bun-${{matrix.tag}}.zip
            ${{runner.temp}}/release/bun-${{matrix.tag}}-profile.zip
      - uses: actions/upload-artifact@v3
        with:
          name: bun-obj-${{matrix.tag}}
          path: ${{runner.temp}}/release/bun-obj
      - uses: actions/upload-artifact@v3
        with:
          name: ${{matrix.tag}}-dependencies
          path: ${{runner.temp}}/release/bun-dependencies
