v1.2.0-alpha03 #12
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |