Skip to content

Merge pull request #40 from Rely-xcy/feat/custom-prompts #23

Merge pull request #40 from Rely-xcy/feat/custom-prompts

Merge pull request #40 from Rely-xcy/feat/custom-prompts #23

Workflow file for this run

name: Beta Build
# push 到 main 时自动构建一个测试包:universal flavor、正式签名、与 release 同配置(R8/资源压缩),
# 仅 applicationId 后缀 .beta(com.aicode.beta,可与正式版同机共存)。
# 产物上传到 Actions Artifacts(默认保留 90 天),不进 GitHub Release。
# 打 v* tag 的正式发版走 android-release.yml;合入前门禁走 ci.yml。
on:
push:
branches: [ main ]
# 纯文档/资源改动不影响 APK,跳过省时间(与 ci.yml 保持一致)。
paths-ignore:
- '**.md'
- 'docs/**'
- 'docs-site/**'
- 'LICENSE'
- '.gitignore'
# 允许在 Actions 页面手动触发,便于验证链路。
workflow_dispatch:
# 同分支新提交到来时取消正在跑的旧 beta 构建,省额度。
concurrency:
group: beta-${{ github.ref }}
cancel-in-progress: true
jobs:
build:
name: Build Beta APK
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
# versionCode 由 build.gradle.kts 的 gitCommitCount() 取 git rev-list --count HEAD,
# 浅克隆(默认 depth=1)会得到 1,必须拉完整历史,否则版本号错乱。
fetch-depth: 0
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'
- name: Set up Gradle
uses: gradle/actions/setup-gradle@v4
with:
cache-read-only: ${{ github.ref != 'refs/heads/main' }}
# beta 用正式签名:从 Secret 还原 keystore 到 app/aicode.jks,并生成 keystore.properties,
# 与 android-release.yml 完全一致;缺任一步 beta 包会变成 unsigned。
- name: Restore release keystore
env:
KEYSTORE_BASE64: ${{ secrets.AICODE_KEYSTORE_BASE64 }}
run: |
echo "$KEYSTORE_BASE64" | base64 -d > app/aicode.jks
echo "keystore restored ($(stat -c%s app/aicode.jks) bytes)"
- name: Generate keystore.properties
env:
KEYSTORE_PASSWORD: ${{ secrets.AICODE_KEYSTORE_PASSWORD }}
KEY_ALIAS: ${{ secrets.AICODE_KEY_ALIAS }}
KEY_PASSWORD: ${{ secrets.AICODE_KEY_PASSWORD }}
run: |
cat > app/keystore.properties <<EOF
storeFile=aicode.jks
storePassword=$KEYSTORE_PASSWORD
keyAlias=$KEY_ALIAS
keyPassword=$KEY_PASSWORD
EOF
echo "app/keystore.properties generated"
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
# 构建 universal beta(arm64-v8a + x86_64,含两套容器镜像的通用包)。
# --stacktrace:失败时输出完整调用栈,便于定位 OOM/内存类根因。
- name: Build universal beta APK
run: ./gradlew :app:assembleUniversalBeta --stacktrace
# 产物重命名为 aicode-universal-beta-<sha7>.apk,短 sha 便于区分每次构建。
# 同时带上 R8 混淆映射(mapping.txt),供 beta 崩溃报告反混淆。
- name: Rename APK & collect mapping
run: |
set -e
mkdir -p dist
sha7="${GITHUB_SHA::7}"
cp "app/build/outputs/apk/universal/beta/app-universal-beta.apk" \
"dist/aicode-universal-beta-${sha7}.apk"
# AGP 8.x 的 mapping 输出目录是 variant 驼峰名(flavor + BuildType),
# 即 outputs/mapping/universalBeta/,不是 outputs/mapping/universal/beta/。
if [[ -f "app/build/outputs/mapping/universalBeta/mapping.txt" ]]; then
cp "app/build/outputs/mapping/universalBeta/mapping.txt" \
"dist/aicode-universal-beta-${sha7}-mapping.txt"
fi
ls -lh dist/
- name: Upload APK artifact
uses: actions/upload-artifact@v4
with:
name: aicode-beta-${{ github.sha }}
# Artifacts 默认保留 90 天,无需显式配置。
path: |
dist/aicode-universal-beta-*.apk
dist/aicode-universal-beta-*-mapping.txt
if-no-files-found: error