Skip to content

Workflow file for this run

name: "CI & CD: Build & Test .NET Solution, Create & Validate & Publish Nuget Package and Create Release"
on:
push:
branches:
- "**"
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:
build_test:
name: Build & Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: "8"
- name: Build
run: dotnet build
working-directory: "Jvw.DevToys.SemverCalculator"
- name: Test
run: dotnet test --no-build
working-directory: "Jvw.DevToys.SemverCalculator"
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
sonarcloud:
name: Run SonarCloud scanning
runs-on: ubuntu-latest
permissions:
pull-requests: read # Allows SonarCloud to decorate PRs with analysis results.
steps:
# - uses: actions/setup-java@v4
# with:
# distribution: "temurin"
# java-version: "21" # SonarCloud requires v17 or higher.
# check-latest: true
- uses: actions/checkout@v4
with:
fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis.
- name: SonarCloud Scan
uses: sonarsource/sonarcloud-github-action@v2
if: success() || failure() # Run this step even if previous step failed.
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
with:
args: >
-Dsonar.projectKey=jerone_Jvw.DevToys.SemverCalculator
-Dsonar.organization=jerone
-Dsonar.projectBaseDir=.
-Dsonar.sources=./Jvw.DevToys.SemverCalculator/
nuget_pack:
name: Pack NuGet package
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: "8"
- name: Set version variable
if: ${{ github.ref_type == 'tag' }}
env:
TAG: ${{ github.ref_name }}
run: echo "NuGetVersion=${TAG#v}" >> $GITHUB_ENV
- name: Build Release
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
nuget_validate:
name: Validate NuGet package
runs-on: ubuntu-latest
needs: [nuget_pack]
steps:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: "8"
- 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 package
shell: pwsh
run: meziantou.validate-nuget-package (Get-ChildItem "${{ env.NuGetDirectory }}/*.nupkg")
nuget_publish:
name: Publish NuGet package
runs-on: ubuntu-latest
needs: [nuget_validate, build_test, analyze_codeql, sonarcloud]
if: github.ref_type == 'tag' && startsWith(github.ref, 'refs/tags/v')
steps:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: "8"
- 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
release:
name: Create release on GitHub
runs-on: ubuntu-latest
needs: [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