Skip to content

Merge pull request #29 from TrueNine/dev #24

Merge pull request #29 from TrueNine/dev

Merge pull request #29 from TrueNine/dev #24

name: Publish to Maven Central
on:
push:
branches: [ main ]
tags: [ '🚀*' ]
release:
types: [ published ]
workflow_dispatch:
inputs:
version:
description: 'Release version (e.g., 1.0.0)'
required: true
type: string
dry_run:
description: '是否执行试运行(不实际发布)'
type: boolean
default: false
force_publish:
description: '强制发布(忽略版本检测)'
type: boolean
default: false
skip_tests:
description: '跳过测试(仅用于紧急发布)'
type: boolean
default: false
# 并发控制:防止同时触发多个发布任务
concurrency:
group: maven-publish-${{ github.ref }}
cancel-in-progress: false
env:
GRADLE_OPTS: "-Dorg.gradle.daemon=false -Dorg.gradle.parallel=true -Dorg.gradle.workers.max=4 -Dorg.gradle.configuration-cache=true"
JVM_OPTS: "-Xmx4g -XX:MaxMetaspaceSize=1536m -XX:+UseG1GC -XX:G1HeapRegionSize=16m"
jobs:
# 🧪 发布前验证
pre-publish-validation:
name: "🧪 Pre-publish Validation"
runs-on: ubuntu-latest
timeout-minutes: 30
outputs:
version: ${{ steps.version-info.outputs.version }}
is-snapshot: ${{ steps.version-info.outputs.is-snapshot }}
should-publish: ${{ steps.version-info.outputs['should-publish'] }}
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up JDK 24
uses: actions/setup-java@v4
with:
java-version: '24'
distribution: 'graalvm'
cache: gradle
- name: Cache Gradle wrapper
uses: actions/cache@v4
with:
path: |
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-wrapper-${{ hashFiles('**/gradle/wrapper/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-wrapper-
- name: Cache Gradle dependencies
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/jdks
~/.gradle/buildOutputCleanup
~/.gradle/kotlin
~/.konan
~/.m2/repository
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', 'gradle/libs.versions.toml') }}
restore-keys: |
${{ runner.os }}-gradle-
save-always: true
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
with:
gradle-version: '9.0.0'
- name: Grant execute permission
run: chmod +x gradlew
- name: Extract version information
id: version-info
run: |
# 语义化版本验证函数
validate_semver() {
local version="$1"
# 支持标准语义化版本格式:x.y.z[-prerelease][+build]
if [[ "$version" =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[a-zA-Z0-9\.-]+)?(\+[a-zA-Z0-9\.-]+)?$ ]]; then
return 0
else
return 1
fi
}
# 确定当前版本
echo "🔍 确定发布版本..." >> $GITHUB_STEP_SUMMARY
if [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
version="${{ github.event.inputs.version }}"
echo "📝 手动指定版本: $version" >> $GITHUB_STEP_SUMMARY
elif [[ "${{ github.event_name }}" == "release" ]]; then
version="${{ github.event.release.tag_name }}"
version=${version#v} # 移除可能的 'v' 前缀
echo "🏷️ Release 标签版本: $version" >> $GITHUB_STEP_SUMMARY
elif [[ "${{ github.ref_type }}" == "tag" ]]; then
version="${{ github.ref_name }}"
version=${version#v} # 移除可能的 'v' 前缀
echo "🏷️ 标签触发版本: $version" >> $GITHUB_STEP_SUMMARY
else
# push event: parse from libs.versions.toml
version=$(sed -n 's/^project\s*=\s*"\(.*\)"/\1/p' gradle/libs.versions.toml | head -n1)
echo "📄 从 libs.versions.toml 读取版本: $version" >> $GITHUB_STEP_SUMMARY
fi
# 验证版本格式
if ! validate_semver "$version"; then
echo "❌ 版本格式无效: $version" >> $GITHUB_STEP_SUMMARY
echo "版本必须符合语义化版本规范 (x.y.z[-prerelease][+build])" >> $GITHUB_STEP_SUMMARY
exit 1
fi
echo "version=$version" >> $GITHUB_OUTPUT
echo "✅ 版本格式验证通过: $version" >> $GITHUB_STEP_SUMMARY
# 确定快照状态
if [[ "$version" == *"-SNAPSHOT" ]] || [[ "$version" == *"-alpha"* ]] || [[ "$version" == *"-beta"* ]] || [[ "$version" == *"-rc"* ]]; then
echo "is-snapshot=true" >> $GITHUB_OUTPUT
echo "📦 预发布版本类型" >> $GITHUB_STEP_SUMMARY
else
echo "is-snapshot=false" >> $GITHUB_OUTPUT
echo "🚀 正式发布版本类型" >> $GITHUB_STEP_SUMMARY
fi
# 简化的发布决策逻辑
should_publish="false"
force_publish="${{ github.event.inputs.force_publish }}"
echo "" >> $GITHUB_STEP_SUMMARY
echo "🔍 发布决策分析..." >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# 强制发布模式
if [[ "$force_publish" == "true" ]]; then
should_publish="true"
echo "⚡ **强制发布模式已启用**" >> $GITHUB_STEP_SUMMARY
# 明确的发布触发器
elif [[ "${{ github.ref_type }}" == "tag" ]] || [[ "${{ github.event_name }}" == "release" ]] || [[ "${{ github.event_name }}" == "workflow_dispatch" ]]; then
should_publish="true"
echo "🎯 **直接触发**:标签/Release/手动触发 - 将发布" >> $GITHUB_STEP_SUMMARY
# main 分支 push:检查版本变化
elif [[ "${{ github.ref }}" == "refs/heads/main" ]]; then
echo "🌱 **Main 分支 push**:检查版本变化..." >> $GITHUB_STEP_SUMMARY
# 使用更简单的版本检查方法
if git diff HEAD~1 --name-only | grep -q "gradle/libs.versions.toml"; then
prev_version=$(git show HEAD~1:gradle/libs.versions.toml 2>/dev/null | sed -n 's/^project\s*=\s*"\(.*\)"/\1/p' | head -n1 || echo "unknown")
if [[ "$prev_version" != "$version" && "$prev_version" != "unknown" ]]; then
should_publish="true"
echo " 🔼 检测到版本变化:$prev_version → $version" >> $GITHUB_STEP_SUMMARY
else
echo " ⚠️ 版本文件已变化,但版本号未变化" >> $GITHUB_STEP_SUMMARY
fi
else
echo " ⏭️ 版本文件未变化,跳过发布" >> $GITHUB_STEP_SUMMARY
fi
else
echo "⏭️ **其他情况**:非发布分支或事件,跳过发布" >> $GITHUB_STEP_SUMMARY
fi
echo "should-publish=$should_publish" >> $GITHUB_OUTPUT
# 最终决策摘要
echo "" >> $GITHUB_STEP_SUMMARY
if [[ "$should_publish" == "true" ]]; then
echo "✅ **发布决策:继续发布**" >> $GITHUB_STEP_SUMMARY
else
echo "⏭️ **发布决策:跳过发布**" >> $GITHUB_STEP_SUMMARY
fi
- name: Generate pre-publish report
run: |
echo "## 🚀 发布准备情况" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| 检查项 | 状态 |" >> $GITHUB_STEP_SUMMARY
echo "|--------|------|" >> $GITHUB_STEP_SUMMARY
echo "| 构建验证 | ✅ 通过 |" >> $GITHUB_STEP_SUMMARY
echo "| 核心测试 | ✅ 通过 |" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**版本:** ${{ steps.version-info.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "**类型:** ${{ steps.version-info.outputs.is-snapshot == 'true' && '快照版本' || '正式版本' }}" >> $GITHUB_STEP_SUMMARY
# 📦 Maven Central 发布
publish:
name: "📦 Publish to Maven Central"
needs: pre-publish-validation
if: ${{ needs.pre-publish-validation.outputs.should-publish == 'true' }}
runs-on: ubuntu-latest
timeout-minutes: 120
environment: maven-central
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Set up JDK 24
uses: actions/setup-java@v4
with:
java-version: '24'
distribution: 'graalvm'
cache: gradle
- name: Cache Gradle wrapper
uses: actions/cache@v4
with:
path: |
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-wrapper-${{ hashFiles('**/gradle/wrapper/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-wrapper-
- name: Cache Gradle dependencies
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/jdks
~/.gradle/buildOutputCleanup
~/.konan
~/.m2/repository
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties', 'gradle/libs.versions.toml') }}
restore-keys: |
${{ runner.os }}-gradle-
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
with:
gradle-version: '9.0.0'
cache-cleanup: on-success
- name: Grant execute permission
run: chmod +x gradlew
# 试运行模式
- name: Dry run publication
if: github.event.inputs.dry_run == 'true'
run: |
echo "🔍 执行发布试运行..."
./gradlew publishToMavenLocal \
--no-daemon \
--parallel \
-PsigningInMemoryKeyId="${{ secrets.GPG_KEY_ID }}" \
-PsigningInMemoryKey="${{ secrets.GPG_PRIVATE_KEY }}" \
-PsigningInMemoryKeyPassword="${{ secrets.GPG_PASSPHRASE }}"
env:
GRADLE_OPTS: "${{ env.GRADLE_OPTS }} ${{ env.JVM_OPTS }}"
CI: true
# 发布前验证
- name: Pre-publish validation
if: github.event.inputs.dry_run != 'true'
run: |
echo "🔍 发布前验证..."
# 验证必要的凭据
missing_secrets=()
[[ -z "${{ secrets.GPG_KEY_ID }}" ]] && missing_secrets+=("GPG_KEY_ID")
[[ -z "${{ secrets.GPG_PRIVATE_KEY }}" ]] && missing_secrets+=("GPG_PRIVATE_KEY")
[[ -z "${{ secrets.MAVENCENTRAL_USERNAME }}" ]] && missing_secrets+=("MAVENCENTRAL_USERNAME")
[[ -z "${{ secrets.MAVENCENTRAL_PASSWORD }}" ]] && missing_secrets+=("MAVENCENTRAL_PASSWORD")
[[ -z "${{ secrets.GPG_PASSPHRASE }}" ]] && missing_secrets+=("GPG_PASSPHRASE")
if [[ ${#missing_secrets[@]} -gt 0 ]]; then
echo "❌ 缺少必要的 Secrets: ${missing_secrets[*]}" >> $GITHUB_STEP_SUMMARY
exit 1
fi
# 验证网络连接
echo "🌍 验证网络连接..."
curl -f -s --max-time 10 https://oss.sonatype.org/ > /dev/null || {
echo "⚠️ Sonatype 网络连接异常" >> $GITHUB_STEP_SUMMARY
}
echo "✅ 验证通过" >> $GITHUB_STEP_SUMMARY
# 正式发布(增强版)
- name: Publish to Maven Central
if: github.event.inputs.dry_run != 'true'
uses: nick-fields/retry@v3
with:
timeout_minutes: 90
max_attempts: 3
retry_wait_seconds: 600
shell: bash
command: |
echo "🚀 开始发布到 Maven Central (attempt: ${{ github.run_attempt }})..."
# 设置错误处理
set -euo pipefail
# 分类错误处理函数
handle_error() {
local exit_code=$1
local error_context="$2"
echo "❌ 发布失败 (退出码: $exit_code)" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
case $exit_code in
1|2) echo "**错误类型:** 构建或配置错误" >> $GITHUB_STEP_SUMMARY ;;
3|4) echo "**错误类型:** GPG 签名失败" >> $GITHUB_STEP_SUMMARY ;;
5|6) echo "**错误类型:** Maven Central 连接失败" >> $GITHUB_STEP_SUMMARY ;;
*) echo "**错误类型:** 未知错误" >> $GITHUB_STEP_SUMMARY ;;
esac
echo "**错误上下文:** $error_context" >> $GITHUB_STEP_SUMMARY
exit $exit_code
}
trap 'handle_error $? "发布执行阶段"' ERR
echo "🔐 验证发布凭据..." >> $GITHUB_STEP_SUMMARY
echo "📦 开始发布流程..." >> $GITHUB_STEP_SUMMARY
./gradlew publishToMavenCentral \
--no-daemon \
--parallel \
--no-configuration-cache \
--stacktrace \
--info \
--continue \
-PsigningInMemoryKeyId="${{ secrets.GPG_KEY_ID }}" \
-PsigningInMemoryKey="${{ secrets.GPG_PRIVATE_KEY }}" \
-PmavenCentralUsername="${{ secrets.MAVENCENTRAL_USERNAME }}" \
-PmavenCentralPassword="${{ secrets.MAVENCENTRAL_PASSWORD }}" \
-PsigningInMemoryKeyPassword="${{ secrets.GPG_PASSPHRASE }}"
echo "✅ 发布到 Maven Central 成功" >> $GITHUB_STEP_SUMMARY
env:
GRADLE_OPTS: "${{ env.GRADLE_OPTS }} ${{ env.JVM_OPTS }}"
MAVENCENTRAL_USERNAME: ${{ secrets.MAVENCENTRAL_USERNAME }}
MAVENCENTRAL_PASSWORD: ${{ secrets.MAVENCENTRAL_PASSWORD }}
GPG_KEY_ID: ${{ secrets.GPG_KEY_ID }}
GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
CI: true
- name: Generate publication summary
run: |
echo "## 📦 发布完成" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**版本:** ${{ needs.pre-publish-validation.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "**状态:** ${{ github.event.inputs.dry_run == 'true' && '试运行完成 🧪' || '正式发布完成 🚀' }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
if [[ "${{ github.event.inputs.dry_run }}" != "true" ]]; then
echo "### 📋 发布后检查清单" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "- [ ] 验证 Maven Central 上的 artifact" >> $GITHUB_STEP_SUMMARY
echo "- [ ] 更新项目文档" >> $GITHUB_STEP_SUMMARY
echo "- [ ] 发布 GitHub Release 说明" >> $GITHUB_STEP_SUMMARY
echo "- [ ] 通知团队成员" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**Maven Central 链接:** https://search.maven.org/search?q=g:io.github.truenine" >> $GITHUB_STEP_SUMMARY
else
echo "✅ 试运行成功,所有模块都已正确构建和签名!" >> $GITHUB_STEP_SUMMARY
fi
# 🏷️ GitHub Release 创建
create-github-release:
name: "🏷️ Create GitHub Release"
needs: [ pre-publish-validation, publish ]
if: github.event.inputs.dry_run != 'true' && needs.pre-publish-validation.outputs.is-snapshot == 'false'
runs-on: ubuntu-latest
timeout-minutes: 10
permissions:
contents: write
steps:
- name: Checkout code
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Generate release notes
id: release-notes
run: |
version="${{ needs.pre-publish-validation.outputs.version }}"
# 生成发布说明
cat > release_notes.md << 'EOF'
## 🚀 Release ${{ needs.pre-publish-validation.outputs.version }}
### 📦 Maven Central Artifacts
This release is available on Maven Central Repository:
```kotlin
implementation("io.github.truenine:composeserver-{module-name}:${{ needs.pre-publish-validation.outputs.version }}")
```
```xml
<dependency>
<groupId>io.github.truenine</groupId>
<artifactId>composeserver-{module-name}</artifactId>
<version>${{ needs.pre-publish-validation.outputs.version }}</version>
</dependency>
```
### 🔗 Links
- [Maven Central Search](https://search.maven.org/search?q=g:io.github.truenine%20AND%20v:${{ needs.pre-publish-validation.outputs.version }})
- [Project Documentation](https://github.com/TrueNine/compose-server)
- [API Documentation](https://github.com/TrueNine/compose-server/tree/main/docs)
---
**Full Changelog**: https://github.com/TrueNine/compose-server/compare/v${{ needs.pre-publish-validation.outputs.version }}...HEAD
EOF
echo "Generated release notes for version $version"
- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ needs.pre-publish-validation.outputs.version }}
name: ${{ needs.pre-publish-validation.outputs.version }}
body_path: release_notes.md
draft: false
prerelease: false
generate_release_notes: true
make_latest: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Update release summary
run: |
echo "## 🏷️ GitHub Release 创建完成" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**版本标签:** v${{ needs.pre-publish-validation.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "**Release 链接:** https://github.com/TrueNine/compose-server/releases/tag/v${{ needs.pre-publish-validation.outputs.version }}" >> $GITHUB_STEP_SUMMARY
# 📋 发布后验证
post-publish-verification:
name: "📋 Post-publish Verification"
needs: [ pre-publish-validation, publish, create-github-release ]
if: github.event.inputs.dry_run != 'true' && always() && needs.publish.result == 'success'
runs-on: ubuntu-latest
timeout-minutes: 15
steps:
- name: Wait for Maven Central sync
run: |
echo "⏳ 等待 Maven Central 同步..."
sleep 300 # 等待 5 分钟
- name: Verify publication
run: |
version="${{ needs.pre-publish-validation.outputs.version }}"
group="io.github.truenine"
echo "🔍 验证发布的 artifacts..."
# 检查主要模块是否可用
modules=("shared" "gradle-plugin" "bom")
for module in "${modules[@]}"; do
artifact="${group}:composeserver-${module}:${version}"
echo "检查 $artifact ..."
# 尝试从 Maven Central 获取 metadata
url="https://search.maven.org/solrsearch/select?q=g:${group}+AND+a:composeserver-${module}+AND+v:${version}&rows=1&wt=json"
response=$(curl -s "$url" || echo '{"response":{"numFound":0}}')
found=$(echo "$response" | jq -r '.response.numFound')
if [[ "$found" -gt 0 ]]; then
echo "✅ $artifact 已成功发布"
else
echo "⚠️ $artifact 尚未在 Maven Central 上可见(可能仍在同步中)"
fi
done
- name: Generate verification report
run: |
echo "## 🔍 发布验证报告" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**版本:** ${{ needs.pre-publish-validation.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 📊 验证状态" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "- ⏳ Maven Central 同步可能需要几小时" >> $GITHUB_STEP_SUMMARY
echo "- 🔍 建议在 4-6 小时后再次验证" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 🔗 相关链接" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "- [Maven Central 搜索](https://search.maven.org/search?q=g:io.github.truenine)" >> $GITHUB_STEP_SUMMARY
echo "- [Sonatype Repository](https://oss.sonatype.org/)" >> $GITHUB_STEP_SUMMARY
# 检查 GitHub Release 状态
if [[ "${{ needs.create-github-release.result }}" == "success" ]]; then
echo "- [GitHub Release](https://github.com/TrueNine/compose-server/releases/tag/v${{ needs.pre-publish-validation.outputs.version }})" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "✅ **GitHub Release 创建成功**" >> $GITHUB_STEP_SUMMARY
elif [[ "${{ needs.create-github-release.result }}" == "skipped" ]]; then
echo "" >> $GITHUB_STEP_SUMMARY
echo "⏭️ **GitHub Release 已跳过**(预发布版本)" >> $GITHUB_STEP_SUMMARY
else
echo "" >> $GITHUB_STEP_SUMMARY
echo "⚠️ **GitHub Release 创建失败**,请手动创建" >> $GITHUB_STEP_SUMMARY
fi
# 🚨 失败处理
failure-handler:
name: "🚨 Handle Failure"
needs: [ pre-publish-validation, publish, create-github-release, post-publish-verification ]
if: always() && (needs.publish.result == 'failure' || needs.create-github-release.result == 'failure')
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Generate failure report
run: |
echo "## ❌ 发布失败报告" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**版本:** ${{ needs.pre-publish-validation.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "**触发事件:** ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY
echo "**失败时间:** $(date -u '+%Y-%m-%d %H:%M:%S UTC')" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 🔍 失败状态分析" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
if [[ "${{ needs.publish.result }}" == "failure" ]]; then
echo "- ❌ **Maven Central 发布失败**" >> $GITHUB_STEP_SUMMARY
echo " - 检查 GPG 签名配置" >> $GITHUB_STEP_SUMMARY
echo " - 验证 Maven Central 凭据" >> $GITHUB_STEP_SUMMARY
echo " - 确认网络连接正常" >> $GITHUB_STEP_SUMMARY
else
echo "- ✅ Maven Central 发布成功" >> $GITHUB_STEP_SUMMARY
fi
if [[ "${{ needs.create-github-release.result }}" == "failure" ]]; then
echo "- ❌ **GitHub Release 创建失败**" >> $GITHUB_STEP_SUMMARY
echo " - 检查 GITHUB_TOKEN 权限" >> $GITHUB_STEP_SUMMARY
echo " - 验证标签是否已存在" >> $GITHUB_STEP_SUMMARY
echo " - 确认仓库写入权限" >> $GITHUB_STEP_SUMMARY
elif [[ "${{ needs.create-github-release.result }}" == "success" ]]; then
echo "- ✅ GitHub Release 创建成功" >> $GITHUB_STEP_SUMMARY
fi
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 🛠️ 建议的修复步骤" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "1. 检查上述失败的组件配置" >> $GITHUB_STEP_SUMMARY
echo "2. 验证所有必要的 GitHub Secrets 是否正确配置" >> $GITHUB_STEP_SUMMARY
echo "3. 如果是网络问题,可以重新运行工作流" >> $GITHUB_STEP_SUMMARY
echo "4. 如果问题持续存在,请创建 Issue 报告问题" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "### 📞 获取帮助" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "- [创建 Issue](https://github.com/TrueNine/compose-server/issues/new)" >> $GITHUB_STEP_SUMMARY
echo "- [查看文档](https://github.com/TrueNine/compose-server/tree/main/docs)" >> $GITHUB_STEP_SUMMARY
# 📊 工作流摘要
workflow-summary:
name: "📊 Workflow Summary"
needs: [ pre-publish-validation, publish, create-github-release, post-publish-verification, failure-handler ]
if: always()
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Generate workflow summary
run: |
echo "# 🚀 Maven Central 发布工作流摘要" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**工作流运行时间:** $(date -u '+%Y-%m-%d %H:%M:%S UTC')" >> $GITHUB_STEP_SUMMARY
echo "**触发事件:** ${{ github.event_name }}" >> $GITHUB_STEP_SUMMARY
echo "**分支/标签:** ${{ github.ref_name }}" >> $GITHUB_STEP_SUMMARY
echo "**提交 SHA:** ${{ github.sha }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
# 任务状态摘要
echo "## 📋 任务执行状态" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "| 任务 | 状态 | 结果 |" >> $GITHUB_STEP_SUMMARY
echo "|------|------|------|" >> $GITHUB_STEP_SUMMARY
echo "| 🧪 发布前验证 | ${{ needs.pre-publish-validation.result }} | ${{ needs.pre-publish-validation.result == 'success' && '✅' || needs.pre-publish-validation.result == 'failure' && '❌' || needs.pre-publish-validation.result == 'skipped' && '⏭️' || '🔄' }} |" >> $GITHUB_STEP_SUMMARY
echo "| 📦 Maven Central 发布 | ${{ needs.publish.result }} | ${{ needs.publish.result == 'success' && '✅' || needs.publish.result == 'failure' && '❌' || needs.publish.result == 'skipped' && '⏭️' || '🔄' }} |" >> $GITHUB_STEP_SUMMARY
echo "| 🏷️ GitHub Release | ${{ needs.create-github-release.result }} | ${{ needs.create-github-release.result == 'success' && '✅' || needs.create-github-release.result == 'failure' && '❌' || needs.create-github-release.result == 'skipped' && '⏭️' || '🔄' }} |" >> $GITHUB_STEP_SUMMARY
echo "| 📋 发布后验证 | ${{ needs.post-publish-verification.result }} | ${{ needs.post-publish-verification.result == 'success' && '✅' || needs.post-publish-verification.result == 'failure' && '❌' || needs.post-publish-verification.result == 'skipped' && '⏭️' || '🔄' }} |" >> $GITHUB_STEP_SUMMARY
# 版本信息
if [[ "${{ needs.pre-publish-validation.outputs.version }}" != "" ]]; then
echo "" >> $GITHUB_STEP_SUMMARY
echo "## 📦 版本信息" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
echo "**版本号:** ${{ needs.pre-publish-validation.outputs.version }}" >> $GITHUB_STEP_SUMMARY
echo "**版本类型:** ${{ needs.pre-publish-validation.outputs.is-snapshot == 'true' && '预发布版本' || '正式版本' }}" >> $GITHUB_STEP_SUMMARY
echo "**发布状态:** ${{ needs.pre-publish-validation.outputs.should-publish == 'true' && '已发布' || '已跳过' }}" >> $GITHUB_STEP_SUMMARY
fi
# 总体状态
echo "" >> $GITHUB_STEP_SUMMARY
echo "## 🎯 总体状态" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
if [[ "${{ needs.publish.result }}" == "success" ]]; then
echo "🎉 **发布成功!** 新版本已成功发布到 Maven Central" >> $GITHUB_STEP_SUMMARY
elif [[ "${{ needs.publish.result }}" == "skipped" ]]; then
echo "⏭️ **发布已跳过** - 无版本变化或为 PR 验证" >> $GITHUB_STEP_SUMMARY
elif [[ "${{ needs.publish.result }}" == "failure" ]]; then
echo "❌ **发布失败** - 请查看错误日志并重试" >> $GITHUB_STEP_SUMMARY
else
echo "🔄 **工作流进行中** - 请等待完成" >> $GITHUB_STEP_SUMMARY
fi