From 84e275166844d9fd410a7aba3e32807683784970 Mon Sep 17 00:00:00 2001 From: csh Date: Sun, 2 Nov 2025 23:03:22 +0800 Subject: [PATCH] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8Dtag=E8=8E=B7=E5=8F=96?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/changelog_and_release.yml | 100 ++++++++++++++++++--- 1 file changed, 89 insertions(+), 11 deletions(-) diff --git a/.gitea/workflows/changelog_and_release.yml b/.gitea/workflows/changelog_and_release.yml index 9bdd150..ee3c3e1 100644 --- a/.gitea/workflows/changelog_and_release.yml +++ b/.gitea/workflows/changelog_and_release.yml @@ -236,9 +236,10 @@ jobs: git clean -fdx git reset --hard - # 获取最新代码 + # 获取最新代码和标签,同时清理远程已删除的 tag echo "📥 拉取最新代码和标签..." - git fetch --all --tags --force + git fetch --all --tags --force --prune --prune-tags + echo "✓ 已同步远程状态(包括已删除的 tag)" echo "✓ 仓库已更新" else @@ -392,13 +393,44 @@ jobs: echo "" # 查找前一个 tag - PREVIOUS_TAG=$(git tag --sort=-version:refname | grep -v "^${VERSION}$" | head -n 1) + # 排除所有属于当前 CHANGELOG 版本的 tag(例如 0.0.2-rc1, 0.0.2-rc2 都属于 0.0.2) + echo "🔍 查找前一个版本的 tag..." + + # 获取所有 tag + ALL_TAGS=$(git tag --sort=-version:refname) + + # 遍历查找第一个不属于当前 CHANGELOG 版本的 tag + PREVIOUS_TAG="" + while IFS= read -r tag; do + # 跳过空行 + [ -z "$tag" ] && continue + + # 对每个 tag 执行 strip 操作(去除 pre-release 后缀) + if [[ "${{ env.CHANGELOG_VERSION_MODE }}" == "strip" ]]; then + tag_stripped=$(echo "$tag" | sed -E 's/-(alpha|beta|rc|pre|preview|dev|test)[0-9]*$//') + else + tag_stripped="$tag" + fi + + # 如果这个 tag 的 CHANGELOG 版本不等于当前版本,就是我们要找的 + if [ "$tag_stripped" != "$CHANGELOG_VERSION" ]; then + PREVIOUS_TAG="$tag" + break + fi + done <<< "$ALL_TAGS" if [ -z "$PREVIOUS_TAG" ]; then echo "ℹ️ No previous tag found, using all commits" COMMIT_RANGE="" else echo "📍 Previous tag: $PREVIOUS_TAG" + + # 对 previous tag 也执行 strip,显示对应的 CHANGELOG 版本 + if [[ "${{ env.CHANGELOG_VERSION_MODE }}" == "strip" ]]; then + PREV_CHANGELOG_VERSION=$(echo "$PREVIOUS_TAG" | sed -E 's/-(alpha|beta|rc|pre|preview|dev|test)[0-9]*$//') + echo " (对应 CHANGELOG 版本: $PREV_CHANGELOG_VERSION)" + fi + COMMIT_RANGE="${PREVIOUS_TAG}..${VERSION}" fi @@ -552,6 +584,7 @@ jobs: # 检查内容是否真的改变 content_changed = (new_content != existing_content) + version_exists = f"## :bookmark: {changelog_version}" in existing_content if content_changed: with open(changelog_file, 'w', encoding='utf-8') as f: @@ -562,17 +595,36 @@ jobs: with open('/tmp/changelog_updated.txt', 'w') as f: f.write('true') - else: + with open('/tmp/content_changed.txt', 'w') as f: + f.write('true') + elif version_exists: + # 内容没有变化,但版本已存在 + # 这通常发生在重建已删除的 tag + # 我们仍然应该创建 Release(从现有 CHANGELOG 提取内容) print(f"ℹ️ No new content to add") print(f" Version {changelog_version} already contains all {len(commits)} commits") print(f" This usually happens when recreating a deleted tag") + print(f" Will still create Release from existing CHANGELOG content") with open('/tmp/changelog_updated.txt', 'w') as f: + f.write('true') # 返回 true 以触发 Release 创建 + with open('/tmp/content_changed.txt', 'w') as f: + f.write('false') # 但文件没有变化,不需要提交 + else: + # 既没有新内容,版本也不存在(不应该发生) + print(f"⚠️ Unexpected state: no content change and version doesn't exist") + + with open('/tmp/changelog_updated.txt', 'w') as f: + f.write('false') + with open('/tmp/content_changed.txt', 'w') as f: f.write('false') PYSCRIPT UPDATED=$(cat /tmp/changelog_updated.txt) + CONTENT_CHANGED=$(cat /tmp/content_changed.txt 2>/dev/null || echo "false") + echo "changelog_updated=$UPDATED" >> $GITHUB_OUTPUT + echo "content_changed=$CONTENT_CHANGED" >> $GITHUB_OUTPUT if [ "$UPDATED" = "true" ]; then echo "" @@ -587,7 +639,7 @@ jobs: - name: 📤 提交 CHANGELOG 到主分支 id: commit - if: steps.changelog.outputs.changelog_updated == 'true' + if: steps.changelog.outputs.content_changed == 'true' run: | echo "======================================" echo "📤 提交 CHANGELOG 更新" @@ -868,7 +920,8 @@ jobs: 版本 `${{ env.CHANGELOG_VERSION }}` 已存在于 CHANGELOG.md 中。 EOFEXIST elif [ "${{ steps.changelog.outputs.changelog_updated }}" = "true" ]; then - cat >> $GITHUB_STEP_SUMMARY << 'EOFSUCCESS' + if [ "${{ steps.changelog.outputs.content_changed }}" = "true" ]; then + cat >> $GITHUB_STEP_SUMMARY << 'EOFSUCCESS' | 📋 执行状态 | ✅ 执行成功 | --- @@ -880,6 +933,21 @@ jobs: - ✅ Release 已创建 - ✅ CHANGELOG.md 已作为附件上传 EOFSUCCESS + else + cat >> $GITHUB_STEP_SUMMARY << 'EOFREBUILD' + | 📋 执行状态 | ✅ 执行成功 (重建 Tag) | + + --- + + ### ✅ 完成的操作 + + - ℹ️ CHANGELOG.md 无需更新(内容已存在) + - ✅ Release 已创建 + - ✅ CHANGELOG.md 已作为附件上传 + + 💡 **说明**: 检测到这是重建已删除的 tag,CHANGELOG 中已包含所有提交内容,因此直接从现有内容创建 Release。 + EOFREBUILD + fi if [ -n "${{ env.ADDITIONAL_RELEASE_FILES }}" ]; then echo "- ✅ 额外文件已上传" >> $GITHUB_STEP_SUMMARY @@ -949,10 +1017,20 @@ jobs: echo " - Release 标题: ${{ env.RELEASE_TITLE_PROCESSED }}" echo " - Pre-release: ${{ env.RELEASE_IS_PRERELEASE }}" echo "" - echo "✅ 已完成的操作:" - echo " - CHANGELOG.md 已更新并推送到 ${{ env.MAIN_BRANCH }} 分支" - echo " - Release 已创建" - echo " - CHANGELOG.md 已上传为附件" + + if [ "${{ steps.changelog.outputs.content_changed }}" = "true" ]; then + echo "✅ 已完成的操作:" + echo " - CHANGELOG.md 已更新并推送到 ${{ env.MAIN_BRANCH }} 分支" + echo " - Release 已创建" + echo " - CHANGELOG.md 已上传为附件" + else + echo "✅ 已完成的操作:" + echo " - Release 已创建(从现有 CHANGELOG 内容)" + echo " - CHANGELOG.md 已上传为附件" + echo "" + echo "💡 说明: 检测到这是重建已删除的 tag,CHANGELOG 中已包含" + echo " 所有提交内容,因此直接从现有内容创建 Release。" + fi else echo "ℹ️ 无新内容需要更新" echo "" @@ -975,5 +1053,5 @@ jobs: if: always() run: | echo "🧹 清理临时文件..." - rm -rf /tmp/commits.txt /tmp/changelog_updated.txt /tmp/release-body.txt /tmp/payload.json /tmp/release_response.json /tmp/upload_response_*.json + rm -rf /tmp/commits.txt /tmp/changelog_updated.txt /tmp/content_changed.txt /tmp/release-body.txt /tmp/payload.json /tmp/release_response.json /tmp/upload_response_*.json echo "✅ 清理完成" \ No newline at end of file