diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6283e55..f238d75 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,13 +1,10 @@ name: Release on: - push: - tags: - - "v*" workflow_dispatch: inputs: - tag: - description: Release tag to build/publish (for example v0.1.0) + version: + description: Release version to build/publish (for example 0.4.0) required: true type: string publish_nuget: @@ -30,6 +27,7 @@ jobs: runs-on: ubuntu-latest outputs: release_tag: ${{ steps.info.outputs.release_tag }} + build_ref: ${{ steps.info.outputs.build_ref }} publish_env: ${{ steps.info.outputs.publish_env }} publish_nuget: ${{ steps.info.outputs.publish_nuget }} dry_run: ${{ steps.info.outputs.dry_run }} @@ -61,50 +59,43 @@ jobs: } } - $eventName = '${{ github.event_name }}' - $githubRef = '${{ github.ref }}' + $runSha = '${{ github.sha }}' $sourceBranch = '${{ github.ref_name }}' + $buildRef = $runSha - if ($eventName -eq 'push' -and $githubRef.StartsWith('refs/tags/v')) { - $releaseTag = '${{ github.ref_name }}' + $releaseVersion = '${{ github.event.inputs.version }}'.Trim() + if ([string]::IsNullOrWhiteSpace($releaseVersion)) { + throw 'Workflow input version is required.' + } - git fetch --prune --no-tags origin '+refs/heads/*:refs/remotes/origin/*' - $containsMaster = @(git branch -r --contains '${{ github.sha }}' | ForEach-Object { $_.Trim() }) -contains 'origin/master' - if ($containsMaster) { - $sourceBranch = 'master' - } - else { - $sourceBranch = 'non-master' - } + if ($releaseVersion.StartsWith('v')) { + $releaseVersion = $releaseVersion.Substring(1) } - else { - $releaseTag = '${{ github.event.inputs.tag }}' + + if ($releaseVersion -notmatch '^\d+\.\d+\.\d+([-.][0-9A-Za-z.-]+)?$') { + throw "Invalid version format: $releaseVersion (expected 1.2.3 or 1.2.3-suffix)." } + $releaseTag = "v$releaseVersion" + if (-not $releaseTag.StartsWith('v')) { throw "Release tag must start with 'v'. Actual: $releaseTag" } - if ($sourceBranch -eq 'master') { + $isMasterBranch = $sourceBranch -eq 'master' + + if ($isMasterBranch) { $publishEnv = 'publish-prod' } else { $publishEnv = 'publish-test' } - if ($eventName -eq 'push' -and $githubRef.StartsWith('refs/tags/v')) { - $publishNuget = $true - } - else { - $publishNuget = Parse-BoolOrDefault '${{ github.event.inputs.publish_nuget }}' $false - } + $publishNuget = Parse-BoolOrDefault '${{ github.event.inputs.publish_nuget }}' $false - $dryRun = $false - if ($eventName -eq 'workflow_dispatch') { - $dryRun = Parse-BoolOrDefault '${{ github.event.inputs.dry_run_nuget }}' $true - } + $dryRun = Parse-BoolOrDefault '${{ github.event.inputs.dry_run_nuget }}' $true - if ($publishEnv -ne 'publish-prod') { + if (-not $isMasterBranch) { $dryRun = $true } @@ -113,11 +104,13 @@ jobs: } "release_tag=$releaseTag" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append + "build_ref=$buildRef" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append "publish_env=$publishEnv" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append "publish_nuget=$($publishNuget.ToString().ToLowerInvariant())" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append "dry_run=$($dryRun.ToString().ToLowerInvariant())" | Out-File -FilePath $env:GITHUB_OUTPUT -Encoding utf8 -Append Write-Host "::notice::Release tag: $releaseTag" + Write-Host "::notice::Build ref: $buildRef" Write-Host "::notice::Source branch: $sourceBranch" Write-Host "::notice::Publish environment: $publishEnv" Write-Host "::notice::Publish NuGet: $($publishNuget.ToString().ToLowerInvariant())" @@ -172,7 +165,7 @@ jobs: - name: Checkout uses: actions/checkout@v4 with: - ref: ${{ needs.preflight.outputs.release_tag }} + ref: ${{ needs.preflight.outputs.build_ref }} - name: Install Rust toolchain shell: pwsh @@ -489,10 +482,8 @@ jobs: $createArgs += "dist/checksums.txt" $createArgs += "--generate-notes" - if ($env:GITHUB_EVENT_NAME -eq 'workflow_dispatch') { - $createArgs += "--target" - $createArgs += "$env:RELEASE_TARGET" - } + $createArgs += "--target" + $createArgs += "$env:RELEASE_TARGET" gh release create @createArgs } @@ -509,9 +500,6 @@ jobs: needs: - preflight - sign_windows - if: | - (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')) || - (github.event_name == 'workflow_dispatch' && startsWith(github.event.inputs.tag, 'v')) steps: - name: Checkout @@ -559,9 +547,6 @@ jobs: needs: - preflight - sign_windows - if: | - (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')) || - (github.event_name == 'workflow_dispatch' && startsWith(github.event.inputs.tag, 'v')) steps: - name: Checkout