name: Build

on:
  - push
  - pull_request
  - workflow_dispatch

jobs:
  Linux:
    runs-on: ubuntu-24.04
    steps:
    - name: Checkout
      uses: actions/checkout@v4
      with:
        fetch-depth: 0 # needed for Nerdbank.GitVersioning

    - name: Setup .NET
      uses: actions/setup-dotnet@v4

    - name: Build Unit Tests .NET
      run: dotnet build -f net9.0 test/Renci.SshNet.Tests/

    - name: Build IntegrationTests .NET
      run: dotnet build -f net9.0 test/Renci.SshNet.IntegrationTests/

    - name: Run Unit Tests .NET
      run: |
        dotnet test \
          -f net9.0 \
          --no-build \
          --logger "console;verbosity=normal" \
          --logger GitHubActions \
          -p:CollectCoverage=true \
          -p:CoverletOutputFormat=cobertura \
          -p:CoverletOutput=../../coverlet/linux_unit_test_net_9_coverage.xml \
          test/Renci.SshNet.Tests/

    - name: Run Integration Tests .NET
      run: |
        dotnet test \
          -f net9.0 \
          --no-build \
          --logger "console;verbosity=normal" \
          --logger GitHubActions \
          -p:CollectCoverage=true \
          -p:CoverletOutputFormat=cobertura \
          -p:CoverletOutput=../../coverlet/linux_integration_test_net_9_coverage.xml \
          test/Renci.SshNet.IntegrationTests/

    - name: Archive Coverlet Results
      uses: actions/upload-artifact@v4
      with:
          name: Coverlet Results Linux
          path: coverlet

  Windows:
    runs-on: windows-2025
    steps:
    - name: Checkout
      uses: actions/checkout@v4
      with:
        fetch-depth: 0 # needed for Nerdbank.GitVersioning

    - name: Setup .NET
      uses: actions/setup-dotnet@v4

    - name: Build Solution
      run: dotnet build Renci.SshNet.sln

    - name: Publish AOT Compatibility Test App
      run: dotnet publish -r win-x64 /warnaserror test/Renci.SshNet.AotCompatibilityTestApp/

    - name: Create NuGet Package
      run: dotnet pack

    - name: Archive NuGet Package
      uses: actions/upload-artifact@v4
      with:
        name: NuGet Package
        path: src/Renci.SshNet/bin/Release/*.*nupkg

    - name: Run Unit Tests .NET
      run: |
        dotnet test `
          -f net9.0 `
          --no-build `
          --logger "console;verbosity=normal" `
          --logger GitHubActions `
          -p:CollectCoverage=true `
          -p:CoverletOutputFormat=cobertura `
          -p:CoverletOutput=../../coverlet/windows_unit_test_net_9_coverage.xml `
          test/Renci.SshNet.Tests/

    - name: Run Unit Tests .NET Framework
      run: |
        dotnet test `
          -f net462 `
          --no-build `
          --logger "console;verbosity=normal" `
          --logger GitHubActions `
          -p:CollectCoverage=true `
          -p:CoverletOutputFormat=cobertura `
          -p:CoverletOutput=../../coverlet/windows_unit_test_net_4_6_2_coverage.xml `
          test/Renci.SshNet.Tests/

  Windows-Integration-Tests:
    name: Windows Integration Tests
    runs-on: windows-2025
    steps:
    - name: Checkout
      uses: actions/checkout@v4
      with:
        fetch-depth: 0 # needed for Nerdbank.GitVersioning

    - name: Setup .NET
      uses: actions/setup-dotnet@v4

    - name: Setup WSL2
      uses: Vampire/setup-wsl@f40fb59d850112c9a292b0218bca8271305b9127 # v5.0.0
      with:
        distribution: Ubuntu-24.04

    - name: Setup SSH Server
      shell: wsl-bash {0}
      run: |
        apt-get update && apt-get upgrade -y
        apt-get install -y podman
        podman build -t renci-ssh-tests-server-image -f test/Renci.SshNet.IntegrationTests/Dockerfile test/Renci.SshNet.IntegrationTests/
        podman run --rm -h renci-ssh-tests-server -d -p 2222:22 renci-ssh-tests-server-image

    - name: Run Integration Tests .NET Framework
      run:
        dotnet test `
          -f net48 `
          --logger "console;verbosity=normal" `
          --logger GitHubActions `
          -p:CollectCoverage=true `
          -p:CoverletOutputFormat=cobertura `
          -p:CoverletOutput=..\..\coverlet\windows_integration_test_net_4_8_coverage.xml `
          test\Renci.SshNet.IntegrationTests\

    - name: Archive Coverlet Results
      uses: actions/upload-artifact@v4
      with:
        name: Coverlet Results Windows
        path: coverlet

  Publish:
    runs-on: ubuntu-24.04
    if: github.ref == 'refs/heads/develop'
    permissions:
      packages: write
    needs:
      - Windows
      - Linux
    steps:
      - name: Download NuGet Package
        uses: actions/download-artifact@v4
        with:
          name: NuGet Package

      - name: Publish to GitHub NuGet Registry
        run: |
          dotnet nuget add source \
            --username $GITHUB_ACTOR \
            --password ${{ secrets.GITHUB_TOKEN }} \
            --store-password-in-clear-text \
            --name github \
            "https://nuget.pkg.github.com/$GITHUB_REPOSITORY_OWNER/index.json"
          dotnet nuget push "*.nupkg" \
            --source github \
            --api-key ${{ secrets.GITHUB_TOKEN }}
