Skip to content

[fix] Improve targeted action logging and source validation #502

[fix] Improve targeted action logging and source validation

[fix] Improve targeted action logging and source validation #502

name: Pipeline PR push
permissions:
contents: read
pull-requests: write
on:
pull_request:
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
CLIENT_LOCAL_SETTINGS_JSON: ${{ secrets.CLIENT_LOCAL_SETTINGS_JSON }}
jobs:
sonarcloud:
needs: build-and-test
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Download test artifacts
uses: actions/download-artifact@v4
with:
pattern: PR-test-results-*
merge-multiple: true
path: ./TestResults
- name: Create Client config for build
shell: bash
run: |
mkdir -p src/ByteSync.Client
echo "$CLIENT_LOCAL_SETTINGS_JSON" > src/ByteSync.Client/local.settings.json
- name: Setup .NET 8 Environment
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- name: Install SonarScanner for .NET
run: |
dotnet tool install --global dotnet-sonarscanner
echo "$HOME/.dotnet/tools" >> $GITHUB_PATH
- name: SonarCloud Begin (prepare)
run: >
dotnet sonarscanner begin
/k:"POW-Software_ByteSync"
/o:"pow-software"
/d:sonar.host.url="https://sonarcloud.io"
/d:sonar.token="$SONAR_TOKEN"
/d:sonar.cs.opencover.reportsPaths="**/coverage.opencover.xml"
/d:sonar.cs.vstest.reportsPaths="**/*.trx"
- name: Build (no tests)
run: |
dotnet restore --locked-mode
dotnet clean --verbosity quiet
dotnet build --verbosity quiet -clp:ErrorsOnly /property:WarningLevel=0
- name: SonarCloud End (publish)
run: >
dotnet sonarscanner end
/d:sonar.token="$SONAR_TOKEN"
discover-tests:
runs-on: ubuntu-latest
outputs:
testProjects: ${{ steps.set-matrix.outputs.testProjects }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Find Test Projects
id: set-matrix
run: |
projects=$(find tests -name '*Tests.csproj' | jq -R -s -c 'split("\n") | map(select(length > 0))')
echo "Found test projects: $projects"
echo "testProjects=$projects" >> $GITHUB_OUTPUT
build-and-test:
needs: discover-tests
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
testProject: ${{ fromJson(needs.discover-tests.outputs.testProjects) }}
name: build-and-test (${{ matrix.os }} | ${{ matrix.testProject }})
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Cache NuGet packages
uses: actions/cache@v4
with:
path: ${{ matrix.os == 'windows-latest' && env.USERPROFILE || '~' }}/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/packages.lock.json') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Setup .NET 8 Environment
uses: actions/setup-dotnet@v4
with:
dotnet-version: '8.0.x'
- name: Create Config Files
shell: bash
env:
CLIENT_LOCAL_SETTINGS_JSON: ${{ secrets.CLIENT_LOCAL_SETTINGS_JSON }}
FUNCTIONS_INTEGRATION_TESTS_LOCAL_SETTINGS_JSON: ${{ secrets.FUNCTIONS_INTEGRATION_TESTS_LOCAL_SETTINGS_JSON }}
SERVER_COMMON_TESTS_LOCAL_SETTINGS: ${{ secrets.SERVER_COMMON_TESTS_LOCAL_SETTINGS }}
CLIENT_INTEGRATION_TESTS_LOCAL_SETTINGS_JSON: ${{ secrets.CLIENT_INTEGRATION_TESTS_LOCAL_SETTINGS_JSON }}
run: |
echo "$CLIENT_LOCAL_SETTINGS_JSON" > src/ByteSync.Client/local.settings.json
echo "$FUNCTIONS_INTEGRATION_TESTS_LOCAL_SETTINGS_JSON" > tests/ByteSync.Functions.IntegrationTests/functions-integration-tests.local.settings.json
echo "$SERVER_COMMON_TESTS_LOCAL_SETTINGS" > tests/ByteSync.ServerCommon.Tests/server-common-tests.local.settings.json
echo "$CLIENT_INTEGRATION_TESTS_LOCAL_SETTINGS_JSON" > tests/ByteSync.Client.IntegrationTests/client-integration-tests.local.settings.json
- run: dotnet restore --locked-mode
- run: dotnet clean --verbosity quiet
- run: dotnet build --verbosity quiet /property:WarningLevel=0
- name: Run Test Project
run: |
extra_filter=""
if [[ "${{ matrix.os }}" != "ubuntu-latest" ]]; then
extra_filter="--filter FullyQualifiedName!~E2E_Auth_Session_Tests"
fi
mkdir -p TestResults
project="${{ matrix.testProject }}"
safe_name=$(basename "$project" .csproj)
echo "Running test project: $project"
# Determine whether this is an IntegrationTests project
if [[ "$project" == *IntegrationTests* ]]; then
is_integration=true
else
is_integration=false
fi
if [[ "$is_integration" == "true" && "${{ matrix.os }}" == "macos-latest" ]]; then
# macOS IntegrationTests: run without coverage but with diagnostics to find hangs
dotnet test "$project" \
--no-restore \
--no-build \
$extra_filter \
--logger "trx;LogFileName=$safe_name.trx" \
--results-directory ./TestResults \
--blame-hang --blame-hang-timeout 5m --blame-hang-dump-type full \
--diag ./TestResults/vstest-$safe_name.log \
-- NUnit.NumberOfTestWorkers=1
elif [[ "$is_integration" == "true" ]]; then
# IntegrationTests on Linux/Windows: include coverage for Sonar
dotnet test "$project" \
--no-restore \
--no-build \
$extra_filter \
--logger "trx;LogFileName=$safe_name.trx" \
--results-directory ./TestResults \
--collect:"XPlat Code Coverage" \
-- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=opencover \
DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.OutputDirectory=./TestResults/${{ matrix.os }}/$safe_name
else
# UnitTests on all OS (including macOS): include coverage
dotnet test "$project" \
--no-restore \
--no-build \
$extra_filter \
--logger "trx;LogFileName=$safe_name.trx" \
--results-directory ./TestResults \
--collect:"XPlat Code Coverage" \
-- DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.Format=opencover \
DataCollectionRunSettings.DataCollectors.DataCollector.Configuration.OutputDirectory=./TestResults/${{ matrix.os }}/$safe_name
fi
shell: bash
- name: Upload Test Results
if: ${{ always() }}
uses: actions/upload-artifact@v4
with:
name: PR-test-results-${{ matrix.os }}-${{ hashFiles(matrix.testProject) }}
path: ./TestResults/
- name: Show Failed Tests
if: failure()
run: echo "Some tests failed. Check uploaded artifacts for detailed logs."