Files
CRSim/.github/workflows/release.yml
2025-03-02 11:54:22 +08:00

150 lines
5.0 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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