diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..8e837a0 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,95 @@ +name: Release on Version Change + +on: + push: + branches: + - master + +permissions: + contents: write + pull-requests: read + +jobs: + check-version: + runs-on: windows-latest + outputs: + version_updated: ${{ steps.check_version.outputs.updated }} + new_version: ${{ steps.get_version.outputs.version }} + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 # 获取全部提交历史以便比较标签 + + - name: Setup .NET 9.0 + uses: actions/setup-dotnet@v3 + with: + dotnet-version: '9.0.x' + + - name: Extract version from csproj + id: get_version + shell: pwsh + run: | + [xml]$csproj = Get-Content "./CRSim/CRSim.csproj" + # 确保选择包含Version的PropertyGroup + $version = $csproj.Project.PropertyGroup.Version + echo "Detected version: $version" + # 将版本设置为步骤输出 + echo "version=$version" >> $env:GITHUB_OUTPUT + + - name: Compare with latest tag + id: check_version + shell: pwsh + run: | + # 获取最新标签(按语义版本排序) + $latestTag = git tag --list --sort=-v:refname | Select-Object -First 1 + echo "Latest tag: $latestTag" + + # 获取csproj中的版本 + $currentVersion = "v${{ steps.get_version.outputs.version }}" + + if (-not $latestTag) { + echo "首次发布,没有现有标签" + echo "updated=true" >> $env:GITHUB_OUTPUT + } elseif ($currentVersion -ne $latestTag) { + echo "检测到新版本: $currentVersion (旧版本: $latestTag)" + echo "updated=true" >> $env:GITHUB_OUTPUT + } else { + echo "版本未变化,跳过发布" + echo "updated=false" >> $env:GITHUB_OUTPUT + } + + release: + needs: check-version + if: ${{ needs.check-version.outputs.version_updated == 'true' }} + runs-on: windows-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Setup .NET 9.0 + uses: actions/setup-dotnet@v3 + with: + dotnet-version: '9.0.x' + + - name: Restore and Build + run: | + dotnet restore + dotnet build --configuration Release --no-restore + + - name: Publish + run: dotnet publish -c Release -o out + + - name: Create Zip Package + shell: pwsh + run: | + $version = "${{ needs.check-version.outputs.new_version }}" + Compress-Archive -Path out/* -DestinationPath "CRSim-release-$version.zip" + + - name: Create GitHub Release + uses: softprops/action-gh-release@v2 + with: + tag_name: v${{ needs.check-version.outputs.new_version }} + name: ${{ needs.check-version.outputs.new_version }} + files: CRSim-release-${{ needs.check-version.outputs.new_version }}.zip \ No newline at end of file