# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json name: publish on: workflow_dispatch: # Allow running the workflow manually from the GitHub UI push: branches: - 'main' # Run the workflow when pushing to the main branch pull_request: branches: - '*' # Run the workflow for all pull requests release: types: - published # Run the workflow when a new GitHub release is published env: DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1 DOTNET_NOLOGO: true NuGetDirectory: ${{ github.workspace}}/nuget defaults: run: shell: pwsh jobs: create_nuget: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 with: fetch-depth: 0 # Get all history to allow automatic versioning using MinVer # Install the .NET SDK indicated in the global.json file - name: Setup .NET uses: actions/setup-dotnet@v4 # Create the NuGet package in the folder from the environment variable NuGetDirectory - run: dotnet pack --configuration Release --output ${{ env.NuGetDirectory }} # Publish the NuGet package as an artifact, so they can be used in the following jobs - uses: actions/upload-artifact@v3 with: name: nuget if-no-files-found: error retention-days: 7 path: ${{ env.NuGetDirectory }}/*.nupkg validate_nuget: runs-on: ubuntu-latest needs: [ create_nuget ] steps: # Install the .NET SDK indicated in the global.json file - name: Setup .NET uses: actions/setup-dotnet@v4 # Download the NuGet package created in the previous job - uses: actions/download-artifact@v3 with: name: nuget path: ${{ env.NuGetDirectory }} - name: Install nuget validator run: dotnet tool update Meziantou.Framework.NuGetPackageValidation.Tool --global # Validate metadata and content of the NuGet package # https://www.nuget.org/packages/Meziantou.Framework.NuGetPackageValidation.Tool#readme-body-tab # If some rules are not applicable, you can disable them # using the --excluded-rules or --excluded-rule-ids option - name: Validate package run: meziantou.validate-nuget-package (Get-ChildItem "${{ env.NuGetDirectory }}/*.nupkg") run_test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Setup .NET uses: actions/setup-dotnet@v4 - name: Run tests run: dotnet test --configuration Release deploy: # Publish only when creating a GitHub Release # https://docs.github.com/en/repositories/releasing-projects-on-github/managing-releases-in-a-repository # You can update this logic if you want to manage releases differently if: github.event_name == 'release' runs-on: ubuntu-latest needs: [ validate_nuget, run_test ] steps: # Download the NuGet package created in the previous job - uses: actions/download-artifact@v3 with: name: nuget path: ${{ env.NuGetDirectory }} # Install the .NET SDK indicated in the global.json file - name: Setup .NET Core uses: actions/setup-dotnet@v4 # Publish all NuGet packages to NuGet.org # Use --skip-duplicate to prevent errors if a package with the same version already exists. # If you retry a failed workflow, already published packages will be skipped without error. - name: Publish NuGet package run: | foreach($file in (Get-ChildItem "${{ env.NuGetDirectory }}" -Recurse -Include *.nupkg)) { dotnet nuget push $file --api-key "${{ secrets.NUGET_KEY }}" --source https://api.nuget.org/v3/index.json --skip-duplicate }