Skip to content

Add NuGet package manager (#8) #123

Add NuGet package manager (#8)

Add NuGet package manager (#8) #123

Workflow file for this run

name: "CI & CD: Build & Test & Lint .NET Solution, Create & Validate & Publish Nuget Package and Create Release"
on:
push:
branches:
- "master"
tags:
- "v[0-9]+.[0-9]+.[0-9]+"
pull_request:
branches:
- "**"
workflow_dispatch:
env:
NuGetArtifactName: "NuGet package"
NuGetDirectory: ${{ github.workspace }}/nupkgs
NuGetVersion: 0.0.0
jobs:
job_build_test:
name: Build & Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: "./global.json"
- name: Build solution
run: dotnet build
- name: Test solution
run: dotnet test --no-build --logger GitHubActions
# Logger: https://github.com/Tyrrrz/GitHubActionsTestLogger
- name: Verify results
if: failure()
uses: actions/upload-artifact@v4
with:
name: verify-test-results
path: |
**/*.received.*
job_lint:
name: Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: "./global.json"
- name: Restore .NET tools
run: dotnet tool restore
- name: Run linting
run: dotnet csharpier --check .
job_analyze_codeql:
name: Run CodeQL scanning
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
steps:
- uses: actions/checkout@v4
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
languages: csharp
- name: Auto-build by CodeQL
uses: github/codeql-action/autobuild@v3
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3
job_analyze_sonarcloud:
name: Run SonarCloud scanning
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # Required for SonarCloud.
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: "./global.json"
- name: Install dotnet-coverage
run: dotnet tool install dotnet-coverage --global
- name: Cache SonarCloud packages
uses: actions/cache@v4
with:
path: ~\sonar\cache
key: ${{ runner.os }}-sonar
restore-keys: ${{ runner.os }}-sonar
- name: Cache SonarCloud scanner
id: cache-sonar-scanner
uses: actions/cache@v4
with:
path: .\.sonar\scanner
key: ${{ runner.os }}-sonar-scanner
restore-keys: ${{ runner.os }}-sonar-scanner
- name: Install SonarCloud scanner
if: steps.cache-sonar-scanner.outputs.cache-hit != 'true'
shell: powershell
run: |
New-Item -Path .\.sonar\scanner -ItemType Directory
dotnet tool update dotnet-sonarscanner --tool-path .\.sonar\scanner
- name: Start SonarCloud analyze
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
shell: powershell
run: |
.\.sonar\scanner\dotnet-sonarscanner begin `
/k:"jerone_Jvw.DevToys.SemverCalculator" `
/o:"jerone" `
/d:sonar.token="${{ secrets.SONAR_TOKEN }}" `
/d:sonar.host.url="https://sonarcloud.io" `
/d:sonar.exclusions="**/Pack/**/*.xml" `
/d:sonar.verbose=true `
/d:sonar.cs.vscoveragexml.reportsPaths=coverage.xml
- name: Build solution
run: dotnet build --no-incremental
- name: Test solution
run: dotnet-coverage collect "dotnet test" -f xml -o "coverage.xml"
# https://docs.sonarsource.com/sonarcloud/enriching/test-coverage/dotnet-test-coverage/#dotnetcoverage
- name: End SonarCloud analyze
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
shell: powershell
run: |
.\.sonar\scanner\dotnet-sonarscanner end /d:sonar.token="${{ secrets.SONAR_TOKEN }}"
job_nuget_pack:
name: Pack NuGet package
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: "./global.json"
- name: Set version variable
if: ${{ github.ref_type == 'tag' }}
env:
TAG: ${{ github.ref_name }}
run: echo "NuGetVersion=${TAG#v}" >> $GITHUB_ENV
- name: Build package
run: dotnet build --configuration Release /p:Version=$NuGetVersion
working-directory: "Jvw.DevToys.SemverCalculator"
- name: Pack NuGet package
run: dotnet pack --no-build --output ${{ env.NuGetDirectory }} /p:PackageVersion=$NuGetVersion
working-directory: "Jvw.DevToys.SemverCalculator"
- name: Upload NuGet package
uses: actions/upload-artifact@v4
with:
name: ${{ env.NuGetArtifactName }}
path: ${{ env.NuGetDirectory }}/*.nupkg
job_nuget_validate:
name: Validate NuGet package
runs-on: ubuntu-latest
needs: [job_nuget_pack]
steps:
- uses: actions/checkout@v4
with:
sparse-checkout: "global.json" # Only need this file for this job.
sparse-checkout-cone-mode: false
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: "./global.json"
- name: Install NuGet validator
run: dotnet tool install Meziantou.Framework.NuGetPackageValidation.Tool --global
- uses: actions/download-artifact@v4
with:
name: ${{ env.NuGetArtifactName }}
path: ${{ env.NuGetDirectory }}
- name: Validate NuGet package
shell: pwsh
run: meziantou.validate-nuget-package (Get-ChildItem "${{ env.NuGetDirectory }}/*.nupkg")
job_nuget_publish:
name: Publish NuGet package
runs-on: ubuntu-latest
needs:
[
job_build_test,
job_lint,
job_nuget_validate,
job_analyze_codeql,
job_analyze_sonarcloud,
]
if: github.ref_type == 'tag' && startsWith(github.ref, 'refs/tags/v')
steps:
- uses: actions/checkout@v4
with:
sparse-checkout: "global.json" # Only need this file for this job.
sparse-checkout-cone-mode: false
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
global-json-file: "./global.json"
- uses: actions/download-artifact@v4
with:
name: ${{ env.NuGetArtifactName }}
path: ${{ env.NuGetDirectory }}
- name: Publish NuGet package
run: dotnet nuget push ${{ env.NuGetDirectory }}/*.nupkg -k ${{ secrets.NUGET_APIKEY }} -s https://api.nuget.org/v3/index.json
job_release:
name: Create release on GitHub
runs-on: ubuntu-latest
needs: [job_nuget_publish]
permissions:
contents: write # Needed to create a release.
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
with:
name: ${{ env.NuGetArtifactName }}
path: ${{ env.NuGetDirectory }}
- name: Create release
uses: ncipollo/release-action@v1
with:
generateReleaseNotes: true
artifacts: ${{ env.NuGetDirectory }}/*.nupkg