Skip to content

fix(tests): add missing columns to ScheduledMessages schema for MySQL… #408

fix(tests): add missing columns to ScheduledMessages schema for MySQL…

fix(tests): add missing columns to ScheduledMessages schema for MySQL… #408

Workflow file for this run

name: SonarCloud Analysis
on:
push:
branches: [main]
pull_request:
types: [opened, synchronize, reopened]
workflow_dispatch:
env:
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
DOTNET_NOLOGO: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
jobs:
# Build job - shared by coverage and analysis
build:
name: Build
runs-on: ubuntu-latest
timeout-minutes: 15
permissions:
contents: read
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- uses: actions/setup-dotnet@v5
with:
dotnet-version: 10.0.x
- name: Cache NuGet packages
uses: actions/cache@v5
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/Directory.Packages.props') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Restore and Build
run: |
dotnet restore Encina.slnx
dotnet build Encina.slnx --configuration Release --no-restore
- name: Upload build artifacts
uses: actions/upload-artifact@v6
with:
name: build-output
path: |
**/bin/Release/**
**/obj/**/*.assets.json
retention-days: 1
# Coverage collection - parallel shards (same as CI for full coverage)
coverage:
name: Coverage (${{ matrix.shard.name }})
needs: build
runs-on: ubuntu-latest
timeout-minutes: 20
permissions:
contents: read
strategy:
fail-fast: false
matrix:
shard:
- name: Testing
filter: "FullyQualifiedName~Encina.UnitTests.Testing"
- name: Messaging
filter: "FullyQualifiedName~Encina.UnitTests.Messaging|FullyQualifiedName~Encina.UnitTests.Caching"
- name: Data
filter: "FullyQualifiedName~Encina.UnitTests.EntityFrameworkCore|FullyQualifiedName~Encina.UnitTests.Dapper|FullyQualifiedName~Encina.UnitTests.ADO|FullyQualifiedName~Encina.UnitTests.MongoDB|FullyQualifiedName~Encina.UnitTests.Marten"
- name: Cloud
filter: "FullyQualifiedName~Encina.UnitTests.AzureFunctions|FullyQualifiedName~Encina.UnitTests.AzureServiceBus|FullyQualifiedName~Encina.UnitTests.Polly|FullyQualifiedName~Encina.UnitTests.AwsLambda|FullyQualifiedName~Encina.UnitTests.Aspire|FullyQualifiedName~Encina.UnitTests.OpenTelemetry"
- name: Remaining
filter: "FullyQualifiedName~Encina.UnitTests.Core|FullyQualifiedName~Encina.UnitTests.DomainModeling|FullyQualifiedName~Encina.UnitTests.AspNetCore|FullyQualifiedName~Encina.UnitTests.gRPC|FullyQualifiedName~Encina.UnitTests.SignalR|FullyQualifiedName~Encina.UnitTests.GuardClauses|FullyQualifiedName~Encina.UnitTests.MQTT|FullyQualifiedName~Encina.UnitTests.NATS|FullyQualifiedName~Encina.UnitTests.RabbitMQ|FullyQualifiedName~Encina.UnitTests.AmazonSQS|FullyQualifiedName~Encina.UnitTests.Kafka|FullyQualifiedName~Encina.UnitTests.Workflows|FullyQualifiedName~Encina.UnitTests.MiniValidator|FullyQualifiedName~Encina.UnitTests.FluentValidation|FullyQualifiedName~Encina.UnitTests.DataAnnotations|FullyQualifiedName~Encina.UnitTests.Quartz|FullyQualifiedName~Encina.UnitTests.Hangfire|FullyQualifiedName~Encina.UnitTests.Extensions|FullyQualifiedName~Encina.UnitTests.Refit|FullyQualifiedName~Encina.UnitTests.Cli"
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- uses: actions/setup-dotnet@v5
with:
dotnet-version: 10.0.x
- name: Cache NuGet packages
uses: actions/cache@v5
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/Directory.Packages.props') }}
restore-keys: |
${{ runner.os }}-nuget-
- uses: actions/download-artifact@v7
with:
name: build-output
- name: Restore test dependencies
run: dotnet restore tests/Encina.UnitTests/Encina.UnitTests.csproj
- name: Run tests with coverage
run: |
dotnet test tests/Encina.UnitTests/Encina.UnitTests.csproj \
--no-build -c Release \
--filter "${{ matrix.shard.filter }}" \
--collect:"XPlat Code Coverage" \
--settings coverlet.runsettings \
--results-directory artifacts/coverage \
--logger "console;verbosity=minimal"
continue-on-error: true
- name: List coverage files
run: find artifacts -name "*.xml" -type f 2>/dev/null || echo "No XML files found"
- name: Upload coverage
uses: actions/upload-artifact@v6
with:
name: coverage-${{ matrix.shard.name }}
path: artifacts/coverage/**/coverage.opencover.xml
retention-days: 1
if-no-files-found: warn
# SonarCloud analysis - runs after coverage collection
sonarcloud:
name: SonarCloud Analysis
needs: [build, coverage]
runs-on: ubuntu-latest
timeout-minutes: 20
permissions:
contents: read
pull-requests: read
if: always() && needs.build.result == 'success'
steps:
- uses: actions/checkout@v6
with:
fetch-depth: 0
- uses: actions/setup-dotnet@v5
with:
dotnet-version: 10.0.x
- name: Cache NuGet packages
uses: actions/cache@v5
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/Directory.Packages.props') }}
restore-keys: |
${{ runner.os }}-nuget-
- name: Install SonarScanner
run: dotnet tool install --global dotnet-sonarscanner
- name: Download all coverage reports
uses: actions/download-artifact@v7
with:
pattern: coverage-*
path: artifacts/coverage
merge-multiple: true
- name: Find coverage reports
id: coverage
run: |
COVERAGE_FILES=$(find artifacts/coverage -name "coverage.opencover.xml" -type f 2>/dev/null | tr '\n' ',' | sed 's/,$//')
if [ -n "$COVERAGE_FILES" ]; then
echo "paths=$COVERAGE_FILES" >> $GITHUB_OUTPUT
echo "Found coverage reports: $COVERAGE_FILES"
else
echo "paths=" >> $GITHUB_OUTPUT
echo "No coverage reports found"
fi
- name: Restore source projects
run: dotnet restore Encina.Source.sln
- name: Begin SonarCloud analysis
env:
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: |
COVERAGE_ARG=""
if [ -n "${{ steps.coverage.outputs.paths }}" ]; then
COVERAGE_ARG="/d:sonar.cs.opencover.reportsPaths=${{ steps.coverage.outputs.paths }}"
echo "Using coverage reports: ${{ steps.coverage.outputs.paths }}"
else
echo "No coverage reports available"
fi
# Exclusions: Integration code that requires external services (not testable with unit tests)
COVERAGE_EXCLUSIONS="src/Encina.Testing*/**/*.cs,\
src/Encina.Aspire*/**/*.cs,\
src/Encina.AspNetCore/**/*.cs,\
src/Encina.AzureFunctions/**/*.cs,\
src/Encina.AwsLambda/**/*.cs,\
src/Encina.AmazonSQS/**/*.cs,\
src/Encina.AzureServiceBus/**/*.cs,\
src/Encina.Cli/**/*.cs,\
src/Encina.DomainModeling/**/*.cs,\
src/Encina.FluentValidation/**/*.cs,\
src/Encina.DataAnnotations/**/*.cs,\
src/Encina.MiniValidator/**/*.cs,\
src/Encina.Dapper*/**/*.cs,\
src/Encina.ADO*/**/*.cs,\
src/Encina.MongoDB/**/*.cs,\
src/Encina.Marten/**/*.cs,\
src/Encina.DistributedLock*/**/*.cs,\
src/Encina.Caching*/**/*.cs,\
src/Encina.Redis.PubSub/**/*.cs,\
src/Encina.Hangfire/**/*.cs,\
src/Encina.Quartz/**/*.cs,\
src/Encina.SignalR/**/*.cs,\
src/Encina.gRPC/**/*.cs,\
src/Encina.GraphQL/**/*.cs,\
src/Encina.RabbitMQ/**/*.cs,\
src/Encina.Kafka/**/*.cs,\
src/Encina.MQTT/**/*.cs,\
src/Encina.NATS/**/*.cs,\
src/Encina.OpenTelemetry/**/*.cs,\
src/Encina.Polly/**/*.cs,\
src/Encina.Refit/**/*.cs,\
src/Encina.Workflows/**/*.cs,\
src/Encina.Extensions.Resilience/**/*.cs,\
src/Encina.InMemory/**/*.cs,\
src/Encina.EntityFrameworkCore/**/*.cs,\
src/Encina/Modules/**/*.cs,\
src/Encina/Pipeline/Behaviors/*Activity*.cs,\
src/Encina/Pipeline/Behaviors/*Metrics*.cs,\
src/Encina/Dispatchers/Strategies/**/*.cs,\
src/Encina/Pipeline/Stream*.cs,\
src/Encina/Core/StreamDispatcher.cs,\
src/Encina/Core/Encina.Stream.cs,\
src/Encina/Pipeline/EncinaBehaviorGuards.cs,\
src/Encina.Messaging/Recoverability/**/*.cs,\
src/Encina.Messaging/DeadLetter/**/*.cs,\
src/Encina.Messaging/Sagas/SagaNotFoundDispatcher.cs,\
src/Encina.Messaging/*ServiceCollectionExtensions.cs,\
src/Encina.Messaging/ScatterGather/**/*.cs,\
src/Encina.Messaging/Health/**/*.cs,\
src/Encina/Diagnostics/**/*.cs,\
src/Encina/Pipeline/*Guards.cs,\
**/Scripts/*.sql"
CPD_EXCLUSIONS="src/Encina.Dapper.*/**/*.cs,src/Encina.Dapper.*/Scripts/*.sql,src/Encina.ADO.*/**/*.cs,src/Encina.ADO.*/Scripts/*.sql,src/Encina.Testing*/**/*.cs"
dotnet sonarscanner begin \
/k:"dlrivada_Encina" \
/o:"dlrivada" \
/d:sonar.token="${{ secrets.SONAR_TOKEN }}" \
/d:sonar.host.url="https://sonarcloud.io" \
$COVERAGE_ARG \
/d:sonar.coverage.exclusions="$COVERAGE_EXCLUSIONS" \
/d:sonar.cpd.exclusions="$CPD_EXCLUSIONS" \
/d:sonar.exclusions="**/Migrations/**,**/*.g.cs,**/obj/**,**/bin/**,tests/**/*" \
/d:sonar.issue.ignore.multicriteria=e1,e2,e3,e4,e5,e6,e7,e8,e9,e10,e11,e12,e13,e14,e15,e16,e17,e18,e19,e20,e21,e22,e23,e24,e25,e26,e27,e28,e29,e30,e31,e32,e33,e34,e35,e36,e37,e38 \
/d:sonar.issue.ignore.multicriteria.e1.ruleKey=csharpsquid:S2077 \
/d:sonar.issue.ignore.multicriteria.e1.resourceKey="src/Encina.Dapper.*/**/*Store*.cs" \
/d:sonar.issue.ignore.multicriteria.e2.ruleKey=csharpsquid:S2077 \
/d:sonar.issue.ignore.multicriteria.e2.resourceKey="src/Encina.ADO.*/**/*Store*.cs" \
/d:sonar.issue.ignore.multicriteria.e3.ruleKey=plsql:S1523 \
/d:sonar.issue.ignore.multicriteria.e3.resourceKey="src/**/Scripts/*.sql" \
/d:sonar.issue.ignore.multicriteria.e4.ruleKey=csharpsquid:S1135 \
/d:sonar.issue.ignore.multicriteria.e4.resourceKey="src/Encina.Testing/**/NeedsMutationCoverageAttribute.cs" \
/d:sonar.issue.ignore.multicriteria.e5.ruleKey=csharpsquid:S1135 \
/d:sonar.issue.ignore.multicriteria.e5.resourceKey="src/Encina.Cli/**/CodeGenerator.cs" \
/d:sonar.issue.ignore.multicriteria.e6.ruleKey=csharpsquid:S101 \
/d:sonar.issue.ignore.multicriteria.e6.resourceKey="src/Encina.ADO.*/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e7.ruleKey=csharpsquid:S101 \
/d:sonar.issue.ignore.multicriteria.e7.resourceKey="src/Encina.AmazonSQS/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e8.ruleKey=csharpsquid:S101 \
/d:sonar.issue.ignore.multicriteria.e8.resourceKey="src/Encina.MQTT/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e9.ruleKey=csharpsquid:S101 \
/d:sonar.issue.ignore.multicriteria.e9.resourceKey="src/Encina.NATS/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e10.ruleKey=csharpsquid:S4136 \
/d:sonar.issue.ignore.multicriteria.e10.resourceKey="src/Encina.Testing*/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e11.ruleKey=csharpsquid:S4136 \
/d:sonar.issue.ignore.multicriteria.e11.resourceKey="src/Encina.DomainModeling/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e12.ruleKey=csharpsquid:S4136 \
/d:sonar.issue.ignore.multicriteria.e12.resourceKey="src/Encina.GuardClauses/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e13.ruleKey=csharpsquid:S3267 \
/d:sonar.issue.ignore.multicriteria.e13.resourceKey="src/Encina.Marten/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e14.ruleKey=csharpsquid:S3220 \
/d:sonar.issue.ignore.multicriteria.e14.resourceKey="src/Encina.Marten/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e15.ruleKey=csharpsquid:S3267 \
/d:sonar.issue.ignore.multicriteria.e15.resourceKey="src/Encina.DomainModeling/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e16.ruleKey=csharpsquid:S3267 \
/d:sonar.issue.ignore.multicriteria.e16.resourceKey="src/Encina.Messaging/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e17.ruleKey=csharpsquid:S2737 \
/d:sonar.issue.ignore.multicriteria.e17.resourceKey="src/Encina.Testing*/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e18.ruleKey=csharpsquid:S1694 \
/d:sonar.issue.ignore.multicriteria.e18.resourceKey="src/Encina.DomainModeling/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e19.ruleKey=csharpsquid:S6667 \
/d:sonar.issue.ignore.multicriteria.e19.resourceKey="src/Encina.DomainModeling/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e20.ruleKey=csharpsquid:S1210 \
/d:sonar.issue.ignore.multicriteria.e20.resourceKey="src/Encina.DomainModeling/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e21.ruleKey=csharpsquid:S1192 \
/d:sonar.issue.ignore.multicriteria.e21.resourceKey="src/Encina.Cli/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e22.ruleKey=csharpsquid:S6612 \
/d:sonar.issue.ignore.multicriteria.e22.resourceKey="src/Encina.Marten/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e23.ruleKey=csharpsquid:S3236 \
/d:sonar.issue.ignore.multicriteria.e23.resourceKey="src/Encina.Messaging/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e24.ruleKey=csharpsquid:S1192 \
/d:sonar.issue.ignore.multicriteria.e24.resourceKey="src/Encina.ADO.*/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e25.ruleKey=csharpsquid:S1192 \
/d:sonar.issue.ignore.multicriteria.e25.resourceKey="src/Encina.AmazonSQS/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e26.ruleKey=csharpsquid:S1192 \
/d:sonar.issue.ignore.multicriteria.e26.resourceKey="src/Encina.OpenTelemetry/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e27.ruleKey=csharpsquid:S1694 \
/d:sonar.issue.ignore.multicriteria.e27.resourceKey="src/Encina/Core/*.cs" \
/d:sonar.issue.ignore.multicriteria.e28.ruleKey=csharpsquid:S3267 \
/d:sonar.issue.ignore.multicriteria.e28.resourceKey="src/Encina/Core/*.cs" \
/d:sonar.issue.ignore.multicriteria.e29.ruleKey=csharpsquid:S3241 \
/d:sonar.issue.ignore.multicriteria.e29.resourceKey="src/Encina/Dispatchers/*.cs" \
/d:sonar.issue.ignore.multicriteria.e30.ruleKey=csharpsquid:S3220 \
/d:sonar.issue.ignore.multicriteria.e30.resourceKey="src/Encina/Dispatchers/*.cs" \
/d:sonar.issue.ignore.multicriteria.e31.ruleKey=csharpsquid:S6608 \
/d:sonar.issue.ignore.multicriteria.e31.resourceKey="src/Encina/Dispatchers/*.cs" \
/d:sonar.issue.ignore.multicriteria.e32.ruleKey=csharpsquid:S1192 \
/d:sonar.issue.ignore.multicriteria.e32.resourceKey="src/Encina/Pipeline/*.cs" \
/d:sonar.issue.ignore.multicriteria.e33.ruleKey=csharpsquid:S1133 \
/d:sonar.issue.ignore.multicriteria.e33.resourceKey="src/Encina.Testing*/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e34.ruleKey=csharpsquid:S1192 \
/d:sonar.issue.ignore.multicriteria.e34.resourceKey="src/Encina.Dapper.*/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e35.ruleKey=csharpsquid:S3267 \
/d:sonar.issue.ignore.multicriteria.e35.resourceKey="src/Encina/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e36.ruleKey=csharpsquid:S3220 \
/d:sonar.issue.ignore.multicriteria.e36.resourceKey="src/Encina/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e37.ruleKey=csharpsquid:S6608 \
/d:sonar.issue.ignore.multicriteria.e37.resourceKey="src/Encina/**/*.cs" \
/d:sonar.issue.ignore.multicriteria.e38.ruleKey=csharpsquid:S3241 \
/d:sonar.issue.ignore.multicriteria.e38.resourceKey="src/Encina/**/*.cs" \
/d:sonar.verbose=false
- name: Build for SonarCloud analysis
run: dotnet build Encina.Source.sln --configuration Release --no-restore
- name: End SonarCloud analysis
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
run: dotnet sonarscanner end /d:sonar.token="$SONAR_TOKEN"