Skip to content

v1.2.0-alpha03

v1.2.0-alpha03 #12

Workflow file for this run

name: Release - CLI - Publish to NuGet
on:
release:
types: [published]
jobs:
cli-publish-to-nuget:
runs-on: windows-latest
if: github.repository == 'prjseal/Package-Script-Writer'
permissions:
contents: write # Allow uploading release assets
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup .NET 10
uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'
- name: Extract version from release tag
id: version
shell: pwsh
run: |
$releaseTag = "${{ github.event.release.tag_name }}"
Write-Host "Release tag: $releaseTag"
# Remove 'v' prefix if present (e.g., v1.0.0 -> 1.0.0)
$version = $releaseTag -replace '^v', ''
# Validate version format
if ($version -notmatch '^\d+\.\d+\.\d+(-.*)?$') {
Write-Error "Invalid version format: $version. Expected format: X.Y.Z or X.Y.Z-suffix"
exit 1
}
Write-Host "Extracted version: $version"
echo "version=$version" >> $env:GITHUB_OUTPUT
# Determine if it's a prerelease
$isPrerelease = if ('${{ github.event.release.prerelease }}' -eq 'true' -or $version -match '-') { 'true' } else { 'false' }
echo "is_prerelease=$isPrerelease" >> $env:GITHUB_OUTPUT
Write-Host "Is prerelease: $isPrerelease"
- name: Display version info
shell: pwsh
run: |
Write-Host "═══════════════════════════════════════"
Write-Host "📦 CLI Tool Release Information"
Write-Host "═══════════════════════════════════════"
Write-Host "Release Tag: ${{ github.event.release.tag_name }}"
Write-Host "Version: ${{ steps.version.outputs.version }}"
Write-Host "Prerelease: ${{ steps.version.outputs.is_prerelease }}"
Write-Host "Release Name: ${{ github.event.release.name }}"
Write-Host "═══════════════════════════════════════"
- name: Restore dependencies
shell: pwsh
run: |
Write-Host "Restoring dependencies for CLI tool..."
dotnet restore ./src/PackageCliTool/PackageCliTool.csproj
- name: Build CLI tool
shell: pwsh
run: |
Write-Host "Building CLI tool..."
dotnet build ./src/PackageCliTool/PackageCliTool.csproj `
--configuration Release `
--no-restore `
/p:Version="${{ steps.version.outputs.version }}" `
/p:RunPreBuildEvent=false
- name: Pack CLI tool
shell: pwsh
run: |
Write-Host "Packing CLI tool..."
# Create output directory
New-Item -ItemType Directory -Force -Path "./artifacts/nuget" | Out-Null
# Pack the CLI tool with the version from the release
dotnet pack ./src/PackageCliTool/PackageCliTool.csproj `
--configuration Release `
--no-build `
--output "./artifacts/nuget" `
/p:Version="${{ steps.version.outputs.version }}" `
/p:PackageVersion="${{ steps.version.outputs.version }}"
Write-Host "Package created successfully!"
Get-ChildItem "./artifacts/nuget/*.nupkg" | ForEach-Object {
Write-Host " 📦 $($_.Name)"
}
- name: Upload NuGet packages as artifacts
uses: actions/upload-artifact@v4
with:
name: cli-nuget-package-${{ steps.version.outputs.version }}
path: |
./artifacts/nuget/*.nupkg
./artifacts/nuget/*.snupkg
if-no-files-found: error
- name: Publish to NuGet.org
id: publish
shell: pwsh
env:
NUGET_API_KEY: ${{ secrets.NUGET_API_KEY }}
run: |
Write-Host "Publishing CLI tool to NuGet.org..."
$publishResults = @{
MainPackages = @()
SymbolPackages = @()
Errors = @()
}
# Publish main package (.nupkg)
$packages = Get-ChildItem "./artifacts/nuget/*.nupkg"
foreach ($package in $packages) {
Write-Host "Publishing $($package.Name)..."
dotnet nuget push $package.FullName `
--api-key $env:NUGET_API_KEY `
--source https://api.nuget.org/v3/index.json `
--skip-duplicate 2>&1 | Tee-Object -Variable publishOutput
if ($LASTEXITCODE -eq 0) {
Write-Host "✅ Successfully published $($package.Name)"
$publishResults.MainPackages += $package.Name
} else {
Write-Error "❌ Failed to publish $($package.Name)"
$publishResults.Errors += "Failed to publish $($package.Name)"
exit 1
}
}
# Publish symbol package (.snupkg) if it exists
$symbolPackages = Get-ChildItem "./artifacts/nuget/*.snupkg" -ErrorAction SilentlyContinue
if ($symbolPackages) {
foreach ($symbolPackage in $symbolPackages) {
Write-Host "Publishing symbols $($symbolPackage.Name)..."
dotnet nuget push $symbolPackage.FullName `
--api-key $env:NUGET_API_KEY `
--source https://api.nuget.org/v3/index.json `
--skip-duplicate 2>&1 | Out-Null
if ($LASTEXITCODE -eq 0) {
Write-Host "✅ Successfully published $($symbolPackage.Name)"
$publishResults.SymbolPackages += $symbolPackage.Name
} else {
Write-Warning "⚠️ Failed to publish $($symbolPackage.Name) (non-critical)"
}
}
} else {
Write-Host "ℹ️ No symbol packages found (this is optional)"
}
Write-Host "All packages published successfully!"
# Save results for summary
$publishResults | ConvertTo-Json | Out-File -FilePath "publish-results.json"
- name: Add package to release assets
shell: pwsh
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
Write-Host "Adding package to release assets..."
$releaseTag = "${{ github.event.release.tag_name }}"
$packages = Get-ChildItem "./artifacts/nuget/*.nupkg"
foreach ($package in $packages) {
Write-Host "Uploading $($package.Name) to release $releaseTag..."
gh release upload $releaseTag $package.FullName --clobber
if ($LASTEXITCODE -eq 0) {
Write-Host "✅ Successfully uploaded $($package.Name) to release"
} else {
Write-Warning "⚠️ Failed to upload $($package.Name) to release"
}
}
- name: Generate Summary
if: always()
shell: pwsh
run: |
# Load publish results if available
$publishResults = if (Test-Path "publish-results.json") {
Get-Content "publish-results.json" | ConvertFrom-Json
} else {
$null
}
$version = "${{ steps.version.outputs.version }}"
$isPrerelease = "${{ steps.version.outputs.is_prerelease }}" -eq "true"
$releaseTag = "${{ github.event.release.tag_name }}"
$releaseUrl = "${{ github.event.release.html_url }}"
# Determine overall status
$publishStatus = if ($publishResults -and $publishResults.Errors.Count -eq 0) {
"✅ Success"
} elseif ($publishResults -and $publishResults.Errors.Count -gt 0) {
"❌ Failed"
} else {
"⚠️ Unknown"
}
# Create GitHub Actions Summary
@"
# 🚀 CLI Publish Summary
## Package Information
| Property | Value |
|----------|-------|
| **Package Name** | PackageScriptWriter.Cli |
| **Version** | \`$version\` |
| **Release Tag** | [$releaseTag]($releaseUrl) |
| **Prerelease** | $(if ($isPrerelease) { "⚠️ Yes" } else { "✅ No" }) |
## Publication Results
### Status: $publishStatus
$(if ($publishResults) {
if ($publishResults.MainPackages.Count -gt 0) {
"#### 📦 Published Packages`n"
foreach ($pkg in $publishResults.MainPackages) {
"- ✅ ``$pkg``"
}
"`n"
}
if ($publishResults.SymbolPackages.Count -gt 0) {
"#### 🔍 Published Symbol Packages`n"
foreach ($pkg in $publishResults.SymbolPackages) {
"- ✅ ``$pkg``"
}
"`n"
}
if ($publishResults.Errors.Count -gt 0) {
"#### ❌ Errors`n"
foreach ($err in $publishResults.Errors) {
"- ❌ $err"
}
"`n"
}
} else {
"Unable to load publication results."
})
### 🌐 Published To
- **NuGet.org**: [https://www.nuget.org/packages/PackageScriptWriter.Cli/$version](https://www.nuget.org/packages/PackageScriptWriter.Cli/$version)
- **GitHub Release**: [$releaseTag]($releaseUrl)
## Installation
Install the CLI tool globally:
``````bash
dotnet tool install --global PackageScriptWriter.Cli --version $version
``````
Or update existing installation:
``````bash
dotnet tool update --global PackageScriptWriter.Cli --version $version
``````
## Artifacts
- 📦 NuGet package attached to [GitHub Release]($releaseUrl)
---
*Release published: ${{ github.event.release.published_at }}*
*Workflow run: [${{ github.run_id }}](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})*
"@ | Out-File -FilePath $env:GITHUB_STEP_SUMMARY -Encoding utf8