🏡 index : quine-global/hyper.git

name: 'Build Linux ARM'
description: 'Cross-compiles Hyper app for ARMv7l and ARM64 using arm-runner'
inputs:
  node-version:
    description: 'Node.js version to use'
    required: true
  matrix-name:
    description: 'Matrix name (arch)'
    required: true
  matrix-cpu:
    description: 'CPU architecture'
    required: true
  matrix-image:
    description: 'Base OS image for ARM emulation'
    required: true
  upload-artifact:
    description: 'Whether to upload artifacts'
    required: false
    default: 'true'
runs:
  using: 'composite'
  steps:
    - name: Checkout
      uses: actions/checkout@v6.0.2

    - name: Use Node.js
      uses: actions/setup-node@v6.4.0
      with:
        node-version: ${{ inputs.node-version }}

    - name: Enable pnpm
      uses: pnpm/action-setup@v4

    - name: Set up Python 3.10
      uses: actions/setup-python@v6.2.0
      with:
        python-version: '3.10'

    - name: Fix node-gyp and Python
      shell: bash
      run: |
        python3 -m pip install packaging setuptools

    - name: Get pnpm store directory path
      shell: bash
      id: pnpm-store-dir-path
      run: echo "dir=$(pnpm store path --silent)" >> $GITHUB_OUTPUT

    - uses: actions/cache/restore@v5.0.5
      with:
        path: ${{ steps.pnpm-store-dir-path.outputs.dir }}
        key: ${{ runner.os }}-pnpm-store-${{ hashFiles('pnpm-lock.yaml', 'app/pnpm-lock.yaml') }}
        restore-keys: |
          ${{ runner.os }}-pnpm-store-

    - name: Delete old electron headers
      # These can sometimes be present on a freshly-provisioned github runner, so remove them
      shell: bash
      run: |
        rm -rf ~/.electron-gyp || true

    - name: Install dependencies and tools
      shell: bash
      run: |
        pnpm install --frozen-lockfile
        sudo apt update
        sudo apt install libarchive-tools

    - name: Install Flatpak build tools
      # Flathub's Electron BaseApp runtime only ships x86_64/aarch64 builds, so
      # skip this on armv7l.
      if: ${{ inputs.matrix-name == 'arm64' }}
      shell: bash
      run: |
        sudo apt install -y flatpak flatpak-builder
        flatpak remote-add --user --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

    - name: Cache Flatpak runtimes
      if: ${{ inputs.matrix-name == 'arm64' }}
      uses: actions/cache@v5.0.5
      with:
        path: ~/.local/share/flatpak
        key: flatpak-runtimes-${{ runner.os }}-arm64-25.08

    - name: Rebuild node-pty and all native modules for ARM
      uses: pguyot/arm-runner-action@v2.6.5
      with:
        image_additional_mb: 2000
        base_image: ${{ inputs.matrix-image }}
        cpu: ${{ inputs.matrix-cpu }}
        shell: bash
        copy_artifact_path: target
        copy_artifact_dest: target
        commands: |
          # Install Python distutils in the ARM container
          sudo apt-get update
          sudo apt-get install -y python3-pip python3-setuptools python3-dev
          pip3 install setuptools --break-system-packages || pip3 install setuptools

          cd target
          wget https://nodejs.org/dist/v22.11.0/node-v22.11.0-linux-${{ inputs.matrix-name }}.tar.xz
          tar -xJf node-v22.11.0-linux-${{ inputs.matrix-name }}.tar.xz
          sudo cp node-v22.11.0-linux-${{ inputs.matrix-name }}/* /usr/local/ -R
          rm -rf node-v22.11.0-linux-${{ inputs.matrix-name }}.tar.xz node-v22.11.0-linux-${{ inputs.matrix-name }}

          cd ..
          npm install -g pnpm@10.33.0
          pnpm run rebuild-node-pty

          cd target
          npx electron-rebuild

    - name: Compile
      shell: bash
      run: pnpm run build

    - name: Chown rebuilt node_modules
      shell: bash
      run: |
        sudo chown -R $USER:$USER target/node_modules

    - name: Prepare v8 snapshot (only armv7l)
      if: ${{ inputs.matrix-name == 'armv7l' }}
      shell: bash
      run: |
        sudo dpkg --add-architecture i386
        sudo apt update
        sudo apt install -y libglib2.0-0:i386 libexpat1:i386 libgcc-s1:i386
        SNAPSHOT_TARGET_ARCH=armv7l pnpm run v8-snapshot:arch

    - name: Build final Electron App for ARM
      shell: bash
      run: |
        TARGETS="deb rpm AppImage pacman"
        if [ "${{ inputs.matrix-name }}" = "arm64" ]; then
          TARGETS="$TARGETS flatpak"
        fi
        pnpm exec electron-builder -p never -l $TARGETS --${{ inputs.matrix-name }} -c electron-builder-linux-ci.json
      env:
        GH_TOKEN: ${{ env.GH_TOKEN }}

    - name: Archive Build Artifacts
      if: ${{ inputs.upload-artifact == 'true' }}
      uses: actions/upload-artifact@v7.0.1
      with:
        name: hyper-linux-${{ inputs.matrix-name }}
        path: |
          dist/*.snap
          dist/*.AppImage
          dist/*.deb
          dist/*.rpm
          dist/*.pacman
          dist/*.flatpak

    - uses: actions/cache/save@v5.0.5
      if: github.event_name != 'pull_request'
      with:
        path: ${{ steps.pnpm-store-dir-path.outputs.dir }}
        key: ${{ runner.os }}-pnpm-store-${{ hashFiles('pnpm-lock.yaml', 'app/pnpm-lock.yaml') }}

#    - name: Run E2E Tests on Linux
#      if: runner.os == 'Linux'
#      shell: bash
#      run: xvfb-run -a pnpm run test