mirror of
https://github.com/denglihong2007/CRSim
synced 2026-08-13 04:55:43 +08:00
150 lines
5.0 KiB
YAML
150 lines
5.0 KiB
YAML
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 = "${{ 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: Generate Release Notes
|
||
id: release_notes
|
||
shell: pwsh
|
||
run: |
|
||
# 获取最新 Release 版本号
|
||
$latestTag = gh release list --limit 1 --json tagName --jq ".[0].tagName" 2>$null
|
||
if (-not $latestTag) {
|
||
$latestTag = ""
|
||
}
|
||
|
||
# 初始化日志文件
|
||
$releaseNotesPath = "release_notes.md"
|
||
Set-Content -Path $releaseNotesPath -Value "## 更新日志"
|
||
|
||
# 如果没有最新 Release,则获取所有 commit
|
||
if (-not $latestTag) {
|
||
Add-Content -Path $releaseNotesPath -Value "`n### 初始版本"
|
||
$commitLogs = git log --pretty=format:"%s"
|
||
} else {
|
||
Add-Content -Path $releaseNotesPath -Value "`n### 更新日志 (从 $latestTag)"
|
||
$commitLogs = git log $latestTag..HEAD --pretty=format:"%s"
|
||
}
|
||
|
||
# 解析 Conventional Commits
|
||
$features = @()
|
||
$fixes = @()
|
||
$others = @()
|
||
|
||
foreach ($log in $commitLogs) {
|
||
if ($log -match "^feat!:? (.+)") {
|
||
$features += "- 🚀 **$($matches[1])**"
|
||
} elseif ($log -match "^fix!:? (.+)") {
|
||
$fixes += "- 🐛 **$($matches[1])**"
|
||
} elseif ($log -match "^(chore|docs|refactor|test|style): (.+)") {
|
||
$others += "- 🔧 **$($matches[2])**"
|
||
}
|
||
}
|
||
|
||
# 写入日志文件
|
||
if ($features.Count -gt 0) {
|
||
Add-Content -Path $releaseNotesPath -Value "`n### ✨ 特性 (Features)`n"
|
||
Add-Content -Path $releaseNotesPath -Value ($features -join "`n")
|
||
}
|
||
|
||
if ($fixes.Count -gt 0) {
|
||
Add-Content -Path $releaseNotesPath -Value "`n### 🐞 修复 (Fixes)`n"
|
||
Add-Content -Path $releaseNotesPath -Value ($fixes -join "`n")
|
||
}
|
||
|
||
if ($others.Count -gt 0) {
|
||
Add-Content -Path $releaseNotesPath -Value "`n### 🛠 其他更新 (Other Updates)`n"
|
||
Add-Content -Path $releaseNotesPath -Value ($others -join "`n")
|
||
}
|
||
|
||
- 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 }}
|
||
body_path: release_notes.md
|
||
files: CRSim-release-${{ needs.check-version.outputs.new_version }}.zip |