Fix iOS workflow cap sync command #23
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
| # 打 tag(如 v1.2.3)后自动构建 Android APK,并发布到 GitHub Release。 | ||
|
Check failure on line 1 in .github/workflows/mobile-release.yml
|
||
| # 手动运行 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 }} | ||