优化工作流,添加app-icon
This commit is contained in:
33
.github/workflows/app-expo-deploy.yml
vendored
33
.github/workflows/app-expo-deploy.yml
vendored
@@ -1,6 +1,12 @@
|
||||
# App Expo:CI 内生成 Android 签名 APK(expo prebuild + Gradle assembleRelease)
|
||||
# 使用 app-expo/plugins/withAndroidReleaseSigning:在 android/app 放置 keystore.properties + jks 后打 release 包。
|
||||
#
|
||||
# 产物说明:
|
||||
# - 以下为「真机向」release APK;Google 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 }}"
|
||||
|
||||
29
.github/workflows/docker-build-deploy.yml
vendored
29
.github/workflows/docker-build-deploy.yml
vendored
@@ -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
|
||||
"
|
||||
|
||||
Reference in New Issue
Block a user