优化工作流,添加app-icon

This commit is contained in:
Kevin
2026-03-23 10:25:51 +08:00
parent 584fb9ffe9
commit f8b3de6ff8
16 changed files with 209 additions and 42 deletions

View File

@@ -1,6 +1,12 @@
# App ExpoCI 内生成 Android 签名 APKexpo prebuild + Gradle assembleRelease
# 使用 app-expo/plugins/withAndroidReleaseSigning在 android/app 放置 keystore.properties + jks 后打 release 包。
#
# 产物说明:
# - 以下为「真机向」release APKGoogle Play 上架更推荐 AAB按设备 ABI 下发)。
# - 构建步骤会将 reactNativeArchitectures 设为仅 arm64-v8a更小不含 x86/x86_64多数模拟器无法安装
# - 若需兼容旧 32 位 ARM 设备,可将该属性改为 armeabi-v7a,arm64-v8a体积会增大
# - 若需用 x86 模拟器验证此 APK需改回含 x86 的 ABI 或另建 job。
#
# 环境映射(按触发源自动推断):
# main → dev (开发 + 内部测试)
# v*.*.* → prod (正式发布 + GitHub Release 附带 APK)
@@ -41,6 +47,8 @@ concurrency:
env:
APP_NAME: app-expo
EXPO_NO_TELEMETRY: 1
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
jobs:
deploy:
@@ -51,7 +59,7 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
fetch-depth: ${{ startsWith(github.ref, 'refs/tags/') && '0' || '1' }}
@@ -67,9 +75,9 @@ jobs:
fi >> $GITHUB_OUTPUT
- name: Set up Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v5
with:
node-version: 20
node-version: 22.22.1
cache: npm
cache-dependency-path: app-expo/package-lock.json
@@ -116,18 +124,29 @@ jobs:
echo "版本名: ${VERSION}, versionCode: ${VERSION_CODE}, tag: ${TAG_NAME}"
- name: Set up JDK
uses: actions/setup-java@v4
uses: actions/setup-java@v5
with:
java-version: '17'
distribution: 'temurin'
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
uses: gradle/actions/setup-gradle@v5
- name: Expo prebuild (Android)
working-directory: app-expo
run: npx expo prebuild --platform android --clean
- name: Release APK — arm64 only (real devices; smaller)
working-directory: app-expo/android
run: |
set -euo pipefail
if grep -q '^reactNativeArchitectures=' gradle.properties; then
sed -i 's/^reactNativeArchitectures=.*/reactNativeArchitectures=arm64-v8a/' gradle.properties
else
echo 'reactNativeArchitectures=arm64-v8a' >> gradle.properties
fi
grep -E '^reactNativeArchitectures=' gradle.properties
- name: Decode keystore
working-directory: app-expo/android/app
run: |
@@ -166,7 +185,7 @@ jobs:
du -h "$FINAL_PATH"
- name: Upload APK artifact
uses: actions/upload-artifact@v4
uses: actions/upload-artifact@v6
with:
name: ${{ steps.version.outputs.apk_name }}
path: app-expo/android/${{ steps.apk.outputs.apk_path }}
@@ -198,7 +217,7 @@ jobs:
- name: Create GitHub Release (prod)
if: steps.env.outputs.env == 'prod'
uses: softprops/action-gh-release@v2
uses: softprops/action-gh-release@v2.5.0
with:
tag_name: ${{ steps.version.outputs.tag_name }}
name: "${{ env.APP_NAME }} ${{ steps.version.outputs.tag_name }}"

View File

@@ -41,6 +41,7 @@ env:
IMAGE_NAME: lifecho-api
REGISTRY: crpi-u2903xccyzd6nqnc.cn-shanghai.personal.cr.aliyuncs.com
REGISTRY_NAMESPACE: huaga
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
jobs:
build-and-push:
@@ -51,7 +52,7 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
ref: ${{ github.event.inputs.branch || github.ref }}
@@ -88,7 +89,7 @@ jobs:
type=raw,value=latest,enable={{is_default_branch}}
- name: Build and push Docker image
uses: docker/build-push-action@v5
uses: docker/build-push-action@v6
with:
context: ./api
file: ./api/Dockerfile
@@ -106,7 +107,7 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
ref: ${{ github.event.inputs.branch || github.ref }}
@@ -147,13 +148,13 @@ jobs:
# 勿用 `prod && PROD_KEY || DEV_KEY`PROD 为空时会错误回退到 DEV 密钥,导致连生产机报 Permission denied。
- name: Set up SSH (production)
if: steps.deploy_target.outputs.target == 'prod'
uses: webfactory/ssh-agent@v0.9.0
uses: webfactory/ssh-agent@v0.9.1
with:
ssh-private-key: ${{ secrets.PROD_SSH_PRIVATE_KEY }}
- name: Set up SSH (development)
if: steps.deploy_target.outputs.target != 'prod'
uses: webfactory/ssh-agent@v0.9.0
uses: webfactory/ssh-agent@v0.9.1
with:
ssh-private-key: ${{ secrets.DEV_SSH_PRIVATE_KEY }}
@@ -221,8 +222,9 @@ jobs:
docker network inspect api_life-echo-network >/dev/null 2>&1 || docker network create api_life-echo-network
"
echo "上传候选 compose 与环境变量..."
echo "上传候选 compose、Caddyfile 与环境变量..."
scp -P "$SSH_PORT" ./api/docker-compose.yml "$SSH_USER@$SSH_HOST:$COMPOSE_DIR/api/docker-compose.candidate.yml"
scp -P "$SSH_PORT" ./api/Caddyfile "$SSH_USER@$SSH_HOST:$COMPOSE_DIR/api/Caddyfile.candidate"
scp -P "$SSH_PORT" ./api/.env.production "$SSH_USER@$SSH_HOST:$COMPOSE_DIR/api/.env.production.candidate"
ssh -p "$SSH_PORT" "$SSH_USER@$SSH_HOST" "
@@ -247,10 +249,14 @@ jobs:
if [ -f '$COMPOSE_FILE' ]; then
cp '$COMPOSE_FILE' '${COMPOSE_FILE}.predeploy'
fi
if [ -f 'Caddyfile' ]; then
cp 'Caddyfile' 'Caddyfile.predeploy'
fi
if [ -f '.env.production' ]; then
cp '.env.production' '.env.production.predeploy'
fi
mv 'docker-compose.candidate.yml' '$COMPOSE_FILE'
mv 'Caddyfile.candidate' 'Caddyfile'
mv '.env.production.candidate' '.env.production'
docker-compose -f '$COMPOSE_FILE' up -d --remove-orphans
echo '等待服务启动...'
@@ -290,5 +296,16 @@ jobs:
exit 1
fi
CADDY_CID=\$(docker-compose ps -q caddy || true)
if [ -n \"\$CADDY_CID\" ]; then
CADDY_STATE=\$(docker inspect -f '{{.State.Status}}' \"\$CADDY_CID\")
echo \"caddy state: \$CADDY_STATE\"
if [ \"\$CADDY_STATE\" != 'running' ]; then
echo 'caddy 容器未处于 running 状态'
docker-compose logs --tail=80 caddy || true
exit 1
fi
fi
docker-compose logs --tail=50 api
"