name: Build and Release on: push: tags: - 'v*.*.*' # 仅在推送符合语义化版本的标签时触发 jobs: build_android: name: Build Android APK runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up JDK 17 uses: actions/setup-java@v4 with: distribution: 'zulu' java-version: '17' cache: 'gradle' # 添加 Gradle 缓存 - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Build Android APK run: ./gradlew :androidApp:assembleRelease - name: Upload Android APK artifact uses: actions/upload-artifact@v4 with: name: android-apk path: androidApp/build/outputs/apk/release/*.apk retention-days: 1 # 保留1天即可,因为马上会被 release job 使用 build_desktop: name: Build Desktop Artifacts runs-on: ubuntu-latest # 对于 JAR 和 Linux 包 (如 .deb) steps: - name: Checkout code uses: actions/checkout@v4 - name: Set up JDK 17 uses: actions/setup-java@v4 with: distribution: 'zulu' java-version: '17' cache: 'gradle' - name: Grant execute permission for gradlew run: chmod +x gradlew # 注意: 根据你的 Compose Desktop 配置,任务名和输出路径可能不同 # packageUberJar 通常生成一个可执行的 JAR 文件 - name: Build Desktop UberJAR run: ./gradlew :desktopApp:packageUberJar # 或其他打包任务如 packageDistribution # 如果需要,可以添加其他平台的打包任务,例如 .deb - name: Build Desktop DEB (Linux) run: ./gradlew :desktopApp:packageDeb # 确保你的项目中配置了这个任务 - name: Upload Desktop artifacts uses: actions/upload-artifact@v4 with: name: desktop-artifacts # 根据实际生成的产物调整路径 path: | desktopApp/build/compose/jars/*.jar desktopApp/build/compose/binaries/main/deb/*.deb # desktopApp/build/compose/distributions/*.* # 如果使用 packageDistribution retention-days: 1 build_ios: name: Build iOS Framework runs-on: macos-latest # iOS 构建需要 macOS 环境 steps: - name: Checkout code uses: actions/checkout@v4 # KMM 项目的 iOS 构建通常也需要 JDK 来运行 Gradle - name: Set up JDK 17 uses: actions/setup-java@v4 with: distribution: 'zulu' java-version: '17' cache: 'gradle' - name: Grant execute permission for gradlew run: chmod +x gradlew # (可选) 如果你需要特定版本的 Xcode # - name: Select Xcode version # run: sudo xcode-select -s /Applications/Xcode_15.3.app # 根据需要调整 Xcode 版本 # 重点: 确保这是你 KMM 项目中生成 XCFramework 的正确模块和任务名 # 通常是 :shared:assembleReleaseXCFramework 或 ::assembleReleaseXCFramework # 如果你的 iOS 框架不是通过 KMM 共享模块生成的,而是 iosApp 直接产出,请调整 - name: Build iOS XCFramework run: ./gradlew :shared:assembleReleaseXCFramework # <--- ***请确认此任务名和模块名*** - name: Prepare XCFramework for upload (Zip it) # XCFramework 是一个目录,最好压缩后再上传 # 路径也需要根据你的模块名调整 run: | FRAMEWORK_PATH="shared/build/XCFrameworks/release/" # <--- ***请确认此路径*** FRAMEWORK_NAME=$(ls $FRAMEWORK_PATH | grep .xcframework) echo "Framework Name: $FRAMEWORK_NAME" ditto -c -k --sequesterRsrc --keepParent "$FRAMEWORK_PATH/$FRAMEWORK_NAME" "release-framework.zip" # 如果你不是使用 :shared 模块,而是 :iosApp,路径可能类似: # run: | # FRAMEWORK_PATH="iosApp/build/Products/Release-iphoneos/" # FRAMEWORK_NAME=$(ls $FRAMEWORK_PATH | grep .framework) # 注意这可能是 .framework 而不是 .xcframework # ditto -c -k --sequesterRsrc --keepParent "$FRAMEWORK_PATH/$FRAMEWORK_NAME" "release-framework.zip" - name: Upload iOS Framework artifact uses: actions/upload-artifact@v4 with: name: ios-framework path: release-framework.zip # 上传压缩后的文件 retention-days: 1 create_release: name: Create GitHub Release runs-on: ubuntu-latest needs: [build_android, build_desktop, build_ios] # 等待所有构建完成 permissions: contents: write # 需要写权限来创建 Release 和上传附件 steps: - name: Download Android APK uses: actions/download-artifact@v4 with: name: android-apk path: artifacts/android - name: Download Desktop artifacts uses: actions/download-artifact@v4 with: name: desktop-artifacts path: artifacts/desktop - name: Download iOS Framework uses: actions/download-artifact@v4 with: name: ios-framework path: artifacts/ios - name: Create Release and Upload Assets uses: softprops/action-gh-release@v2 with: tag_name: ${{ github.ref_name }} name: Release ${{ github.ref_name }} body: | # 你可以自定义 Release 的描述信息 Automated release for ${{ github.ref_name }} **Artifacts:** - Android APK - Desktop (JAR, DEB) - iOS Framework (XCFramework.zip) *Built by GitHub Actions* draft: false # 设置为 true 如果你想手动发布草稿 prerelease: false # 如果是预发布版本,设置为 true files: | # 列出所有要上传的文件 artifacts/android/*.apk artifacts/desktop/*.jar artifacts/desktop/*.deb artifacts/ios/*.zip env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}