feat(analyzers): Add Roslyn analyzers for experiment configuration va… #229
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| on: | |
| push: | |
| branches: [ main ] | |
| pull_request: | |
| branches: [ main ] | |
| env: | |
| DOTNET_NOLOGO: true | |
| INCLUDE_SYMBOLS: true | |
| MSBUILDDISABLENODEREUSE: 1 | |
| jobs: | |
| pr-checks: | |
| if: github.event_name == 'pull_request' | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: read | |
| pull-requests: write | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v6 | |
| - name: Setup .NET | |
| uses: actions/setup-dotnet@v5 | |
| with: | |
| dotnet-version: | | |
| 8.0.x | |
| 9.0.x | |
| 10.0.x | |
| - name: Restore | |
| run: | | |
| dotnet tool restore | |
| dotnet restore --use-lock-file | |
| - name: Build (Release) | |
| run: dotnet build ExperimentFramework.slnx --configuration Release --no-restore /p:ContinuousIntegrationBuild=true /p:BuildInParallel=false | |
| - name: Test with coverage | |
| run: | | |
| dotnet test ExperimentFramework.slnx \ | |
| --configuration Release \ | |
| --collect:"XPlat Code Coverage" \ | |
| --settings tests/ExperimentFramework.Tests/coverage.runsettings | |
| - name: Install ReportGenerator | |
| run: dotnet tool update -g dotnet-reportgenerator-globaltool | |
| - name: Combine coverage and create reports | |
| shell: bash | |
| run: | | |
| REPORTS=$(find . -type f -path "*/TestResults/*/coverage.cobertura.xml" | tr '\n' ';') | |
| reportgenerator \ | |
| -reports:"$REPORTS" \ | |
| -targetdir:"coverage-report" \ | |
| -reporttypes:"HtmlInline;Cobertura;TextSummary;lcov;Badges" \ | |
| -assemblyfilters:"+ExperimentFramework*;-*Tests*;-*SampleConsole*;-*SampleWebApp*;-*ComprehensiveSample*;-*Benchmarks*" \ | |
| -filefilters:"-**/*.Tests/*;-**/*Tests*/**;-**/samples/**;-**/benchmarks/**" | |
| echo "COVERAGE_SUMMARY<<EOF" >> $GITHUB_ENV | |
| cat coverage-report/Summary.txt >> $GITHUB_ENV | |
| echo "EOF" >> $GITHUB_ENV | |
| - name: Upload coverage HTML report | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: coverage-report | |
| path: coverage-report | |
| - name: Add coverage summary to PR | |
| uses: marocchino/sticky-pull-request-comment@v2 | |
| with: | |
| recreate: true | |
| message: | | |
| ## Code Coverage | |
| ``` | |
| ${{ env.COVERAGE_SUMMARY }} | |
| ``` | |
| - name: Upload coverage to Codecov | |
| uses: codecov/codecov-action@v5 | |
| with: | |
| files: | | |
| **/TestResults/*/coverage.cobertura.xml | |
| flags: unittests | |
| fail_ci_if_error: true | |
| verbose: true | |
| env: | |
| CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
| release: | |
| if: github.event_name == 'push' && github.ref == 'refs/heads/main' | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| packages: write | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@v6 | |
| with: | |
| fetch-depth: 0 | |
| - name: Setup .NET | |
| uses: actions/setup-dotnet@v5 | |
| with: | |
| dotnet-version: | | |
| 8.0.x | |
| 9.0.x | |
| 10.0.x | |
| - name: Restore | |
| run: | | |
| dotnet restore --use-lock-file | |
| dotnet tool restore | |
| - name: Fetch tags | |
| run: git fetch --prune --tags | |
| - name: Clean GitVersion cache | |
| run: rm -rf .git/gitversion_cache || true | |
| - name: Install GitVersion | |
| uses: gittools/actions/gitversion/setup@v4 | |
| with: | |
| versionSpec: '6.x' | |
| - name: Display GitVersion version | |
| run: dotnet-gitversion /version | |
| - name: Run GitVersion | |
| id: gitversion | |
| uses: gittools/actions/gitversion/execute@v4 | |
| - name: Set version env vars | |
| run: | | |
| echo "PACKAGE_VERSION=${{ steps.gitversion.outputs.majorMinorPatch }}" >> $GITHUB_ENV | |
| echo "ASSEMBLY_VERSION=${{ steps.gitversion.outputs.assemblySemVer }}" >> $GITHUB_ENV | |
| echo "FILE_VERSION=${{ steps.gitversion.outputs.assemblySemFileVer }}" >> $GITHUB_ENV | |
| - name: Build (Release) | |
| run: > | |
| dotnet build ExperimentFramework.slnx | |
| --configuration Release | |
| --no-restore | |
| /p:ContinuousIntegrationBuild=true | |
| /p:BuildInParallel=false | |
| /p:Version=${{ env.PACKAGE_VERSION }} | |
| /p:AssemblyVersion=${{ env.ASSEMBLY_VERSION }} | |
| /p:FileVersion=${{ env.FILE_VERSION }} | |
| /p:PackageVersion=${{ env.PACKAGE_VERSION }} | |
| - name: Test (Release) | |
| run: dotnet test ExperimentFramework.slnx --configuration Release --no-build --verbosity normal | |
| - name: Pack (all packable projects) | |
| run: > | |
| dotnet pack ExperimentFramework.slnx | |
| --configuration Release | |
| --no-build | |
| --output ./artifacts | |
| /p:ContinuousIntegrationBuild=true | |
| /p:IncludeSymbols=${{ env.INCLUDE_SYMBOLS }} | |
| /p:SymbolPackageFormat=snupkg | |
| /p:Version=${{ env.PACKAGE_VERSION }} | |
| /p:AssemblyVersion=${{ env.ASSEMBLY_VERSION }} | |
| /p:FileVersion=${{ env.FILE_VERSION }} | |
| /p:PackageVersion=${{ env.PACKAGE_VERSION }} || true | |
| - name: Generate configuration schemas | |
| run: | | |
| dotnet run --project tools/ExperimentFramework.SchemaGenerator/ExperimentFramework.SchemaGenerator.csproj -- ./artifacts/schemas | |
| echo "Generated schema files:" | |
| ls -lh ./artifacts/schemas/ | |
| - name: Upload packages as artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: nuget-packages | |
| path: | | |
| ./artifacts/*.nupkg | |
| ./artifacts/*.snupkg | |
| - name: Upload schema files as artifact | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: configuration-schemas | |
| path: ./artifacts/schemas/*.json | |
| - name: Create and push git tag | |
| shell: bash | |
| run: | | |
| set -euo pipefail | |
| git config user.name "github-actions" | |
| git config user.email "[email protected]" | |
| if git rev-parse "v${PACKAGE_VERSION}" >/dev/null 2>&1; then | |
| echo "Tag v${PACKAGE_VERSION} already exists. Skipping tag push." | |
| else | |
| git tag "v${PACKAGE_VERSION}" | |
| git push origin "v${PACKAGE_VERSION}" | |
| fi | |
| - name: Create GitHub Release | |
| uses: softprops/action-gh-release@v2 | |
| with: | |
| tag_name: v${{ env.PACKAGE_VERSION }} | |
| name: Release v${{ env.PACKAGE_VERSION }} | |
| files: | | |
| ./artifacts/*.nupkg | |
| ./artifacts/*.snupkg | |
| ./artifacts/schemas/*.json | |
| generate_release_notes: true | |
| - name: Push to NuGet.org | |
| env: | |
| NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }} | |
| run: | | |
| if [ -n "$NUGET_API_KEY" ]; then | |
| dotnet nuget push ./artifacts/*.nupkg \ | |
| --api-key "$NUGET_API_KEY" \ | |
| --source https://api.nuget.org/v3/index.json \ | |
| --skip-duplicate | |
| else | |
| echo "Skipping NuGet.org push: API key not set." | |
| fi | |
| - name: Push to GitHub Packages (optional) | |
| run: | | |
| dotnet nuget push "./artifacts/*.nupkg" \ | |
| --source "https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json" \ | |
| --api-key "${{ secrets.GITHUB_TOKEN }}" \ | |
| --skip-duplicate | |
| dotnet nuget push "./artifacts/*.snupkg" \ | |
| --source "https://nuget.pkg.github.com/${{ github.repository_owner }}/index.json" \ | |
| --api-key "${{ secrets.GITHUB_TOKEN }}" \ | |
| --skip-duplicate |