diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 95a2e66..3a15b58 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,9 +1,9 @@ name: Android APK 构建 # 触发条件: -# 1. 每次推送代码到 main 分支:自动构建并更新名为 "latest" 的 Release (Rolling Release) -# 2. 推送 v* 格式的 tag(如 v1.0):自动构建并发布正式 Release -# 3. 手动触发(workflow_dispatch):手动指定 tag 发布 +# 1. 推送到 main 分支:自动构建并更新 preview 滚动版本 +# 2. 推送 v* 格式 tag:构建正式版本 +# 3. 手动触发:指定 tag 发布 on: push: branches: [ main ] @@ -11,28 +11,31 @@ on: workflow_dispatch: inputs: release_tag: - description: '上传到已有标签 (如 v1.0)' + description: '发布标签 (如 v1.0)' required: true default: 'v1.0' -env: - FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true - permissions: contents: write jobs: - # ── 中文版 APK 构建 ────────────────────────────────────────────────────────── - build-android-zh: - name: Build EmbyX-zh APK + build-and-release: + name: Build & Release EmbyX APKs runs-on: ubuntu-latest steps: - - uses: actions/checkout@v6 + # 手动 clone,避免从 github.com 下载 actions/checkout 超时 + - name: Checkout + run: | + git init + git remote add origin \ + http://oauth2:${{ secrets.GITHUB_TOKEN }}@192.168.1.66:3000/adminym/embyx.git + git fetch --depth=1 origin ${{ github.sha }} + git checkout FETCH_HEAD - - name: Setup JDK 21 + - name: Setup JDK 21 & Python3 run: | apt-get update -qq - apt-get install -y wget gnupg + apt-get install -y wget gnupg python3 wget -qO- https://packages.adoptium.net/artifactory/api/gpg/key/public \ | gpg --dearmor > /usr/share/keyrings/adoptium.gpg echo "deb [signed-by=/usr/share/keyrings/adoptium.gpg] \ @@ -49,8 +52,8 @@ jobs: hash -r node --version - # 动态生成中文版 capacitor.config.json(webDir 指向 zh/ 目录) - - name: Create capacitor.config.json (zh) + # ── 构建中文版 APK ────────────────────────────────────────────────────── + - name: Build zh APK run: | cat > capacitor.config.json << 'EOF' { @@ -72,64 +75,20 @@ jobs: } } EOF - - - name: Install Capacitor dependencies - run: npm install - - - name: Add & Sync Android Platform - run: | + npm install npx cap add android npx cap sync android - - # 运行补丁脚本:替换图标、注册屏保、添加全屏模式 - - name: Patch Android Project (zh) - run: python .github/patch_android.py --lang zh - - - name: Build Debug APK - run: | + python3 .github/patch_android.py --lang zh cd android chmod +x gradlew ./gradlew assembleDebug + mv app/build/outputs/apk/debug/app-debug.apk ../EmbyX-zh.apk + cd .. - - name: Rename to EmbyX-zh.apk - run: mv android/app/build/outputs/apk/debug/app-debug.apk EmbyX-zh.apk - - - name: Upload Artifact - uses: actions/upload-artifact@v7 - with: - name: embyx-zh - path: EmbyX-zh.apk - - # ── 英文版 APK 构建 ────────────────────────────────────────────────────────── - build-android-en: - name: Build EmbyX-en APK - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v6 - - - name: Setup JDK 21 - run: | - apt-get update -qq - apt-get install -y wget gnupg - wget -qO- https://packages.adoptium.net/artifactory/api/gpg/key/public \ - | gpg --dearmor > /usr/share/keyrings/adoptium.gpg - echo "deb [signed-by=/usr/share/keyrings/adoptium.gpg] \ - https://packages.adoptium.net/artifactory/deb bullseye main" \ - > /etc/apt/sources.list.d/adoptium.list - apt-get update -qq - apt-get install -y temurin-21-jdk - java -version - - - name: Setup Node.js 22 - run: | - npm install -g n - n 22 - hash -r - node --version - - # 动态生成英文版 capacitor.config.json(webDir 指向 en/ 目录) - - name: Create capacitor.config.json (en) + # ── 构建英文版 APK(复用已下载的 Gradle 缓存)────────────────────────── + - name: Build en APK run: | + rm -rf android cat > capacitor.config.json << 'EOF' { "appId": "juneix.embyx", @@ -150,62 +109,59 @@ jobs: } } EOF - - - name: Install Capacitor dependencies - run: npm install - - - name: Add & Sync Android Platform - run: | + npm install npx cap add android npx cap sync android - - # 运行补丁脚本:替换图标、注册屏保、添加全屏模式 - - name: Patch Android Project (en) - run: python .github/patch_android.py --lang en - - - name: Build Debug APK - run: | + python3 .github/patch_android.py --lang en cd android chmod +x gradlew ./gradlew assembleDebug + mv app/build/outputs/apk/debug/app-debug.apk ../EmbyX-en.apk + cd .. - - name: Rename to EmbyX-en.apk - run: mv android/app/build/outputs/apk/debug/app-debug.apk EmbyX-en.apk - - - name: Upload Artifact - uses: actions/upload-artifact@v7 - with: - name: embyx-en - path: EmbyX-en.apk - - # ── 发布 Release ───────────────────────────────────────────────────────────── - # 当推送到 main 分支、打 v* 标签或手动触发时执行 - release: - name: Create GitHub Release - needs: [build-android-zh, build-android-en] - runs-on: ubuntu-latest - if: github.event_name == 'workflow_dispatch' || startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' - steps: - - name: Download all artifacts - uses: actions/download-artifact@v7 - - - name: Verify APK files exist - run: | - ls -R - test -f "embyx-zh/EmbyX-zh.apk" - test -f "embyx-en/EmbyX-en.apk" - + # ── 发布到 Gitea Release(全程用本地 API,不访问 GitHub)─────────────── - name: Create Release - uses: softprops/action-gh-release@v3 - with: - # 如果是 main 分支,固定使用 preview 标签以便滚动更新 - tag_name: ${{ github.event_name == 'workflow_dispatch' && inputs.release_tag || (github.ref_name == 'main' && 'preview' || github.ref_name) }} - name: ${{ github.event_name == 'workflow_dispatch' && inputs.release_tag || (github.ref_name == 'main' && 'EmbyX Preview' || github.ref_name) }} - prerelease: ${{ github.event_name == 'push' && github.ref_name == 'main' }} - draft: false - fail_on_unmatched_files: true - files: | - embyx-zh/EmbyX-zh.apk - embyx-en/EmbyX-en.apk - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + TAG="${{ inputs.release_tag }}" + RNAME="${{ inputs.release_tag }}" + PRE=false + elif [ "${{ github.ref_name }}" = "main" ]; then + TAG="preview" + RNAME="EmbyX Preview" + PRE=true + else + TAG="${{ github.ref_name }}" + RNAME="${{ github.ref_name }}" + PRE=false + fi + + API="http://192.168.1.66:3000/api/v1/repos/adminym/embyx" + AUTH="Authorization: token ${{ secrets.GITHUB_TOKEN }}" + + # 删除旧的同名 release(用于 preview 滚动更新) + OLD_ID=$(curl -sf "$API/releases/tags/$TAG" -H "$AUTH" \ + | python3 -c "import sys,json; print(json.load(sys.stdin).get('id',''))" \ + 2>/dev/null || echo "") + if [ -n "$OLD_ID" ] && [ "$OLD_ID" != "None" ]; then + curl -sf -X DELETE "$API/releases/$OLD_ID" -H "$AUTH" || true + curl -sf -X DELETE "$API/tags/$TAG" -H "$AUTH" || true + fi + + # 创建新 release + RID=$(curl -sf -X POST "$API/releases" \ + -H "$AUTH" -H "Content-Type: application/json" \ + -d "{\"tag_name\":\"$TAG\",\"name\":\"$RNAME\",\"prerelease\":$PRE,\"draft\":false}" \ + | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])") + + echo "Release ID: $RID" + + # 上传中文版 APK + curl -sf -X POST "$API/releases/$RID/assets?name=EmbyX-zh.apk" \ + -H "$AUTH" -F "attachment=@EmbyX-zh.apk" + + # 上传英文版 APK + curl -sf -X POST "$API/releases/$RID/assets?name=EmbyX-en.apk" \ + -H "$AUTH" -F "attachment=@EmbyX-en.apk" + + echo "发布完成: http://192.168.1.66:3000/adminym/embyx/releases/tag/$TAG"