🐛 修复tag获取错误问题
Hello from ImmortalWrt / say-hello (push) Successful in 0s Details

This commit is contained in:
csh 2025-11-02 23:03:22 +08:00
parent 0bb627fd34
commit 84e2751668
1 changed files with 89 additions and 11 deletions

View File

@ -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 已作为附件上传
💡 **说明**: 检测到这是重建已删除的 tagCHANGELOG 中已包含所有提交内容,因此直接从现有内容创建 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 "💡 说明: 检测到这是重建已删除的 tagCHANGELOG 中已包含"
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 "✅ 清理完成"