Merge pull request #29 from TrueNine/dev #24
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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 |