Build and Release Android APK #2
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: Build and Release Android APK | |
| # 触发条件:当推送以v开头的tag时 | |
| on: | |
| push: | |
| tags: | |
| - 'v*.*.*' # 匹配 v1.0.0, v2.1.3 等格式 | |
| # 也可以手动触发 | |
| workflow_dispatch: | |
| jobs: | |
| build-and-release: | |
| runs-on: ubuntu-latest | |
| steps: | |
| # 1. 检出代码 | |
| - name: Checkout Repository | |
| uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 # 获取完整历史,用于生成changelog | |
| # 2. 设置JDK环境 | |
| - name: Set up JDK 17 | |
| uses: actions/setup-java@v4 | |
| with: | |
| java-version: '17' | |
| distribution: 'temurin' | |
| # 3. 设置Android SDK | |
| - name: Setup Android SDK | |
| uses: android-actions/setup-android@v3 | |
| # 4. 缓存Gradle依赖 | |
| - name: Cache Gradle packages | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.gradle/caches | |
| ~/.gradle/wrapper | |
| key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} | |
| restore-keys: | | |
| ${{ runner.os }}-gradle- | |
| # 5. 赋予gradlew执行权限 | |
| - name: Grant execute permission for gradlew | |
| run: chmod +x gradlew | |
| # 6. 获取版本信息 | |
| - name: Get version info | |
| id: version | |
| run: | | |
| VERSION=${GITHUB_REF#refs/tags/} | |
| echo "VERSION=$VERSION" >> $GITHUB_OUTPUT | |
| echo "VERSION_CODE=$(git rev-list --count HEAD)" >> $GITHUB_OUTPUT | |
| # 7. 构建Debug APK | |
| - name: Build Debug APK | |
| run: ./gradlew assembleDebug | |
| # 8. 构建Release APK | |
| - name: Build Release APK | |
| run: ./gradlew assembleRelease | |
| env: | |
| VERSION_NAME: ${{ steps.version.outputs.VERSION }} | |
| VERSION_CODE: ${{ steps.version.outputs.VERSION_CODE }} | |
| # 9. 签名APK (如果配置了签名) | |
| - name: Sign APK | |
| if: ${{ env.KEYSTORE_FILE != '' }} | |
| run: | | |
| echo "${{ secrets.KEYSTORE_FILE }}" | base64 -d > keystore.jks | |
| jarsigner -verbose -sigalg SHA256withRSA -digestalg SHA-256 \ | |
| -keystore keystore.jks \ | |
| -storepass "${{ secrets.KEYSTORE_PASSWORD }}" \ | |
| -keypass "${{ secrets.KEY_PASSWORD }}" \ | |
| app/build/outputs/apk/release/app-release-unsigned.apk \ | |
| "${{ secrets.KEY_ALIAS }}" | |
| env: | |
| KEYSTORE_FILE: ${{ secrets.KEYSTORE_FILE }} | |
| # 10. 重命名APK文件 | |
| - name: Rename APK files | |
| run: | | |
| VERSION=${{ steps.version.outputs.VERSION }} | |
| mv app/build/outputs/apk/debug/app-debug.apk app/build/outputs/apk/debug/MyApp-${VERSION}-debug.apk | |
| mv app/build/outputs/apk/release/app-release.apk app/build/outputs/apk/release/MyApp-${VERSION}-release.apk | |
| # 11. 生成Changelog | |
| - name: Generate Changelog | |
| id: changelog | |
| run: | | |
| PREVIOUS_TAG=$(git describe --tags --abbrev=0 HEAD~1 2>/dev/null || echo "") | |
| if [ -n "$PREVIOUS_TAG" ]; then | |
| CHANGELOG=$(git log ${PREVIOUS_TAG}..HEAD --pretty=format:"- %s" --no-merges) | |
| else | |
| CHANGELOG=$(git log --pretty=format:"- %s" --no-merges -10) | |
| fi | |
| echo "CHANGELOG<<EOF" >> $GITHUB_OUTPUT | |
| echo "$CHANGELOG" >> $GITHUB_OUTPUT | |
| echo "EOF" >> $GITHUB_OUTPUT | |
| # 12. 创建GitHub Release | |
| - name: Create GitHub Release | |
| id: create_release | |
| uses: actions/create-release@v1 | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| with: | |
| tag_name: ${{ steps.version.outputs.VERSION }} | |
| release_name: Release ${{ steps.version.outputs.VERSION }} | |
| body: | | |
| ## 🚀 Release ${{ steps.version.outputs.VERSION }} | |
| ### 📱 Download | |
| - **Release APK**: For production use | |
| - **Debug APK**: For testing and debugging | |
| ### 📋 Changes | |
| ${{ steps.changelog.outputs.CHANGELOG }} | |
| ### 📊 Build Info | |
| - Version Code: ${{ steps.version.outputs.VERSION_CODE }} | |
| - Build Date: ${{ github.event.head_commit.timestamp }} | |
| - Commit: ${{ github.sha }} | |
| draft: false | |
| prerelease: false | |
| # 13. 上传Release APK | |
| - name: Upload Release APK | |
| uses: actions/upload-release-asset@v1 | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| with: | |
| upload_url: ${{ steps.create_release.outputs.upload_url }} | |
| asset_path: app/build/outputs/apk/release/MyApp-${{ steps.version.outputs.VERSION }}-release.apk | |
| asset_name: MyApp-${{ steps.version.outputs.VERSION }}-release.apk | |
| asset_content_type: application/vnd.android.package-archive | |
| # 14. 上传Debug APK | |
| - name: Upload Debug APK | |
| uses: actions/upload-release-asset@v1 | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| with: | |
| upload_url: ${{ steps.create_release.outputs.upload_url }} | |
| asset_path: app/build/outputs/apk/debug/MyApp-${{ steps.version.outputs.VERSION }}-debug.apk | |
| asset_name: MyApp-${{ steps.version.outputs.VERSION }}-debug.apk | |
| asset_content_type: application/vnd.android.package-archive | |
| # 15. 上传构建产物到Artifacts (备份) | |
| - name: Upload APK Artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: apk-files-${{ steps.version.outputs.VERSION }} | |
| path: | | |
| app/build/outputs/apk/release/*.apk | |
| app/build/outputs/apk/debug/*.apk | |
| retention-days: 30 |