name: Bob the Builder

on:
  push:
    branches:
      - main
  workflow_dispatch:

jobs:
  build:
    name: Build ${{ matrix.platform }} ${{ matrix.variant }}
    runs-on: ubuntu-latest
    strategy:
      matrix:
        platform: [aarch64, x86_64]
        variant: [netconf, classic]
      fail-fast: false
    steps:
      - name: Maintenance
        run: |
          docker image prune -af
          docker volume prune -f
          docker container prune -f
      - uses: actions/checkout@v4
      - name: Set Build Variables
        id: vars
        run: |
          if [ "${{ matrix.variant }}" = "netconf" ]; then
              target=${{ matrix.platform }}
          else
              target=${{ matrix.platform }}-${{ matrix.variant }}
          fi
          echo "dir=infix-$target"        >> $GITHUB_OUTPUT
          echo "tgz=infix-$target.tar.gz" >> $GITHUB_OUTPUT
          if [ "$target" = x86_64 ]; then
              echo "out=$PWD/output"      >> $GITHUB_OUTPUT
          else
              echo "out=/mnt/x-$target"   >> $GITHUB_OUTPUT
          fi
      - name: Restore Cache of dl/
        uses: actions/cache@v4
        with:
          path: dl/
          key: dl-${{ matrix.variant }}-${{ hashFiles('.git/modules/buildroot/HEAD', 'configs/*', 'package/*/*.hash') }}
          restore-keys: |
            dl-${{ matrix.variant }}-
            dl-
      - name: Restore Cache of .ccache/
        uses: actions/cache@v4
        with:
          path: .ccache/
          key: ccache-${{ matrix.platform }}-${{ hashFiles('.git/modules/buildroot/HEAD', 'package/*/*.hash') }}
          restore-keys: |
            ccache-${{ matrix.platform }}-
            ccache-
      - name: Configure & Build
        run: |
          if [ "${{ matrix.variant }}" = "netconf" ]; then
              target=${{ matrix.platform }}_defconfig
          else
              target=${{ matrix.platform }}_${{ matrix.variant }}_defconfig
          fi
          echo "Building $target ..."
          sudo mkdir ${{ steps.vars.outputs.out }}
          sudo chown $(id -un):$(id -gn) ${{ steps.vars.outputs.out }}
          export O=${{ steps.vars.outputs.out }}
          make $target
          make
      - name: Prepare Artifact
        run: |
          cd ${{ steps.vars.outputs.out }}
          mv images ${{ steps.vars.outputs.dir }}
          ln -s ${{ steps.vars.outputs.dir }} images
          tar chfz ${{ steps.vars.outputs.tgz }} ${{ steps.vars.outputs.dir }}
      - name: Test
        if: matrix.platform == 'x86_64' && matrix.variant == 'netconf'
        run: |
          export O=${{ steps.vars.outputs.out }}
          make test-qeneth
      - uses: actions/upload-artifact@v4
        with:
          path: ${{ steps.vars.outputs.out }}/${{ steps.vars.outputs.tgz }}
          name: artifact-${{ matrix.variant }}-${{ matrix.platform }}
  release:
    if: ${{github.repository_owner == 'kernelkit' && github.ref_name == 'main'}}
    name: Upload Latest Build
    needs: build
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - uses: actions/download-artifact@v4
        with:
          pattern: "artifact-*"
          merge-multiple: true
      - uses: ncipollo/release-action@v1
        with:
          allowUpdates: true
          omitName: true
          omitBody: true
          omitBodyDuringUpdate: true
          prerelease: true
          tag: "latest"
          token: ${{ secrets.GITHUB_TOKEN }}
          artifacts: "*.tar.gz"
      - name: Summary
        run: |
          cat <<EOF >> $GITHUB_STEP_SUMMARY
          # Latest Build Complete! :rocket:
          
          For the public download links of these build artifacts, please see:
           <https://github.com/kernelkit/infix/releases/tag/latest>
          EOF
