name: Go

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:

  build:
    runs-on: ubuntu-20.04 # explicitly use 20.04, see commit 428c40018a
    timeout-minutes: 30
    strategy:
      fail-fast: false
      matrix:
        go-version: ["1.21.x", "1.22.x"]
    steps:
    - uses: actions/checkout@v4
      with:
        fetch-depth: 0 # history/tags are needed for automatic version generation
        fetch-tags: true

    - name: Set up Go
      uses: actions/setup-go@v5
      with:
        go-version: ${{ matrix.go-version }}

    - name: Build
      run: |
        make cross qemu-wrapper vm win-gvproxy win-sshproxy
        mv bin/gvproxy.exe bin/gvproxy-windowsgui.exe

    - uses: actions/upload-artifact@v4
      if: matrix.go-version == '1.21.x'
      with:
        name: gvisor-tap-vsock-binaries
        path: bin/*

  tests:
    runs-on: ubuntu-latest # The runner must support nested virt
    needs: build # Don't bother testing if cross arch build fails
    timeout-minutes: 30
    steps:
    - uses: actions/checkout@v4

    - name: Install qemu
      run: |
        sudo apt install qemu-kvm
        sudo usermod -a -G kvm $USER

    - name: Set up Go
      uses: actions/setup-go@v5
      with:
        go-version-file: 'go.mod'

    - name: Test
      run: |
        sudo -s -u ${USER} bash -c 'make test'

    - uses: actions/upload-artifact@v4
      if: always()
      with:
        name: qcon
        path: test/qcon.log

  win-sshproxy-tests:
    runs-on: windows-latest # Only builds/runs on windows
    timeout-minutes: 30
    steps:
    - uses: actions/checkout@v4

    - name: Set up Go
      uses: actions/setup-go@v5
      with:
        go-version-file: 'go.mod'

    - name: Build
      run: make win-sshproxy

    - name: Test
      run: go test -v .\test-win-sshproxy


