diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 61e6e26..a44a9bd 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,41 +6,166 @@ on: - 'v*.*.*' # 仅在推送符合语义化版本的标签时触发 jobs: - build: - name: Build All Targets + build_android: + name: Build Android APK runs-on: ubuntu-latest - steps: - # 检出代码 - name: Checkout code - uses: actions/checkout@v3 - - # 设置 JDK 环境 - - name: Set up JDK - uses: actions/setup-java@v3 + uses: actions/checkout@v4 + + - name: Set up JDK 17 + uses: actions/setup-java@v4 with: distribution: 'zulu' java-version: '17' - - # 构建 Android APK + cache: 'gradle' # 添加 Gradle 缓存 + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Build Android APK run: ./gradlew :androidApp:assembleRelease - - # 构建 iOS Framework - - name: Build iOS Framework - run: ./gradlew :iosApp:build - - # 构建 Desktop 可执行文件 - - name: Build Desktop Executable - run: ./gradlew :desktopApp:packageRelease - - # 上传构建产物到 GitHub Releases - - name: Upload Release Assets - uses: actions/upload-release-asset@v2 + + - name: Upload Android APK artifact + uses: actions/upload-artifact@v4 with: - name: ${{github.ref_name}}-build + 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: | - androidApp/build/outputs/apk/release/*.apk - iosApp/build/bin/ios/*.framework - desktopApp/build/outputs/*.exe - label: "Build for ${{ github.ref_name }}" + 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 }} \ No newline at end of file