Skip to content

Build and Release Android APK #2

Build and Release Android APK

Build and Release Android APK #2

Workflow file for this run

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