Skip to content

use general preview label #124

use general preview label

use general preview label #124

name: Deploy NuGet package
# Version format: major.minor.patch[-preview.suffix]
# - Versioning managed by GitVersion
# - Preview suffix toggled by "preview" input
# - Non-preview versions on nuget.org restricted to main branch;
# runs targeting nuget.org from non-"main" branches will fail early.
# - Default: patch increment unless "+semver:" message found
# or will use "next-version" if set in config
# - Preview numbers auto-increment (e.g., preview.1 -> preview.2)
# - Branches are only tagged with the version after deployments to nuget.org
on:
push:
branches:
- main
- 'v*'
- fix-deployer
workflow_dispatch:
inputs:
environment:
description: Deployment environment
type: choice
options:
- pkg.github.com
- nuget.org
default: pkg.github.com
required: true
preview:
description: Append preview suffix
type: boolean
default: true
required: true
dry_run:
description: 'Dry-run only (no deploy)'
type: boolean
default: true
required: true
concurrency:
group: ${{ github.ref_name }}
cancel-in-progress: true
jobs:
validate:
runs-on: ubuntu-latest
steps:
- name: Checkout source
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Debug GitVersion config presence
run: cat src/gitversion.yml
- name: Setup GitVersion Tool
run: dotnet tool install --global GitVersion.Tool --version 6.0.5
- name: Show GitVersion config
run: dotnet gitversion -config src/gitversion.yml -showconfig
- name: Show GitVersion output
run: dotnet gitversion -config src/gitversion.yml -output json -l console
- name: Validate preview settings
run: |
if [[ "${{ github.event.inputs.environment }}" == "nuget.org" ]] && \
[[ "${{ github.ref }}" != "refs/heads/main" ]] && \
[[ "${{ github.event.inputs.preview }}" != "true" ]]; then
echo "::error::Non-preview versions on nuget.org are only allowed from main branch"
exit 1
fi
package:
needs: validate
runs-on: ubuntu-latest
outputs:
version: ${{ steps.version_info.outputs.version }}
url: ${{ steps.package_info.outputs.url }}
name: ${{ steps.package_info.outputs.name }}
environ: ${{ steps.settings.outputs.environ }}
preview: ${{ steps.settings.outputs.preview }}
dry_run: ${{ steps.settings.outputs.dry_run }}
steps:
- name: Set default inputs for dispatch
id: settings
run: |
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
echo "environ=${{ inputs.environment }}" >> $GITHUB_OUTPUT
echo "preview=${{ inputs.preview }}" >> $GITHUB_OUTPUT
echo "dry_run=${{ inputs.dry_run }}" >> $GITHUB_OUTPUT
else
echo "environ=NO_ENVIRONMENT" >> $GITHUB_OUTPUT
echo "preview=true" >> $GITHUB_OUTPUT
echo "dry_run=true" >> $GITHUB_OUTPUT
fi
- name: Checkout source
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: "9.x"
dotnet-quality: "ga"
- name: Install dependencies
run: |
sudo apt-get update && sudo apt-get install -y libxml2-utils
dotnet tool install --global GitVersion.Tool --version 6.0.5
- name: Show GitVersion config
run: dotnet-gitversion -config src/gitversion.yml -showconfig
- name: Generate version info
id: gitversion
run: dotnet-gitversion -config src/gitversion.yml -updateassemblyinfo
- name: Compose version
id: version_info
run: |
# base version
base="${{ steps.gitversion.outputs.MajorMinorPatch }}"
# conditional suffix
if [[ "${{ steps.settings.outputs.preview }}" == "true" ]]; then
suffix="${{ steps.gitversion.outputs.PreReleaseTagWithDash }}"
else
suffix=""
fi
ver="${base}${suffix}"
echo "version=$ver" >> "$GITHUB_OUTPUT"
- name: Compose package info
id: package_info
run: |
PACKAGE_NAME=$(xmllint --xpath "//PropertyGroup/PackageId/text()" src/Indicators.csproj)
echo "name=${PACKAGE_NAME}" >> $GITHUB_OUTPUT
if [[ "${{ steps.settings.outputs.environ }}" == "nuget.org" ]]; then
echo "url=https://www.nuget.org/packages/${PACKAGE_NAME}/${{ steps.version_info.outputs.version }}" >> $GITHUB_OUTPUT
else
echo "url=https://github.com/${{ github.repository }}/packages/nuget/${PACKAGE_NAME}/${{ steps.version_info.outputs.version }}" >> $GITHUB_OUTPUT
fi
- name: Build library
run: >
dotnet build src/Indicators.csproj
--configuration Release
--property:Version=${{ steps.version_info.outputs.version }}
--property:ContinuousIntegrationBuild=true
-warnAsError
- name: Pack for NuGet
run: >
dotnet pack src/Indicators.csproj
--configuration Release
--no-build
--include-symbols
--output NuGet
-p:PackageVersion=${{ steps.version_info.outputs.version }}
- name: Save package
uses: actions/upload-artifact@v4
with:
name: packages
path: NuGet
include-hidden-files: true
- name: Summary output
run: |
{
echo "| Version No. | Component |"
echo "| :---------------- | :----------------------------------------------- |"
echo "| Base version | ${{ steps.gitversion.outputs.MajorMinorPatch }} |"
echo "| PreReleaseTag | ${{ steps.gitversion.outputs.PreReleaseTag }} |"
echo "| PreReleaseNumber | ${{ steps.gitversion.outputs.PreReleaseNumber }} |"
echo "| Composed | ${{ steps.version_info.outputs.version }} |"
echo "| Package | ${{ steps.package_info.outputs.name }} |"
echo "| Package URL | ${{ steps.package_info.outputs.url }} |"
} >> $GITHUB_STEP_SUMMARY
deploy:
needs: package
runs-on: ubuntu-latest
if: success()
permissions:
contents: write
packages: write
environment:
name: ${{ needs.package.outputs.environ }}
url: ${{ needs.package.outputs.url }}
env:
version: ${{ needs.package.outputs.version }}
preview: ${{ needs.package.outputs.preview }}
dry_run: ${{ needs.package.outputs.dry_run }}
environ: ${{ needs.package.outputs.environ }}
url: ${{ needs.package.outputs.url }}
name: ${{ needs.package.outputs.name }}
NUGET_PUBLISH_URL: ${{ needs.package.outputs.environ == 'nuget.org' && 'https://api.nuget.org/v3/index.json' || 'https://nuget.pkg.github.com/${{ github.repository }}/index.json' }}
NUGET_API_KEY: ${{ needs.package.outputs.environ == 'nuget.org' && secrets.NUGET_TOKEN || secrets.GITHUB_TOKEN }}
steps:
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: "9.x"
dotnet-quality: "ga"
- name: Download package
uses: actions/download-artifact@v4
with:
name: packages
path: NuGet
- name: Publish package
if: ${{ !env.dry_run }}
run: >
dotnet nuget push NuGet/*.nupkg
--source "${{ env.NUGET_PUBLISH_URL }}"
--api-key "${{ env.NUGET_API_KEY }}"
--skip-duplicate
- name: Tag and draft release note
uses: ncipollo/release-action@v1
if: ${{ !env.dry_run && env.environ == 'nuget.org' }}
with:
body: |
## Release ${{ env.version }}
📦 Package deployed to [${{ env.environ }}](${{ env.url }})
### Package Details
- **Name**: ${{ env.name }}
- **Version**: ${{ env.version }}
- **Preview**: ${{ env.preview && 'Yes' || 'No' }}
generateReleaseNotes: true
draft: true
makeLatest: ${{ !env.preview }}
prerelease: ${{ env.preview }}
tag: v${{ env.version }}
commit: ${{ github.sha }}
token: ${{ secrets.GITHUB_TOKEN }}
- name: Deployment summary
if: always()
run: |
{
echo "## Package Deployment"
echo "| Parameter | Value |"
echo "|:------------|:------|"
echo "| Mode | ${{ env.dry_run && '🔍 DRY RUN' || '🚀 DEPLOY' }} |"
echo "| Status | ${{ job.status == 'success' && '✅ Success' || '❌ Failed' }} |"
echo "| Environment | ${{ env.environ }} |"
echo "| Version | ${{ env.version }} |"
echo "| Package | [${{ env.name }}](${{ env.url }}) |"
echo "| Preview | ${{ env.preview && '✓' || '✗' }} |"
} >> $GITHUB_STEP_SUMMARY