-
Notifications
You must be signed in to change notification settings - Fork 477
168 lines (147 loc) · 6.83 KB
/
Copy pathmobile-release.yml
File metadata and controls
168 lines (147 loc) · 6.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# 打 tag(如 v1.2.3)后自动构建 Android APK,并发布到 GitHub Release。
# 手动运行 workflow 仅上传 Actions Artifact,不创建 Release(便于试打)。
# 默认产出 debug APK(无需签名配置);
# 配置 KEYSTORE_BASE64 等 Secrets 后自动切换为 release 签名 APK。
name: Mobile Release
on:
push:
tags:
- "v*"
workflow_dispatch:
permissions:
contents: write
concurrency:
group: mobile-release-${{ github.ref }}
cancel-in-progress: true
env:
NODE_VERSION: "20"
JAVA_VERSION: "17"
jobs:
android:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# ── Node / pnpm ──────────────────────────────────────────────────────
- uses: pnpm/action-setup@v4
with:
version: 9
- uses: actions/setup-node@v4
with:
node-version: ${{ env.NODE_VERSION }}
cache: pnpm
cache-dependency-path: frontend/pnpm-lock.yaml
# ── Java(Android 构建需要)──────────────────────────────────────────
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: ${{ env.JAVA_VERSION }}
# ── 设置版本号 ────────────────────────────────────────────────────────
- name: Set version
shell: bash
working-directory: mobile
run: |
if [[ "${{ github.ref }}" == refs/tags/v* ]]; then
V="${GITHUB_REF_NAME#v}"
else
V=$(node -p "require('../frontend/package.json').version")
fi
echo "APP_VERSION=$V" >> $GITHUB_ENV
# 同步写入 mobile/package.json
node -e "
const fs=require('fs');
const p='package.json';
const j=JSON.parse(fs.readFileSync(p,'utf8'));
j.version=process.argv[1];
fs.writeFileSync(p,JSON.stringify(j,null,2)+'\n');
" "$V"
# 将版本号写入 Android versionName(versionCode 用 build 号)
BUILD_NUMBER="${{ github.run_number }}"
sed -i "s/versionCode .*/versionCode $BUILD_NUMBER/" android/app/build.gradle
sed -i "s/versionName .*/versionName \"$V\"/" android/app/build.gradle
# ── 编译前端 ──────────────────────────────────────────────────────────
- name: Install frontend dependencies
working-directory: frontend
run: pnpm install --frozen-lockfile
- name: Build frontend
working-directory: frontend
run: pnpm run build
# ── 安装 Capacitor CLI & 同步 Web 资源到 Android ─────────────────────
- name: Install mobile dependencies
working-directory: mobile
run: pnpm install --frozen-lockfile
- name: Capacitor sync
working-directory: mobile
run: pnpm exec cap sync android --no-build
# ── 签名配置(可选)──────────────────────────────────────────────────
# 在仓库 Settings → Secrets 中配置以下变量即可启用 release 签名:
# KEYSTORE_BASE64 keystore 文件的 base64 编码
# KEYSTORE_PASSWORD keystore 密码
# KEY_ALIAS key alias
# KEY_PASSWORD key 密码
- name: Setup release signing
if: ${{ secrets.KEYSTORE_BASE64 != '' }}
shell: bash
run: |
echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > mobile/android/app/release.keystore
cat >> mobile/android/app/build.gradle <<'EOF'
android {
signingConfigs {
release {
storeFile file('release.keystore')
storePassword System.getenv('KEYSTORE_PASSWORD')
keyAlias System.getenv('KEY_ALIAS')
keyPassword System.getenv('KEY_PASSWORD')
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
EOF
env:
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
# ── Gradle 构建 APK ───────────────────────────────────────────────────
- name: Grant Gradle execute permission
run: chmod +x mobile/android/gradlew
- name: Build APK
working-directory: mobile/android
run: |
if [[ -f app/release.keystore ]]; then
echo "Building release APK (signed)..."
./gradlew assembleRelease
APK_PATH="app/build/outputs/apk/release/app-release.apk"
else
echo "Building debug APK..."
./gradlew assembleDebug
APK_PATH="app/build/outputs/apk/debug/app-debug.apk"
fi
echo "APK_PATH=mobile/android/$APK_PATH" >> $GITHUB_ENV
env:
KEYSTORE_PASSWORD: ${{ secrets.KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }}
# ── 重命名产物 ────────────────────────────────────────────────────────
- name: Rename APK
shell: bash
run: |
SUFFIX=$(echo "$APK_PATH" | grep -q 'release' && echo "release" || echo "debug")
APK_NAME="MonkeyCode-${{ env.APP_VERSION }}-android-${SUFFIX}.apk"
cp "$APK_PATH" "$APK_NAME"
echo "APK_NAME=$APK_NAME" >> $GITHUB_ENV
# ── 上传 Artifact(每次构建都保留)──────────────────────────────────
- uses: actions/upload-artifact@v4
with:
name: android-apk
path: ${{ env.APK_NAME }}
if-no-files-found: error
# ── 发布到 GitHub Release(仅 tag 触发)──────────────────────────────
- name: Upload to GitHub Release
if: startsWith(github.ref, 'refs/tags/v')
uses: softprops/action-gh-release@v2
with:
files: ${{ env.APK_NAME }}
tag_name: ${{ github.ref_name }}