Skip to content

Fix iOS workflow cap sync command #23

Fix iOS workflow cap sync command

Fix iOS workflow cap sync command #23

# 打 tag(如 v1.2.3)后自动构建 Android APK,并发布到 GitHub Release。

Check failure on line 1 in .github/workflows/mobile-release.yml

View workflow run for this annotation

GitHub Actions / .github/workflows/mobile-release.yml

Invalid workflow file

(Line: 97, Col: 13): Unrecognized named-value: 'secrets'. Located at position 1 within expression: secrets.KEYSTORE_BASE64 != ''
# 手动运行 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 }}