Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
c5e155c
chore: add global.json to specify .NET SDK version and test runner
tavanuka Apr 14, 2026
c2f87ed
build(ci): add first iteration of CI workflow for building and testin…
tavanuka Apr 14, 2026
db34b4b
build(ci): fix typo and missing restore steps
tavanuka Apr 14, 2026
02db562
build(ci): fix argument typo
tavanuka Apr 14, 2026
3f8b627
build(ci): fix argument definition and add extra flags
tavanuka Apr 14, 2026
2f52c8e
build(ci): add flag to ignore when test project ran no tests
tavanuka Apr 14, 2026
65cbe65
build(ci): remove test result publishing
tavanuka Apr 14, 2026
e1a7343
build(ci): fix qodana action step
tavanuka Apr 14, 2026
6dd13e1
test(aspire): extend the resource timeout to 3 minutes for integratio…
tavanuka Apr 14, 2026
53d785a
test: update CoreIntegrationTestBase to use CreateTablesAsync for dat…
tavanuka Apr 14, 2026
bb0bbcd
build(ci): update Qodana image to version 2025.3
tavanuka Apr 14, 2026
de32faf
build(ci): add codecov test publishing and update qodana action step
tavanuka Apr 14, 2026
778d8d5
test(aspire): wait for only resources under test to spin up
tavanuka Apr 14, 2026
3735028
build(ci): isolate apphost tests to a separate job
tavanuka Apr 14, 2026
3bf553d
build: specify Qodana linter
tavanuka Apr 14, 2026
80b5872
build(ci): move qodana to a separate operation
tavanuka Apr 14, 2026
b5879a4
build(ci): add requirement on the aspire-test job for report generation
tavanuka Apr 14, 2026
9cdd267
build(ci): update ASPIRE_ALLOW_UNSECURED_TRANSPORT
tavanuka Apr 14, 2026
bc5d697
build(ci): trust ASP.NET Core dev certificate in workflow
tavanuka Apr 14, 2026
fdb1ad1
build(ci): add Codecov configuration file with coverage thresholds
tavanuka Apr 14, 2026
95c6828
build(ci): update script to create directory before copying certificate
tavanuka Apr 14, 2026
4b0905d
build(ci): update action versions to latest
tavanuka Apr 14, 2026
18d3d33
build(ci): update coverage output path for consistency across workflows
tavanuka Apr 14, 2026
9ee2a88
build(ci): add concurrency control to cancel in-progress workflows
tavanuka Apr 14, 2026
e9bcc4c
build(ci): expand test result artifact paths and log retrieved artifacts
tavanuka Apr 14, 2026
b6706ed
build(ci): update coverage and test result file paths for consistency…
tavanuka Apr 14, 2026
fc68809
build(ci): remove Qodana code quality workflow
tavanuka Apr 14, 2026
dffe94c
build(ci): update Qodana linter to latest version
tavanuka Apr 14, 2026
8ee7afc
build(ci): specify solution file for Qodana dotnet linter
tavanuka Apr 14, 2026
ee887b0
build(ci): unify .NET version variable and add build step to code-ins…
tavanuka Apr 14, 2026
53ac01d
Merge branch 'refs/heads/master' into develop/pipeline-ci-configuration
tavanuka Apr 14, 2026
f303cff
build(ci): restrict workflow to master branch only
tavanuka Apr 14, 2026
4ae7c6b
build(ci): add NuGet caching and remove unused Qodana linter configur…
tavanuka Apr 14, 2026
6fa0d6e
build(ci): specify solution file for Qodana action configuration
tavanuka Apr 14, 2026
a23e775
build(ci): reorder steps in code-inspection workflow and pass --no-bu…
tavanuka Apr 14, 2026
a70af8a
build(ci): unset DOTNET_ROOT before Qodana scan in code-inspection wo…
tavanuka Apr 14, 2026
3753b82
build(ci): adjust Qodana configuration and update dotnet-cli property…
tavanuka Apr 14, 2026
9122b82
build(ci): comment out unused Qodana action arguments and profile con…
tavanuka Apr 14, 2026
c808334
build(ci): enable Qodana configuration with solution file and recomme…
tavanuka Apr 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
289 changes: 289 additions & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,289 @@
name: Build

on:
push:
branches: [ master ]
pull_request:

env:
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
DOTNET_CLI_TELEMETRY_OPTOUT: true
DOTNET_NOLOGO: true

concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true

jobs:
build:
name: Build
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v6

- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
dotnet-version: '10.0.x'
- name: Restore dependencies
run: dotnet restore

- name: Cache NuGet packages
uses: actions/cache@v5
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/global.json') }}
restore-keys: ${{ runner.os }}-nuget-

- name: Build
run: dotnet build --no-restore --configuration Release

test:
name: Test
runs-on: ubuntu-latest
needs: build
steps:
- name: Checkout
uses: actions/checkout@v6

- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
dotnet-version: '10.0.x'

- name: Restore dependencies
run: dotnet restore

- name: Cache NuGet packages
uses: actions/cache@v5
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/global.json') }}
restore-keys: ${{ runner.os }}-nuget-

- name: Build
run: dotnet build --configuration Release --no-restore

- name: Expose GitHub Actions Runtime
uses: actions/github-script@v9
with:
script: |
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env['ACTIONS_RUNTIME_TOKEN']);
core.exportVariable('ACTIONS_RESULTS_URL', process.env['ACTIONS_RESULTS_URL']);

- name: Run unit tests with coverage
run: dotnet test --configuration Release --no-build --results-directory ./TestResults -- --coverage --report-trx --treenode-filter "/*/*/*/*[Category=UnitTest]" --coverage-output-format cobertura --ignore-exit-code 8

- name: Upload TRX artifact
uses: actions/upload-artifact@v7
if: always()
with:
name: trx-unit
path: ./TestResults/**/*.trx

- name: Upload coverage artifact
uses: actions/upload-artifact@v7
if: always()
with:
name: coverage-unit
path: ./TestResults/**/*.cobertura.xml

component-test:
name: Component test
runs-on: ubuntu-latest
needs: build
steps:
- name: Checkout
uses: actions/checkout@v6

- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
dotnet-version: '10.0.x'

- name: Restore dependencies
run: dotnet restore

- name: Cache NuGet packages
uses: actions/cache@v5
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/global.json') }}
restore-keys: ${{ runner.os }}-nuget-

- name: Build
run: dotnet build --configuration Release --no-restore

- name: Expose GitHub Actions Runtime
uses: actions/github-script@v9
with:
script: |
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env['ACTIONS_RUNTIME_TOKEN']);
core.exportVariable('ACTIONS_RESULTS_URL', process.env['ACTIONS_RESULTS_URL']);

- name: Run Blazor component tests with coverage
run: dotnet test --configuration Release --no-build --results-directory ./TestResults -- --coverage --report-trx --treenode-filter "/*/*/*/*[Category=Components]" --coverage-output-format cobertura --ignore-exit-code 8

- name: Upload TRX artifact
uses: actions/upload-artifact@v7
if: always()
with:
name: trx-component
path: ./TestResults/**/*.trx

- name: Upload coverage artifact
uses: actions/upload-artifact@v7
if: always()
with:
name: coverage-component
path: ./TestResults/**/*.cobertura.xml

integration-test:
name: Integration Test
runs-on: ubuntu-latest
needs: build
steps:
- name: Checkout
uses: actions/checkout@v6

- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
dotnet-version: '10.0.x'

- name: Restore dependencies
run: dotnet restore

- name: Cache NuGet packages
uses: actions/cache@v5
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/global.json') }}
restore-keys: ${{ runner.os }}-nuget-

- name: Build
run: dotnet build --configuration Release --no-restore

- name: Expose GitHub Actions Runtime
uses: actions/github-script@v9
with:
script: |
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env['ACTIONS_RUNTIME_TOKEN']);
core.exportVariable('ACTIONS_RESULTS_URL', process.env['ACTIONS_RESULTS_URL']);

- name: Run integration tests with coverage
run: dotnet test --configuration Release --no-build --results-directory ./TestResults -- --coverage --report-trx --treenode-filter "/*/*/*/*[Category=Integration]" --coverage-output-format cobertura --ignore-exit-code 8

- name: Upload TRX artifact
uses: actions/upload-artifact@v7
if: always()
with:
name: trx-integration
path: ./TestResults/**/*.trx

- name: Upload coverage artifact
uses: actions/upload-artifact@v7
if: always()
with:
name: coverage-integration
path: ./TestResults/**/*.cobertura.xml

aspire-test:
name: Aspire Test
runs-on: ubuntu-latest
needs: build
steps:
- name: Checkout
uses: actions/checkout@v6

- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
dotnet-version: ${{ vars.DOTNET_VERSION }}

- name: Restore dependencies
run: dotnet restore

- name: Cache NuGet packages
uses: actions/cache@v5
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/global.json') }}
restore-keys: ${{ runner.os }}-nuget-

- name: Build
run: dotnet build --configuration Release --no-restore

- name: Expose GitHub Actions Runtime
uses: actions/github-script@v9
with:
script: |
core.exportVariable('ACTIONS_RUNTIME_TOKEN', process.env['ACTIONS_RUNTIME_TOKEN']);
core.exportVariable('ACTIONS_RESULTS_URL', process.env['ACTIONS_RESULTS_URL']);

- name: Trust ASP.NET Core dev certificate
run: |
mkdir -p "$HOME/.aspnet/https"
dotnet dev-certs https -ep "$HOME/.aspnet/https/devcert.crt" --format PEM --no-password
sudo cp "$HOME/.aspnet/https/devcert.crt" /usr/local/share/ca-certificates/dotnet-devcert.crt
sudo update-ca-certificates

- name: Run Aspire tests with coverage
run: dotnet test --configuration Release --no-build --results-directory ./TestResults -- --coverage --report-trx --treenode-filter "/*/*/*/*[Category=AppHost]" --coverage-output-format cobertura --ignore-exit-code 8
env:
ASPIRE_ALLOW_UNSECURED_TRANSPORT: "true"

- name: Upload TRX artifact
uses: actions/upload-artifact@v7
if: always()
with:
name: trx-aspire
path: ./TestResults/**/*.trx

- name: Upload coverage artifact
uses: actions/upload-artifact@v7
if: always()
with:
name: coverage-aspire
path: ./TestResults/**/*.cobertura.xml

report:
name: Report
runs-on: ubuntu-latest
needs: [ test, component-test, integration-test, aspire-test ]
if: always()
steps:
- name: Checkout
uses: actions/checkout@v6

- name: Download all TRX artifacts
uses: actions/download-artifact@v8
with:
pattern: trx-*
path: TestResults
merge-multiple: true

- name: Download all coverage artifacts
uses: actions/download-artifact@v8
with:
pattern: coverage-*
path: TestResults

- name: List downloaded artifacts
if: always()
run: find TestResults -type f | sort 2>/dev/null || echo "No files found in TestResults"

- name: Upload coverage to Codecov
uses: codecov/codecov-action@v5
with:
files: ./TestResults/**/*.cobertura.xml
token: ${{ secrets.CODECOV_TOKEN }}

- name: Upload test results to Codecov
if: ${{ !cancelled() }}
uses: codecov/codecov-action@v5
with:
files: ./TestResults/**/*.trx
token: ${{ secrets.CODECOV_TOKEN }}
report_type: test_results
50 changes: 50 additions & 0 deletions .github/workflows/code-inspection.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
name: Code inspection
on:
workflow_dispatch:
pull_request:
push:
branches:
- master
- main
- 'releases/*' # The release branches
jobs:
qodana:
runs-on: ubuntu-latest
permissions:
contents: write
pull-requests: write
checks: write
steps:
- uses: actions/checkout@v6
with:
ref: ${{ github.event.pull_request.head.sha }} # to check out the actual pull request commit, not the merge commit
fetch-depth: 0 # a full history is required for pull request analysis

- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
dotnet-version: ${{ vars.DOTNET_VERSION }}

- name: Cache NuGet packages
uses: actions/cache@v5
with:
path: ~/.nuget/packages
key: ${{ runner.os }}-nuget-${{ hashFiles('**/*.csproj', '**/global.json') }}
restore-keys: ${{ runner.os }}-nuget-

- name: Restore dependencies
run: dotnet restore

- name: Build
run: dotnet build --configuration Debug --no-restore

# - name: Install .NET SDK for Qodana
# run: curl -sSL https://dot.net/v1/dotnet-install.sh | bash -s -- --channel 10.0 --install-dir "$GITHUB_WORKSPACE/.dotnet"

- name: 'Qodana Scan'
uses: JetBrains/qodana-action@v2025.3
with:
pr-mode: false
# args: --solution TUnit.Sample.slnx --property=dotnet.msbuild.dotnet-cli=/usr/share/dotnet/dotnet
env:
QODANA_TOKEN: ${{ secrets.QODANA_TOKEN_1311845410 }}
28 changes: 0 additions & 28 deletions .github/workflows/qodana_code_quality.yml

This file was deleted.

14 changes: 14 additions & 0 deletions codecov.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
coverage:
status:
project:
default:
target: 80%
threshold: 3%
patch:
default:
target: 80%
threshold: 3%

comment:
layout: "condensed_header, diff, flags, components"
require_changes: true
9 changes: 9 additions & 0 deletions global.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
{
"sdk": {
"version": "10.0.201",
"rollForward": "latestPatch"
},
"test": {
"runner": "Microsoft.Testing.Platform"
}
}
Loading
Loading