From cf8089ab945ddf15030bfc0db8c2c7c9f247352f Mon Sep 17 00:00:00 2001 From: "wangyang (wysaid)" Date: Fri, 16 Jan 2026 01:56:33 +0800 Subject: [PATCH 01/17] Refactor CI/CD workflow: multi-platform, multi-NDK, multi-config builds MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Rename workflow file from android.yml to build.yml (best practice) - Support 3 OS platforms: Windows, macOS, Ubuntu - Support 2 NDK versions: r26d (stable), r27c (latest) - Support 2 build systems: CMake and ndk-build - Support 4 product variants: ±FFmpeg × ±16KB page size - Total 48 build configurations (3×2×2×2×2) Trigger strategy: - Master branch: Full build (48 jobs) - Pull requests: Simplified build (18 jobs) - Windows: 1 job (r26d, CMake, FFmpeg, 16KB) - macOS: 1 job (r27c, ndk-build, no-FFmpeg, 4KB) - Ubuntu: 16 jobs (full matrix) - Other branches: No build (save resources) Features: - Structured artifact naming: apk-{OS}-{NDK}-{BuildSystem}-{FFmpeg}-{PageSize} - Conditional job execution based on branch - Cross-platform build tool installation - Separate lint job for code quality (master only) - Added comprehensive workflow documentation --- .github/workflows/README.md | 129 +++++++++ .github/workflows/android.yml | 51 ---- .github/workflows/build.yml | 503 ++++++++++++++++++++++++++++++++++ 3 files changed, 632 insertions(+), 51 deletions(-) create mode 100644 .github/workflows/README.md delete mode 100644 .github/workflows/android.yml create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/README.md b/.github/workflows/README.md new file mode 100644 index 00000000..730b68fb --- /dev/null +++ b/.github/workflows/README.md @@ -0,0 +1,129 @@ +# CI/CD Workflow 说明 + +## 概述 + +本项目使用 GitHub Actions 进行持续集成和构建。Workflow 配置文件:[build.yml](./build.yml) + +## 构建矩阵 + +### 维度说明 + +项目支持以下构建配置的组合: + +1. **操作系统** (3种) + - Windows (windows-latest) + - macOS (macos-latest) + - Ubuntu (ubuntu-latest) + +2. **NDK 版本** (2种) + - r26d (稳定版本) + - r27c (较新版本) + +3. **构建系统** (2种) + - CMake (`--enable-cmake`) + - ndk-build (传统构建方式) + +4. **FFmpeg 支持** (2种) + - with-ffmpeg (`--enable-video-module`) - 支持视频录制功能 + - no-ffmpeg (`--disable-video-module`) - 纯图片处理,体积更小 + +5. **内存页大小** (2种) + - 4kb (默认) (`--disable-16kb-page-size`) + - 16kb (`--enable-16kb-page-size`) - 针对新 Android 设备优化 + +理论上共有 **3 × 2 × 2 × 2 × 2 = 48** 种组合。 + +## 触发策略 + +### 1. Master 分支推送 (全量构建) + +当代码推送到 `master` 分支时,运行**所有 48 个构建任务**,确保所有配置组合都能正常工作。 + +```yaml +on: + push: + branches: [ "master" ] +``` + +**构建任务数量:** 48 +- Windows: 16 (2 NDK × 2 build-system × 2 ffmpeg × 2 page-size) +- macOS: 16 (2 NDK × 2 build-system × 2 ffmpeg × 2 page-size) +- Ubuntu: 16 (2 NDK × 2 build-system × 2 ffmpeg × 2 page-size) + +### 2. Pull Request (精简构建) + +PR 时运行**精简的 18 个构建任务**,在保证质量的同时节省资源: + +```yaml +on: + pull_request: + branches: [ "master" ] +``` + +**构建任务数量:** 18 + +#### Windows (1个任务) +- NDK: r26d +- 构建系统: CMake +- FFmpeg: 启用 +- 页大小: 16KB + +#### macOS (1个任务) +- NDK: r27c +- 构建系统: ndk-build +- FFmpeg: 禁用 +- 页大小: 4KB + +#### Ubuntu (16个任务 - 全量) +- NDK: r26d + r27c +- 构建系统: CMake + ndk-build +- FFmpeg: 启用 + 禁用 +- 页大小: 4KB + 16KB +- 全部组合: 2 × 2 × 2 × 2 = 16 + +### 3. 其他分支推送 + +非 master 分支的推送**不会触发** workflow,避免资源浪费。只有创建 PR 时才会触发精简构建。 + +## 产物命名规则 + +构建产物 (APK) 使用以下命名格式: + +``` +apk-{OS}-{NDK}-{BuildSystem}-{FFmpeg}-{PageSize}.apk +``` + +**示例:** +- `apk-Linux-r26d-cmake-ffmpeg-4kb.apk` +- `apk-Windows-r27c-ndk-build-noffmpeg-16kb.apk` +- `apk-macOS-r26d-cmake-ffmpeg-16kb.apk` + +## Lint 检查 + +代码质量检查仅在 master 分支推送时运行,确保主干代码质量。 + +## 本地测试 + +可以使用项目根目录的 `tasks.sh` 脚本在本地进行构建测试: + +```bash +# CMake 构建,启用视频模块,16KB 页大小 +./tasks.sh --release --enable-cmake --enable-video-module --enable-16kb-page-size --build + +# ndk-build 构建,禁用视频模块,默认页大小 +./tasks.sh --release --disable-video-module --disable-16kb-page-size --build +``` + +## 注意事项 + +1. **NDK 版本**:确保本地安装了对应版本的 NDK +2. **构建时间**:全量构建(48个任务)可能需要较长时间 +3. **产物大小**:启用 FFmpeg 的版本体积较大(包含视频编解码库) +4. **页大小**:16KB 页大小版本需要 Android API 35+ 支持 + +## 资源优化 + +通过 PR 精简构建策略(18个任务 vs 48个任务),可以: +- 节省约 62.5% 的 CI/CD 资源 +- 缩短 PR 反馈时间 +- 保持足够的测试覆盖率(Ubuntu 全量测试) diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml deleted file mode 100644 index 1d397d1a..00000000 --- a/.github/workflows/android.yml +++ /dev/null @@ -1,51 +0,0 @@ -name: Android CI - -on: - push: - branches: [ "master", "android_ci" ] - pull_request: - branches: [ "master", "android_ci" ] - -jobs: - - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - uses: nttld/setup-ndk@v1.4.2 - id: setup-ndk - with: - ndk-version: r26d - link-to-sdk: true - add-to-path: true - - name: Install Ninja - run: sudo apt-get install ninja-build - - name: set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'temurin' - cache: gradle - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - name: Build Release Without Video Module - run: ./tasks.sh --enable-cmake --release --disable-video-module --build - - name: Save build artifacts - Release Without Video Module - run: mv $(find "cgeDemo/build" -iname "*.apk" | grep release) demoRelease/cgeDemo_NoVideoRecord.apk - - name: Build Release With Video Module - run: ./tasks.sh --clean --enable-cmake --release --enable-video-module --build - - name: Save build artifacts - Release With Video Module - run: mv $(find "cgeDemo/build" -iname "*.apk" | grep release) demoRelease/cgeDemo.apk - - name: lint - run: ./gradlew lint - - name: upload artifacts - uses: actions/upload-artifact@v4 - with: - name: my-artifact - path: | - demoRelease/cgeDemo_NoVideoRecord.apk - demoRelease/cgeDemo.apk - compression-level: 0 - retention-days: 15 - if-no-files-found: error diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..8162030d --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,503 @@ +name: Build + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +jobs: + build: + name: "${{ matrix.os-name }} | NDK-${{ matrix.ndk }} | ${{ matrix.build-system }} | ${{ matrix.ffmpeg }} | ${{ matrix.page-size }}" + runs-on: ${{ matrix.os }} + + strategy: + fail-fast: false + matrix: + include: + # ============================================================ + # PR Builds: 18 jobs total (1 Windows + 1 macOS + 16 Ubuntu) + # ============================================================ + + # Windows: 1 job (NDK r26d + CMake + 16KB + FFmpeg) + - os: windows-latest + os-name: Windows + ndk: r26d + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: always + + # macOS: 1 job (NDK r27c + ndk-build + 4KB + no-FFmpeg) + - os: macos-latest + os-name: macOS + ndk: r27c + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: always + + # Ubuntu: 16 jobs (2 NDK × 2 build-system × 2 ffmpeg × 2 page-size) + - os: ubuntu-latest + os-name: Ubuntu + ndk: r26d + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: always + - os: ubuntu-latest + os-name: Ubuntu + ndk: r26d + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: always + - os: ubuntu-latest + os-name: Ubuntu + ndk: r26d + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: always + - os: ubuntu-latest + os-name: Ubuntu + ndk: r26d + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: always + - os: ubuntu-latest + os-name: Ubuntu + ndk: r26d + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: always + - os: ubuntu-latest + os-name: Ubuntu + ndk: r26d + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: always + - os: ubuntu-latest + os-name: Ubuntu + ndk: r26d + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: always + - os: ubuntu-latest + os-name: Ubuntu + ndk: r26d + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: always + - os: ubuntu-latest + os-name: Ubuntu + ndk: r27c + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: always + - os: ubuntu-latest + os-name: Ubuntu + ndk: r27c + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: always + - os: ubuntu-latest + os-name: Ubuntu + ndk: r27c + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: always + - os: ubuntu-latest + os-name: Ubuntu + ndk: r27c + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: always + - os: ubuntu-latest + os-name: Ubuntu + ndk: r27c + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: always + - os: ubuntu-latest + os-name: Ubuntu + ndk: r27c + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: always + - os: ubuntu-latest + os-name: Ubuntu + ndk: r27c + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: always + - os: ubuntu-latest + os-name: Ubuntu + ndk: r27c + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: always + + # ============================================================ + # Master-only Builds: Additional 30 jobs (15 Windows + 15 macOS) + # ============================================================ + + # Windows: Additional 15 jobs (all configs except the one already in PR) + - os: windows-latest + os-name: Windows + ndk: r27c + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r26d + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r27c + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r26d + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r27c + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r26d + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r27c + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r26d + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r27c + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r26d + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r27c + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r26d + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r27c + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r26d + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r27c + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: master-only + + # macOS: Additional 15 jobs (all configs except the one already in PR) + - os: macos-latest + os-name: macOS + ndk: r26d + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r27c + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r26d + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r27c + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r26d + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r27c + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r26d + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r27c + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r26d + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r27c + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r26d + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r27c + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r26d + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r27c + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r26d + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: master-only + + # Skip master-only jobs when not on master branch + if: matrix.run-on == 'always' || github.ref == 'refs/heads/master' + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup NDK + uses: nttld/setup-ndk@v1.4.2 + id: setup-ndk + with: + ndk-version: ${{ matrix.ndk }} + link-to-sdk: true + add-to-path: true + + - name: Install build tools (Ubuntu) + if: runner.os == 'Linux' + run: sudo apt-get update && sudo apt-get install -y ninja-build + + - name: Install build tools (macOS) + if: runner.os == 'macOS' + run: brew install ninja + + - name: Install build tools (Windows) + if: runner.os == 'Windows' + run: choco install ninja + + - name: Setup JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for scripts (Unix) + if: runner.os != 'Windows' + run: chmod +x gradlew tasks.sh + + - name: Configure build parameters + shell: bash + run: | + # Set build system flag + if [ "${{ matrix.build-system }}" == "cmake" ]; then + echo "BUILD_SYSTEM_FLAG=--enable-cmake" >> $GITHUB_ENV + else + echo "BUILD_SYSTEM_FLAG=" >> $GITHUB_ENV + fi + + # Set FFmpeg flag + if [ "${{ matrix.ffmpeg }}" == "with-ffmpeg" ]; then + echo "FFMPEG_FLAG=--enable-video-module" >> $GITHUB_ENV + else + echo "FFMPEG_FLAG=--disable-video-module" >> $GITHUB_ENV + fi + + # Set page size flag + if [ "${{ matrix.page-size }}" == "16kb" ]; then + echo "PAGE_SIZE_FLAG=--enable-16kb-page-size" >> $GITHUB_ENV + else + echo "PAGE_SIZE_FLAG=--disable-16kb-page-size" >> $GITHUB_ENV + fi + + # Set artifact name + OS_SHORT="${{ runner.os }}" + NDK_SHORT="${{ matrix.ndk }}" + BUILD_SYS="${{ matrix.build-system }}" + if [ "${{ matrix.ffmpeg }}" == "with-ffmpeg" ]; then + FFMPEG_SHORT="ffmpeg" + else + FFMPEG_SHORT="noffmpeg" + fi + PAGE_SHORT="${{ matrix.page-size }}" + + echo "ARTIFACT_NAME=apk-${OS_SHORT}-${NDK_SHORT}-${BUILD_SYS}-${FFMPEG_SHORT}-${PAGE_SHORT}" >> $GITHUB_ENV + + - name: Setup project (ndk-build mode) + if: matrix.build-system == 'ndk-build' + shell: bash + run: | + if [ "${{ runner.os }}" == "Windows" ]; then + bash tasks.sh --setup-project + else + ./tasks.sh --setup-project + fi + + - name: Build APK + shell: bash + run: | + if [ "${{ runner.os }}" == "Windows" ]; then + bash tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build + else + ./tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build + fi + + - name: Find and rename APK + shell: bash + run: | + APK_FILE=$(find "cgeDemo/build" -name "*.apk" | grep -i release | head -n 1) + mkdir -p artifacts + cp "$APK_FILE" "artifacts/cgeDemo-${{ env.ARTIFACT_NAME }}.apk" + echo "APK saved as: artifacts/cgeDemo-${{ env.ARTIFACT_NAME }}.apk" + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: ${{ env.ARTIFACT_NAME }} + path: artifacts/*.apk + compression-level: 0 + retention-days: 15 + if-no-files-found: error + + lint: + name: Lint + runs-on: ubuntu-latest + if: github.ref == 'refs/heads/master' + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Run lint + run: ./gradlew lint From 5f37587ce0747f867c509372cb3273209db1d461 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 15 Jan 2026 18:28:59 +0000 Subject: [PATCH 02/17] Initial plan From 715af4ad4d10bb85352b9c6c980e646e171cd9e4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 15 Jan 2026 18:30:13 +0000 Subject: [PATCH 03/17] Initial plan From 7942bced58e25c8ba1741a1690f3bcfbd350ac3d Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 15 Jan 2026 18:53:25 +0000 Subject: [PATCH 04/17] Split workflows and add release automation Co-authored-by: wysaid <1430725+wysaid@users.noreply.github.com> --- .github/workflows/README.md | 8 +- .github/workflows/macos-build.yml | 246 ++++++++++++++++++ .github/workflows/release.yml | 109 ++++++++ .../workflows/{build.yml => ubuntu-build.yml} | 242 +---------------- .github/workflows/windows-build.yml | 246 ++++++++++++++++++ 5 files changed, 610 insertions(+), 241 deletions(-) create mode 100644 .github/workflows/macos-build.yml create mode 100644 .github/workflows/release.yml rename .github/workflows/{build.yml => ubuntu-build.yml} (51%) create mode 100644 .github/workflows/windows-build.yml diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 730b68fb..43409c52 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -2,7 +2,13 @@ ## 概述 -本项目使用 GitHub Actions 进行持续集成和构建。Workflow 配置文件:[build.yml](./build.yml) +本项目使用 GitHub Actions 进行持续集成和构建。Workflow 配置文件: + +- [ubuntu-build.yml](./ubuntu-build.yml) +- [windows-build.yml](./windows-build.yml) +- [macos-build.yml](./macos-build.yml) + +发布流程配置文件:[release.yml](./release.yml) ## 构建矩阵 diff --git a/.github/workflows/macos-build.yml b/.github/workflows/macos-build.yml new file mode 100644 index 00000000..d4d28713 --- /dev/null +++ b/.github/workflows/macos-build.yml @@ -0,0 +1,246 @@ +name: macOS Build + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +jobs: + build: + name: "${{ matrix.os-name }} | NDK-${{ matrix.ndk }} | ${{ matrix.build-system }} | ${{ matrix.ffmpeg }} | ${{ matrix.page-size }}" + runs-on: ${{ matrix.os }} + + strategy: + fail-fast: false + matrix: + include: + # ============================================================ + # macOS: 16 jobs (1 PR + 15 master-only) + # ============================================================ + - os: macos-latest + os-name: macOS + ndk: r27c + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: always + + # macOS: Additional 15 jobs (all configs except the one already in PR) + - os: macos-latest + os-name: macOS + ndk: r26d + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r27c + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r26d + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r27c + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r26d + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r27c + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r26d + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r27c + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r26d + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r27c + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r26d + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r27c + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r26d + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r27c + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r26d + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: master-only + + # Skip master-only jobs when not on master branch + if: matrix.run-on == 'always' || github.ref == 'refs/heads/master' + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup NDK + uses: nttld/setup-ndk@v1.4.2 + id: setup-ndk + with: + ndk-version: ${{ matrix.ndk }} + link-to-sdk: true + add-to-path: true + + - name: Install build tools (Ubuntu) + if: runner.os == 'Linux' + run: sudo apt-get update && sudo apt-get install -y ninja-build + + - name: Install build tools (macOS) + if: runner.os == 'macOS' + run: brew install ninja + + - name: Install build tools (Windows) + if: runner.os == 'Windows' + run: choco install ninja + + - name: Setup JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for scripts (Unix) + if: runner.os != 'Windows' + run: chmod +x gradlew tasks.sh + + - name: Configure build parameters + shell: bash + run: | + # Set build system flag + if [ "${{ matrix.build-system }}" == "cmake" ]; then + echo "BUILD_SYSTEM_FLAG=--enable-cmake" >> $GITHUB_ENV + else + echo "BUILD_SYSTEM_FLAG=" >> $GITHUB_ENV + fi + + # Set FFmpeg flag + if [ "${{ matrix.ffmpeg }}" == "with-ffmpeg" ]; then + echo "FFMPEG_FLAG=--enable-video-module" >> $GITHUB_ENV + else + echo "FFMPEG_FLAG=--disable-video-module" >> $GITHUB_ENV + fi + + # Set page size flag + if [ "${{ matrix.page-size }}" == "16kb" ]; then + echo "PAGE_SIZE_FLAG=--enable-16kb-page-size" >> $GITHUB_ENV + else + echo "PAGE_SIZE_FLAG=--disable-16kb-page-size" >> $GITHUB_ENV + fi + + # Set artifact name + OS_SHORT="${{ runner.os }}" + NDK_SHORT="${{ matrix.ndk }}" + BUILD_SYS="${{ matrix.build-system }}" + if [ "${{ matrix.ffmpeg }}" == "with-ffmpeg" ]; then + FFMPEG_SHORT="ffmpeg" + else + FFMPEG_SHORT="noffmpeg" + fi + PAGE_SHORT="${{ matrix.page-size }}" + + echo "ARTIFACT_NAME=apk-${OS_SHORT}-${NDK_SHORT}-${BUILD_SYS}-${FFMPEG_SHORT}-${PAGE_SHORT}" >> $GITHUB_ENV + + - name: Setup project (ndk-build mode) + if: matrix.build-system == 'ndk-build' + shell: bash + run: | + if [ "${{ runner.os }}" == "Windows" ]; then + bash tasks.sh --setup-project + else + ./tasks.sh --setup-project + fi + + - name: Build APK + shell: bash + run: | + if [ "${{ runner.os }}" == "Windows" ]; then + bash tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build + else + ./tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build + fi + + - name: Find and rename APK + shell: bash + run: | + APK_FILE=$(find "cgeDemo/build" -name "*.apk" | grep -i release | head -n 1) + mkdir -p artifacts + cp "$APK_FILE" "artifacts/cgeDemo-${{ env.ARTIFACT_NAME }}.apk" + echo "APK saved as: artifacts/cgeDemo-${{ env.ARTIFACT_NAME }}.apk" + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: ${{ env.ARTIFACT_NAME }} + path: artifacts/*.apk + compression-level: 0 + retention-days: 15 + if-no-files-found: error + diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 00000000..12c2f889 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,109 @@ +name: Release APKs + +on: + push: + tags: + - 'v*.*.*' + - 'v*.*.*-beta*' + - 'v*.*.*-alpha*' + - 'v*.*.*-rc*' + workflow_dispatch: + inputs: + version: + description: 'Version tag (e.g. v1.0.0-test)' + required: true + default: 'v0.1.0-test' + create_release: + description: 'Whether to create GitHub Release' + type: boolean + default: false + +permissions: + contents: write + +jobs: + build: + name: "Release | ${{ matrix.artifact_name }}" + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + include: + - artifact_name: gpuimage-plus + ffmpeg_flag: --enable-video-module + page_flag: --disable-16kb-page-size + - artifact_name: gpuimage-plus-16k + ffmpeg_flag: --enable-video-module + page_flag: --enable-16kb-page-size + - artifact_name: gpuimage-plus-min + ffmpeg_flag: --disable-video-module + page_flag: --disable-16kb-page-size + - artifact_name: gpuimage-plus-16k-min + ffmpeg_flag: --disable-video-module + page_flag: --enable-16kb-page-size + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Resolve release tag + shell: bash + run: | + if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then + echo "RELEASE_TAG=${{ inputs.version }}" >> $GITHUB_ENV + else + echo "RELEASE_TAG=${{ github.ref_name }}" >> $GITHUB_ENV + fi + echo "APK_NAME=cgeDemo-${{ matrix.artifact_name }}.apk" >> $GITHUB_ENV + + - name: Setup NDK + uses: nttld/setup-ndk@v1.4.2 + id: setup-ndk + with: + ndk-version: r26d + link-to-sdk: true + add-to-path: true + + - name: Install build tools (Ubuntu) + run: sudo apt-get update && sudo apt-get install -y ninja-build + + - name: Setup JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for scripts + run: chmod +x gradlew tasks.sh + + - name: Build APK + shell: bash + run: | + ./tasks.sh --release --enable-cmake ${{ matrix.ffmpeg_flag }} ${{ matrix.page_flag }} --build + + - name: Collect APK + shell: bash + run: | + APK_FILE=$(find "cgeDemo/build" -name "*.apk" | grep -i release | head -n 1) + mkdir -p artifacts + cp "$APK_FILE" "artifacts/${{ env.APK_NAME }}" + echo "APK saved as: artifacts/${{ env.APK_NAME }}" + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: ${{ matrix.artifact_name }} + path: artifacts/*.apk + compression-level: 0 + retention-days: 15 + if-no-files-found: error + + - name: Upload to GitHub Release + if: github.event_name == 'push' || inputs.create_release + uses: softprops/action-gh-release@v2 + with: + tag_name: ${{ env.RELEASE_TAG }} + name: ${{ env.RELEASE_TAG }} + files: artifacts/*.apk diff --git a/.github/workflows/build.yml b/.github/workflows/ubuntu-build.yml similarity index 51% rename from .github/workflows/build.yml rename to .github/workflows/ubuntu-build.yml index 8162030d..9fce0865 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/ubuntu-build.yml @@ -1,4 +1,4 @@ -name: Build +name: Ubuntu Build on: push: @@ -16,28 +16,8 @@ jobs: matrix: include: # ============================================================ - # PR Builds: 18 jobs total (1 Windows + 1 macOS + 16 Ubuntu) - # ============================================================ - - # Windows: 1 job (NDK r26d + CMake + 16KB + FFmpeg) - - os: windows-latest - os-name: Windows - ndk: r26d - build-system: cmake - ffmpeg: with-ffmpeg - page-size: 16kb - run-on: always - - # macOS: 1 job (NDK r27c + ndk-build + 4KB + no-FFmpeg) - - os: macos-latest - os-name: macOS - ndk: r27c - build-system: ndk-build - ffmpeg: no-ffmpeg - page-size: 4kb - run-on: always - # Ubuntu: 16 jobs (2 NDK × 2 build-system × 2 ffmpeg × 2 page-size) + # ============================================================ - os: ubuntu-latest os-name: Ubuntu ndk: r26d @@ -150,224 +130,6 @@ jobs: ffmpeg: no-ffmpeg page-size: 16kb run-on: always - - # ============================================================ - # Master-only Builds: Additional 30 jobs (15 Windows + 15 macOS) - # ============================================================ - - # Windows: Additional 15 jobs (all configs except the one already in PR) - - os: windows-latest - os-name: Windows - ndk: r27c - build-system: cmake - ffmpeg: with-ffmpeg - page-size: 16kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r26d - build-system: ndk-build - ffmpeg: with-ffmpeg - page-size: 16kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r27c - build-system: ndk-build - ffmpeg: with-ffmpeg - page-size: 16kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r26d - build-system: cmake - ffmpeg: no-ffmpeg - page-size: 16kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r27c - build-system: cmake - ffmpeg: no-ffmpeg - page-size: 16kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r26d - build-system: ndk-build - ffmpeg: no-ffmpeg - page-size: 16kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r27c - build-system: ndk-build - ffmpeg: no-ffmpeg - page-size: 16kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r26d - build-system: cmake - ffmpeg: with-ffmpeg - page-size: 4kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r27c - build-system: cmake - ffmpeg: with-ffmpeg - page-size: 4kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r26d - build-system: ndk-build - ffmpeg: with-ffmpeg - page-size: 4kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r27c - build-system: ndk-build - ffmpeg: with-ffmpeg - page-size: 4kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r26d - build-system: cmake - ffmpeg: no-ffmpeg - page-size: 4kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r27c - build-system: cmake - ffmpeg: no-ffmpeg - page-size: 4kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r26d - build-system: ndk-build - ffmpeg: no-ffmpeg - page-size: 4kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r27c - build-system: ndk-build - ffmpeg: no-ffmpeg - page-size: 4kb - run-on: master-only - - # macOS: Additional 15 jobs (all configs except the one already in PR) - - os: macos-latest - os-name: macOS - ndk: r26d - build-system: cmake - ffmpeg: with-ffmpeg - page-size: 16kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r27c - build-system: cmake - ffmpeg: with-ffmpeg - page-size: 16kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r26d - build-system: ndk-build - ffmpeg: with-ffmpeg - page-size: 16kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r27c - build-system: ndk-build - ffmpeg: with-ffmpeg - page-size: 16kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r26d - build-system: cmake - ffmpeg: no-ffmpeg - page-size: 16kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r27c - build-system: cmake - ffmpeg: no-ffmpeg - page-size: 16kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r26d - build-system: ndk-build - ffmpeg: no-ffmpeg - page-size: 16kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r27c - build-system: ndk-build - ffmpeg: no-ffmpeg - page-size: 16kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r26d - build-system: cmake - ffmpeg: with-ffmpeg - page-size: 4kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r27c - build-system: cmake - ffmpeg: with-ffmpeg - page-size: 4kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r26d - build-system: ndk-build - ffmpeg: with-ffmpeg - page-size: 4kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r27c - build-system: ndk-build - ffmpeg: with-ffmpeg - page-size: 4kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r26d - build-system: cmake - ffmpeg: no-ffmpeg - page-size: 4kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r27c - build-system: cmake - ffmpeg: no-ffmpeg - page-size: 4kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r26d - build-system: ndk-build - ffmpeg: no-ffmpeg - page-size: 4kb - run-on: master-only # Skip master-only jobs when not on master branch if: matrix.run-on == 'always' || github.ref == 'refs/heads/master' diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml new file mode 100644 index 00000000..8e246948 --- /dev/null +++ b/.github/workflows/windows-build.yml @@ -0,0 +1,246 @@ +name: Windows Build + +on: + push: + branches: [ "master" ] + pull_request: + branches: [ "master" ] + +jobs: + build: + name: "${{ matrix.os-name }} | NDK-${{ matrix.ndk }} | ${{ matrix.build-system }} | ${{ matrix.ffmpeg }} | ${{ matrix.page-size }}" + runs-on: ${{ matrix.os }} + + strategy: + fail-fast: false + matrix: + include: + # ============================================================ + # Windows: 16 jobs (1 PR + 15 master-only) + # ============================================================ + - os: windows-latest + os-name: Windows + ndk: r26d + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: always + + # Windows: Additional 15 jobs (all configs except the one already in PR) + - os: windows-latest + os-name: Windows + ndk: r27c + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r26d + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r27c + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 16kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r26d + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r27c + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r26d + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r27c + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 16kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r26d + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r27c + build-system: cmake + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r26d + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r27c + build-system: ndk-build + ffmpeg: with-ffmpeg + page-size: 4kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r26d + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r27c + build-system: cmake + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r26d + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: master-only + - os: windows-latest + os-name: Windows + ndk: r27c + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: master-only + + # Skip master-only jobs when not on master branch + if: matrix.run-on == 'always' || github.ref == 'refs/heads/master' + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup NDK + uses: nttld/setup-ndk@v1.4.2 + id: setup-ndk + with: + ndk-version: ${{ matrix.ndk }} + link-to-sdk: true + add-to-path: true + + - name: Install build tools (Ubuntu) + if: runner.os == 'Linux' + run: sudo apt-get update && sudo apt-get install -y ninja-build + + - name: Install build tools (macOS) + if: runner.os == 'macOS' + run: brew install ninja + + - name: Install build tools (Windows) + if: runner.os == 'Windows' + run: choco install ninja + + - name: Setup JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: gradle + + - name: Grant execute permission for scripts (Unix) + if: runner.os != 'Windows' + run: chmod +x gradlew tasks.sh + + - name: Configure build parameters + shell: bash + run: | + # Set build system flag + if [ "${{ matrix.build-system }}" == "cmake" ]; then + echo "BUILD_SYSTEM_FLAG=--enable-cmake" >> $GITHUB_ENV + else + echo "BUILD_SYSTEM_FLAG=" >> $GITHUB_ENV + fi + + # Set FFmpeg flag + if [ "${{ matrix.ffmpeg }}" == "with-ffmpeg" ]; then + echo "FFMPEG_FLAG=--enable-video-module" >> $GITHUB_ENV + else + echo "FFMPEG_FLAG=--disable-video-module" >> $GITHUB_ENV + fi + + # Set page size flag + if [ "${{ matrix.page-size }}" == "16kb" ]; then + echo "PAGE_SIZE_FLAG=--enable-16kb-page-size" >> $GITHUB_ENV + else + echo "PAGE_SIZE_FLAG=--disable-16kb-page-size" >> $GITHUB_ENV + fi + + # Set artifact name + OS_SHORT="${{ runner.os }}" + NDK_SHORT="${{ matrix.ndk }}" + BUILD_SYS="${{ matrix.build-system }}" + if [ "${{ matrix.ffmpeg }}" == "with-ffmpeg" ]; then + FFMPEG_SHORT="ffmpeg" + else + FFMPEG_SHORT="noffmpeg" + fi + PAGE_SHORT="${{ matrix.page-size }}" + + echo "ARTIFACT_NAME=apk-${OS_SHORT}-${NDK_SHORT}-${BUILD_SYS}-${FFMPEG_SHORT}-${PAGE_SHORT}" >> $GITHUB_ENV + + - name: Setup project (ndk-build mode) + if: matrix.build-system == 'ndk-build' + shell: bash + run: | + if [ "${{ runner.os }}" == "Windows" ]; then + bash tasks.sh --setup-project + else + ./tasks.sh --setup-project + fi + + - name: Build APK + shell: bash + run: | + if [ "${{ runner.os }}" == "Windows" ]; then + bash tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build + else + ./tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build + fi + + - name: Find and rename APK + shell: bash + run: | + APK_FILE=$(find "cgeDemo/build" -name "*.apk" | grep -i release | head -n 1) + mkdir -p artifacts + cp "$APK_FILE" "artifacts/cgeDemo-${{ env.ARTIFACT_NAME }}.apk" + echo "APK saved as: artifacts/cgeDemo-${{ env.ARTIFACT_NAME }}.apk" + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: ${{ env.ARTIFACT_NAME }} + path: artifacts/*.apk + compression-level: 0 + retention-days: 15 + if-no-files-found: error + From 9b5d50911e48ed09f001b1ba9c89a3304964f946 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 15 Jan 2026 18:59:39 +0000 Subject: [PATCH 05/17] Add explicit workflow permissions Co-authored-by: wysaid <1430725+wysaid@users.noreply.github.com> --- .github/workflows/macos-build.yml | 3 +++ .github/workflows/ubuntu-build.yml | 3 +++ .github/workflows/windows-build.yml | 3 +++ 3 files changed, 9 insertions(+) diff --git a/.github/workflows/macos-build.yml b/.github/workflows/macos-build.yml index d4d28713..b262e90b 100644 --- a/.github/workflows/macos-build.yml +++ b/.github/workflows/macos-build.yml @@ -6,6 +6,9 @@ on: pull_request: branches: [ "master" ] +permissions: + contents: read + jobs: build: name: "${{ matrix.os-name }} | NDK-${{ matrix.ndk }} | ${{ matrix.build-system }} | ${{ matrix.ffmpeg }} | ${{ matrix.page-size }}" diff --git a/.github/workflows/ubuntu-build.yml b/.github/workflows/ubuntu-build.yml index 9fce0865..2d2456b6 100644 --- a/.github/workflows/ubuntu-build.yml +++ b/.github/workflows/ubuntu-build.yml @@ -6,6 +6,9 @@ on: pull_request: branches: [ "master" ] +permissions: + contents: read + jobs: build: name: "${{ matrix.os-name }} | NDK-${{ matrix.ndk }} | ${{ matrix.build-system }} | ${{ matrix.ffmpeg }} | ${{ matrix.page-size }}" diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index 8e246948..f61e1f78 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -6,6 +6,9 @@ on: pull_request: branches: [ "master" ] +permissions: + contents: read + jobs: build: name: "${{ matrix.os-name }} | NDK-${{ matrix.ndk }} | ${{ matrix.build-system }} | ${{ matrix.ffmpeg }} | ${{ matrix.page-size }}" From e4c5d57ce6c02e08c73627681b0cc051c1561fd1 Mon Sep 17 00:00:00 2001 From: "wangyang (wysaid)" Date: Sat, 17 Jan 2026 04:02:33 +0800 Subject: [PATCH 06/17] Fix CI triggers for better_workflow and simplify OS-specific steps --- .github/workflows/macos-build.yml | 34 ++++++---------------------- .github/workflows/ubuntu-build.yml | 31 +++++-------------------- .github/workflows/windows-build.yml | 35 +++++------------------------ 3 files changed, 19 insertions(+), 81 deletions(-) diff --git a/.github/workflows/macos-build.yml b/.github/workflows/macos-build.yml index b262e90b..18d13b15 100644 --- a/.github/workflows/macos-build.yml +++ b/.github/workflows/macos-build.yml @@ -2,9 +2,9 @@ name: macOS Build on: push: - branches: [ "master" ] + branches: [ "master", "better_workflow" ] pull_request: - branches: [ "master" ] + branches: [ "master", "better_workflow" ] permissions: contents: read @@ -150,19 +150,10 @@ jobs: ndk-version: ${{ matrix.ndk }} link-to-sdk: true add-to-path: true - - - name: Install build tools (Ubuntu) - if: runner.os == 'Linux' - run: sudo apt-get update && sudo apt-get install -y ninja-build - - - name: Install build tools (macOS) - if: runner.os == 'macOS' + + - name: Install build tools run: brew install ninja - - name: Install build tools (Windows) - if: runner.os == 'Windows' - run: choco install ninja - - name: Setup JDK 17 uses: actions/setup-java@v3 with: @@ -170,8 +161,7 @@ jobs: distribution: 'temurin' cache: gradle - - name: Grant execute permission for scripts (Unix) - if: runner.os != 'Windows' + - name: Grant execute permission for scripts run: chmod +x gradlew tasks.sh - name: Configure build parameters @@ -214,21 +204,11 @@ jobs: - name: Setup project (ndk-build mode) if: matrix.build-system == 'ndk-build' shell: bash - run: | - if [ "${{ runner.os }}" == "Windows" ]; then - bash tasks.sh --setup-project - else - ./tasks.sh --setup-project - fi + run: ./tasks.sh --setup-project - name: Build APK shell: bash - run: | - if [ "${{ runner.os }}" == "Windows" ]; then - bash tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build - else - ./tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build - fi + run: ./tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build - name: Find and rename APK shell: bash diff --git a/.github/workflows/ubuntu-build.yml b/.github/workflows/ubuntu-build.yml index 2d2456b6..6c15575c 100644 --- a/.github/workflows/ubuntu-build.yml +++ b/.github/workflows/ubuntu-build.yml @@ -2,9 +2,9 @@ name: Ubuntu Build on: push: - branches: [ "master" ] + branches: [ "master", "better_workflow" ] pull_request: - branches: [ "master" ] + branches: [ "master", "better_workflow" ] permissions: contents: read @@ -149,18 +149,9 @@ jobs: link-to-sdk: true add-to-path: true - - name: Install build tools (Ubuntu) - if: runner.os == 'Linux' + - name: Install build tools run: sudo apt-get update && sudo apt-get install -y ninja-build - - name: Install build tools (macOS) - if: runner.os == 'macOS' - run: brew install ninja - - - name: Install build tools (Windows) - if: runner.os == 'Windows' - run: choco install ninja - - name: Setup JDK 17 uses: actions/setup-java@v3 with: @@ -212,21 +203,11 @@ jobs: - name: Setup project (ndk-build mode) if: matrix.build-system == 'ndk-build' shell: bash - run: | - if [ "${{ runner.os }}" == "Windows" ]; then - bash tasks.sh --setup-project - else - ./tasks.sh --setup-project - fi + run: ./tasks.sh --setup-project - name: Build APK shell: bash - run: | - if [ "${{ runner.os }}" == "Windows" ]; then - bash tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build - else - ./tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build - fi + run: ./tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build - name: Find and rename APK shell: bash @@ -248,7 +229,7 @@ jobs: lint: name: Lint runs-on: ubuntu-latest - if: github.ref == 'refs/heads/master' + if: github.event_name == 'pull_request' || github.ref == 'refs/heads/master' || github.ref == 'refs/heads/better_workflow' steps: - name: Checkout code diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index f61e1f78..2e962502 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -2,9 +2,9 @@ name: Windows Build on: push: - branches: [ "master" ] + branches: [ "master", "better_workflow" ] pull_request: - branches: [ "master" ] + branches: [ "master", "better_workflow" ] permissions: contents: read @@ -150,17 +150,8 @@ jobs: ndk-version: ${{ matrix.ndk }} link-to-sdk: true add-to-path: true - - - name: Install build tools (Ubuntu) - if: runner.os == 'Linux' - run: sudo apt-get update && sudo apt-get install -y ninja-build - - - name: Install build tools (macOS) - if: runner.os == 'macOS' - run: brew install ninja - - - name: Install build tools (Windows) - if: runner.os == 'Windows' + + - name: Install build tools run: choco install ninja - name: Setup JDK 17 @@ -170,10 +161,6 @@ jobs: distribution: 'temurin' cache: gradle - - name: Grant execute permission for scripts (Unix) - if: runner.os != 'Windows' - run: chmod +x gradlew tasks.sh - - name: Configure build parameters shell: bash run: | @@ -214,21 +201,11 @@ jobs: - name: Setup project (ndk-build mode) if: matrix.build-system == 'ndk-build' shell: bash - run: | - if [ "${{ runner.os }}" == "Windows" ]; then - bash tasks.sh --setup-project - else - ./tasks.sh --setup-project - fi + run: bash tasks.sh --setup-project - name: Build APK shell: bash - run: | - if [ "${{ runner.os }}" == "Windows" ]; then - bash tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build - else - ./tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build - fi + run: bash tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build - name: Find and rename APK shell: bash From 815ca46cc752dab577cd3f01b0479e6ddf3f522e Mon Sep 17 00:00:00 2001 From: "wangyang (wysaid)" Date: Sat, 17 Jan 2026 04:04:29 +0800 Subject: [PATCH 07/17] Trigger CI for better_workflow PRs --- .github/workflows/build.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 8162030d..824546dc 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,9 +2,9 @@ name: Build on: push: - branches: [ "master" ] + branches: [ "master", "better_workflow" ] pull_request: - branches: [ "master" ] + branches: [ "master", "better_workflow" ] jobs: build: @@ -483,7 +483,7 @@ jobs: lint: name: Lint runs-on: ubuntu-latest - if: github.ref == 'refs/heads/master' + if: github.event_name == 'pull_request' || github.ref == 'refs/heads/master' || github.ref == 'refs/heads/better_workflow' steps: - name: Checkout code From 5dd1958fd1eb301c3bab02d32cf5794ebf1d16af Mon Sep 17 00:00:00 2001 From: "wangyang (wysaid)" Date: Sat, 17 Jan 2026 04:14:17 +0800 Subject: [PATCH 08/17] Fix workflow triggers and macOS matrix --- .github/workflows/macos-build.yml | 11 +++++++++-- .github/workflows/ubuntu-build.yml | 6 +++--- .github/workflows/windows-build.yml | 6 +++--- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/.github/workflows/macos-build.yml b/.github/workflows/macos-build.yml index 18d13b15..ca58f094 100644 --- a/.github/workflows/macos-build.yml +++ b/.github/workflows/macos-build.yml @@ -2,9 +2,9 @@ name: macOS Build on: push: - branches: [ "master", "better_workflow" ] + branches: [ "master" ] pull_request: - branches: [ "master", "better_workflow" ] + branches: [ "master" ] permissions: contents: read @@ -135,6 +135,13 @@ jobs: ffmpeg: no-ffmpeg page-size: 4kb run-on: master-only + - os: macos-latest + os-name: macOS + ndk: r27c + build-system: ndk-build + ffmpeg: no-ffmpeg + page-size: 4kb + run-on: master-only # Skip master-only jobs when not on master branch if: matrix.run-on == 'always' || github.ref == 'refs/heads/master' diff --git a/.github/workflows/ubuntu-build.yml b/.github/workflows/ubuntu-build.yml index 6c15575c..088b5e0e 100644 --- a/.github/workflows/ubuntu-build.yml +++ b/.github/workflows/ubuntu-build.yml @@ -2,9 +2,9 @@ name: Ubuntu Build on: push: - branches: [ "master", "better_workflow" ] + branches: [ "master" ] pull_request: - branches: [ "master", "better_workflow" ] + branches: [ "master" ] permissions: contents: read @@ -229,7 +229,7 @@ jobs: lint: name: Lint runs-on: ubuntu-latest - if: github.event_name == 'pull_request' || github.ref == 'refs/heads/master' || github.ref == 'refs/heads/better_workflow' + if: github.event_name == 'pull_request' || github.ref == 'refs/heads/master' steps: - name: Checkout code diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index 2e962502..36323dee 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -2,9 +2,9 @@ name: Windows Build on: push: - branches: [ "master", "better_workflow" ] + branches: [ "master" ] pull_request: - branches: [ "master", "better_workflow" ] + branches: [ "master" ] permissions: contents: read @@ -152,7 +152,7 @@ jobs: add-to-path: true - name: Install build tools - run: choco install ninja + run: choco install ninja -y - name: Setup JDK 17 uses: actions/setup-java@v3 From c2e9cdeaa2337af2d9da3a5b2c406abb803d3774 Mon Sep 17 00:00:00 2001 From: "wangyang (wysaid)" Date: Sat, 17 Jan 2026 04:31:59 +0800 Subject: [PATCH 09/17] Fix matrix gating in workflows --- .github/workflows/macos-build.yml | 23 +++++++++++++++++++---- .github/workflows/ubuntu-build.yml | 24 +++++++++++++++++++----- .github/workflows/windows-build.yml | 22 ++++++++++++++++++---- 3 files changed, 56 insertions(+), 13 deletions(-) diff --git a/.github/workflows/macos-build.yml b/.github/workflows/macos-build.yml index ca58f094..592c1366 100644 --- a/.github/workflows/macos-build.yml +++ b/.github/workflows/macos-build.yml @@ -143,14 +143,22 @@ jobs: page-size: 4kb run-on: master-only - # Skip master-only jobs when not on master branch - if: matrix.run-on == 'always' || github.ref == 'refs/heads/master' - steps: - name: Checkout code uses: actions/checkout@v4 + + - name: Decide whether to run + id: gate + shell: bash + run: | + if [ "${{ matrix.run-on }}" = "always" ] || [ "${{ github.ref }}" = "refs/heads/master" ]; then + echo "should_run=true" >> "$GITHUB_OUTPUT" + else + echo "should_run=false" >> "$GITHUB_OUTPUT" + fi - name: Setup NDK + if: steps.gate.outputs.should_run == 'true' uses: nttld/setup-ndk@v1.4.2 id: setup-ndk with: @@ -159,9 +167,11 @@ jobs: add-to-path: true - name: Install build tools + if: steps.gate.outputs.should_run == 'true' run: brew install ninja - name: Setup JDK 17 + if: steps.gate.outputs.should_run == 'true' uses: actions/setup-java@v3 with: java-version: '17' @@ -169,9 +179,11 @@ jobs: cache: gradle - name: Grant execute permission for scripts + if: steps.gate.outputs.should_run == 'true' run: chmod +x gradlew tasks.sh - name: Configure build parameters + if: steps.gate.outputs.should_run == 'true' shell: bash run: | # Set build system flag @@ -209,15 +221,17 @@ jobs: echo "ARTIFACT_NAME=apk-${OS_SHORT}-${NDK_SHORT}-${BUILD_SYS}-${FFMPEG_SHORT}-${PAGE_SHORT}" >> $GITHUB_ENV - name: Setup project (ndk-build mode) - if: matrix.build-system == 'ndk-build' + if: steps.gate.outputs.should_run == 'true' && matrix.build-system == 'ndk-build' shell: bash run: ./tasks.sh --setup-project - name: Build APK + if: steps.gate.outputs.should_run == 'true' shell: bash run: ./tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build - name: Find and rename APK + if: steps.gate.outputs.should_run == 'true' shell: bash run: | APK_FILE=$(find "cgeDemo/build" -name "*.apk" | grep -i release | head -n 1) @@ -226,6 +240,7 @@ jobs: echo "APK saved as: artifacts/cgeDemo-${{ env.ARTIFACT_NAME }}.apk" - name: Upload artifacts + if: steps.gate.outputs.should_run == 'true' uses: actions/upload-artifact@v4 with: name: ${{ env.ARTIFACT_NAME }} diff --git a/.github/workflows/ubuntu-build.yml b/.github/workflows/ubuntu-build.yml index 088b5e0e..f4f3c9db 100644 --- a/.github/workflows/ubuntu-build.yml +++ b/.github/workflows/ubuntu-build.yml @@ -134,14 +134,22 @@ jobs: page-size: 16kb run-on: always - # Skip master-only jobs when not on master branch - if: matrix.run-on == 'always' || github.ref == 'refs/heads/master' - steps: - name: Checkout code uses: actions/checkout@v4 + + - name: Decide whether to run + id: gate + shell: bash + run: | + if [ "${{ matrix.run-on }}" = "always" ] || [ "${{ github.ref }}" = "refs/heads/master" ]; then + echo "should_run=true" >> "$GITHUB_OUTPUT" + else + echo "should_run=false" >> "$GITHUB_OUTPUT" + fi - name: Setup NDK + if: steps.gate.outputs.should_run == 'true' uses: nttld/setup-ndk@v1.4.2 id: setup-ndk with: @@ -150,9 +158,11 @@ jobs: add-to-path: true - name: Install build tools + if: steps.gate.outputs.should_run == 'true' run: sudo apt-get update && sudo apt-get install -y ninja-build - name: Setup JDK 17 + if: steps.gate.outputs.should_run == 'true' uses: actions/setup-java@v3 with: java-version: '17' @@ -160,10 +170,11 @@ jobs: cache: gradle - name: Grant execute permission for scripts (Unix) - if: runner.os != 'Windows' + if: steps.gate.outputs.should_run == 'true' && runner.os != 'Windows' run: chmod +x gradlew tasks.sh - name: Configure build parameters + if: steps.gate.outputs.should_run == 'true' shell: bash run: | # Set build system flag @@ -201,15 +212,17 @@ jobs: echo "ARTIFACT_NAME=apk-${OS_SHORT}-${NDK_SHORT}-${BUILD_SYS}-${FFMPEG_SHORT}-${PAGE_SHORT}" >> $GITHUB_ENV - name: Setup project (ndk-build mode) - if: matrix.build-system == 'ndk-build' + if: steps.gate.outputs.should_run == 'true' && matrix.build-system == 'ndk-build' shell: bash run: ./tasks.sh --setup-project - name: Build APK + if: steps.gate.outputs.should_run == 'true' shell: bash run: ./tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build - name: Find and rename APK + if: steps.gate.outputs.should_run == 'true' shell: bash run: | APK_FILE=$(find "cgeDemo/build" -name "*.apk" | grep -i release | head -n 1) @@ -218,6 +231,7 @@ jobs: echo "APK saved as: artifacts/cgeDemo-${{ env.ARTIFACT_NAME }}.apk" - name: Upload artifacts + if: steps.gate.outputs.should_run == 'true' uses: actions/upload-artifact@v4 with: name: ${{ env.ARTIFACT_NAME }} diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index 36323dee..25527efb 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -136,14 +136,22 @@ jobs: page-size: 4kb run-on: master-only - # Skip master-only jobs when not on master branch - if: matrix.run-on == 'always' || github.ref == 'refs/heads/master' - steps: - name: Checkout code uses: actions/checkout@v4 + + - name: Decide whether to run + id: gate + shell: bash + run: | + if [ "${{ matrix.run-on }}" = "always" ] || [ "${{ github.ref }}" = "refs/heads/master" ]; then + echo "should_run=true" >> "$GITHUB_OUTPUT" + else + echo "should_run=false" >> "$GITHUB_OUTPUT" + fi - name: Setup NDK + if: steps.gate.outputs.should_run == 'true' uses: nttld/setup-ndk@v1.4.2 id: setup-ndk with: @@ -152,9 +160,11 @@ jobs: add-to-path: true - name: Install build tools + if: steps.gate.outputs.should_run == 'true' run: choco install ninja -y - name: Setup JDK 17 + if: steps.gate.outputs.should_run == 'true' uses: actions/setup-java@v3 with: java-version: '17' @@ -162,6 +172,7 @@ jobs: cache: gradle - name: Configure build parameters + if: steps.gate.outputs.should_run == 'true' shell: bash run: | # Set build system flag @@ -199,15 +210,17 @@ jobs: echo "ARTIFACT_NAME=apk-${OS_SHORT}-${NDK_SHORT}-${BUILD_SYS}-${FFMPEG_SHORT}-${PAGE_SHORT}" >> $GITHUB_ENV - name: Setup project (ndk-build mode) - if: matrix.build-system == 'ndk-build' + if: steps.gate.outputs.should_run == 'true' && matrix.build-system == 'ndk-build' shell: bash run: bash tasks.sh --setup-project - name: Build APK + if: steps.gate.outputs.should_run == 'true' shell: bash run: bash tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build - name: Find and rename APK + if: steps.gate.outputs.should_run == 'true' shell: bash run: | APK_FILE=$(find "cgeDemo/build" -name "*.apk" | grep -i release | head -n 1) @@ -216,6 +229,7 @@ jobs: echo "APK saved as: artifacts/cgeDemo-${{ env.ARTIFACT_NAME }}.apk" - name: Upload artifacts + if: steps.gate.outputs.should_run == 'true' uses: actions/upload-artifact@v4 with: name: ${{ env.ARTIFACT_NAME }} From 726c2469a092dd756bdf045e0ed76c8363ee22dd Mon Sep 17 00:00:00 2001 From: "wangyang (wysaid)" Date: Sat, 17 Jan 2026 04:44:53 +0800 Subject: [PATCH 10/17] Reduce PR matrix and fix macOS NDK arch --- .github/workflows/README.md | 2 +- .github/workflows/macos-build.yml | 146 +--------------------------- .github/workflows/ubuntu-build.yml | 21 +--- .github/workflows/windows-build.yml | 138 +------------------------- 4 files changed, 7 insertions(+), 300 deletions(-) diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 43409c52..55075873 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -18,7 +18,7 @@ 1. **操作系统** (3种) - Windows (windows-latest) - - macOS (macos-latest) + - macOS (macos-13) - Ubuntu (ubuntu-latest) 2. **NDK 版本** (2种) diff --git a/.github/workflows/macos-build.yml b/.github/workflows/macos-build.yml index 592c1366..f563fe29 100644 --- a/.github/workflows/macos-build.yml +++ b/.github/workflows/macos-build.yml @@ -17,148 +17,13 @@ jobs: strategy: fail-fast: false matrix: - include: - # ============================================================ - # macOS: 16 jobs (1 PR + 15 master-only) - # ============================================================ - - os: macos-latest - os-name: macOS - ndk: r27c - build-system: ndk-build - ffmpeg: no-ffmpeg - page-size: 4kb - run-on: always - - # macOS: Additional 15 jobs (all configs except the one already in PR) - - os: macos-latest - os-name: macOS - ndk: r26d - build-system: cmake - ffmpeg: with-ffmpeg - page-size: 16kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r27c - build-system: cmake - ffmpeg: with-ffmpeg - page-size: 16kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r26d - build-system: ndk-build - ffmpeg: with-ffmpeg - page-size: 16kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r27c - build-system: ndk-build - ffmpeg: with-ffmpeg - page-size: 16kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r26d - build-system: cmake - ffmpeg: no-ffmpeg - page-size: 16kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r27c - build-system: cmake - ffmpeg: no-ffmpeg - page-size: 16kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r26d - build-system: ndk-build - ffmpeg: no-ffmpeg - page-size: 16kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r27c - build-system: ndk-build - ffmpeg: no-ffmpeg - page-size: 16kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r26d - build-system: cmake - ffmpeg: with-ffmpeg - page-size: 4kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r27c - build-system: cmake - ffmpeg: with-ffmpeg - page-size: 4kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r26d - build-system: ndk-build - ffmpeg: with-ffmpeg - page-size: 4kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r27c - build-system: ndk-build - ffmpeg: with-ffmpeg - page-size: 4kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r26d - build-system: cmake - ffmpeg: no-ffmpeg - page-size: 4kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r27c - build-system: cmake - ffmpeg: no-ffmpeg - page-size: 4kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r26d - build-system: ndk-build - ffmpeg: no-ffmpeg - page-size: 4kb - run-on: master-only - - os: macos-latest - os-name: macOS - ndk: r27c - build-system: ndk-build - ffmpeg: no-ffmpeg - page-size: 4kb - run-on: master-only + include: ${{ fromJson(github.event_name == 'pull_request' && '[{"os":"macos-13","os-name":"macOS","ndk":"r27c","build-system":"ndk-build","ffmpeg":"no-ffmpeg","page-size":"4kb"}]' || '[{"os":"macos-13","os-name":"macOS","ndk":"r26d","build-system":"cmake","ffmpeg":"with-ffmpeg","page-size":"16kb"},{"os":"macos-13","os-name":"macOS","ndk":"r27c","build-system":"cmake","ffmpeg":"with-ffmpeg","page-size":"16kb"},{"os":"macos-13","os-name":"macOS","ndk":"r26d","build-system":"ndk-build","ffmpeg":"with-ffmpeg","page-size":"16kb"},{"os":"macos-13","os-name":"macOS","ndk":"r27c","build-system":"ndk-build","ffmpeg":"with-ffmpeg","page-size":"16kb"},{"os":"macos-13","os-name":"macOS","ndk":"r26d","build-system":"cmake","ffmpeg":"no-ffmpeg","page-size":"16kb"},{"os":"macos-13","os-name":"macOS","ndk":"r27c","build-system":"cmake","ffmpeg":"no-ffmpeg","page-size":"16kb"},{"os":"macos-13","os-name":"macOS","ndk":"r26d","build-system":"ndk-build","ffmpeg":"no-ffmpeg","page-size":"16kb"},{"os":"macos-13","os-name":"macOS","ndk":"r27c","build-system":"ndk-build","ffmpeg":"no-ffmpeg","page-size":"16kb"},{"os":"macos-13","os-name":"macOS","ndk":"r26d","build-system":"cmake","ffmpeg":"with-ffmpeg","page-size":"4kb"},{"os":"macos-13","os-name":"macOS","ndk":"r27c","build-system":"cmake","ffmpeg":"with-ffmpeg","page-size":"4kb"},{"os":"macos-13","os-name":"macOS","ndk":"r26d","build-system":"ndk-build","ffmpeg":"with-ffmpeg","page-size":"4kb"},{"os":"macos-13","os-name":"macOS","ndk":"r27c","build-system":"ndk-build","ffmpeg":"with-ffmpeg","page-size":"4kb"},{"os":"macos-13","os-name":"macOS","ndk":"r26d","build-system":"cmake","ffmpeg":"no-ffmpeg","page-size":"4kb"},{"os":"macos-13","os-name":"macOS","ndk":"r27c","build-system":"cmake","ffmpeg":"no-ffmpeg","page-size":"4kb"},{"os":"macos-13","os-name":"macOS","ndk":"r26d","build-system":"ndk-build","ffmpeg":"no-ffmpeg","page-size":"4kb"},{"os":"macos-13","os-name":"macOS","ndk":"r27c","build-system":"ndk-build","ffmpeg":"no-ffmpeg","page-size":"4kb"}]') }} steps: - name: Checkout code uses: actions/checkout@v4 - - - name: Decide whether to run - id: gate - shell: bash - run: | - if [ "${{ matrix.run-on }}" = "always" ] || [ "${{ github.ref }}" = "refs/heads/master" ]; then - echo "should_run=true" >> "$GITHUB_OUTPUT" - else - echo "should_run=false" >> "$GITHUB_OUTPUT" - fi - name: Setup NDK - if: steps.gate.outputs.should_run == 'true' uses: nttld/setup-ndk@v1.4.2 id: setup-ndk with: @@ -167,11 +32,9 @@ jobs: add-to-path: true - name: Install build tools - if: steps.gate.outputs.should_run == 'true' run: brew install ninja - name: Setup JDK 17 - if: steps.gate.outputs.should_run == 'true' uses: actions/setup-java@v3 with: java-version: '17' @@ -179,11 +42,9 @@ jobs: cache: gradle - name: Grant execute permission for scripts - if: steps.gate.outputs.should_run == 'true' run: chmod +x gradlew tasks.sh - name: Configure build parameters - if: steps.gate.outputs.should_run == 'true' shell: bash run: | # Set build system flag @@ -221,17 +82,15 @@ jobs: echo "ARTIFACT_NAME=apk-${OS_SHORT}-${NDK_SHORT}-${BUILD_SYS}-${FFMPEG_SHORT}-${PAGE_SHORT}" >> $GITHUB_ENV - name: Setup project (ndk-build mode) - if: steps.gate.outputs.should_run == 'true' && matrix.build-system == 'ndk-build' + if: matrix.build-system == 'ndk-build' shell: bash run: ./tasks.sh --setup-project - name: Build APK - if: steps.gate.outputs.should_run == 'true' shell: bash run: ./tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build - name: Find and rename APK - if: steps.gate.outputs.should_run == 'true' shell: bash run: | APK_FILE=$(find "cgeDemo/build" -name "*.apk" | grep -i release | head -n 1) @@ -240,7 +99,6 @@ jobs: echo "APK saved as: artifacts/cgeDemo-${{ env.ARTIFACT_NAME }}.apk" - name: Upload artifacts - if: steps.gate.outputs.should_run == 'true' uses: actions/upload-artifact@v4 with: name: ${{ env.ARTIFACT_NAME }} diff --git a/.github/workflows/ubuntu-build.yml b/.github/workflows/ubuntu-build.yml index f4f3c9db..1e0e68a8 100644 --- a/.github/workflows/ubuntu-build.yml +++ b/.github/workflows/ubuntu-build.yml @@ -137,19 +137,8 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v4 - - - name: Decide whether to run - id: gate - shell: bash - run: | - if [ "${{ matrix.run-on }}" = "always" ] || [ "${{ github.ref }}" = "refs/heads/master" ]; then - echo "should_run=true" >> "$GITHUB_OUTPUT" - else - echo "should_run=false" >> "$GITHUB_OUTPUT" - fi - name: Setup NDK - if: steps.gate.outputs.should_run == 'true' uses: nttld/setup-ndk@v1.4.2 id: setup-ndk with: @@ -158,11 +147,9 @@ jobs: add-to-path: true - name: Install build tools - if: steps.gate.outputs.should_run == 'true' run: sudo apt-get update && sudo apt-get install -y ninja-build - name: Setup JDK 17 - if: steps.gate.outputs.should_run == 'true' uses: actions/setup-java@v3 with: java-version: '17' @@ -170,11 +157,10 @@ jobs: cache: gradle - name: Grant execute permission for scripts (Unix) - if: steps.gate.outputs.should_run == 'true' && runner.os != 'Windows' + if: runner.os != 'Windows' run: chmod +x gradlew tasks.sh - name: Configure build parameters - if: steps.gate.outputs.should_run == 'true' shell: bash run: | # Set build system flag @@ -212,17 +198,15 @@ jobs: echo "ARTIFACT_NAME=apk-${OS_SHORT}-${NDK_SHORT}-${BUILD_SYS}-${FFMPEG_SHORT}-${PAGE_SHORT}" >> $GITHUB_ENV - name: Setup project (ndk-build mode) - if: steps.gate.outputs.should_run == 'true' && matrix.build-system == 'ndk-build' + if: matrix.build-system == 'ndk-build' shell: bash run: ./tasks.sh --setup-project - name: Build APK - if: steps.gate.outputs.should_run == 'true' shell: bash run: ./tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build - name: Find and rename APK - if: steps.gate.outputs.should_run == 'true' shell: bash run: | APK_FILE=$(find "cgeDemo/build" -name "*.apk" | grep -i release | head -n 1) @@ -231,7 +215,6 @@ jobs: echo "APK saved as: artifacts/cgeDemo-${{ env.ARTIFACT_NAME }}.apk" - name: Upload artifacts - if: steps.gate.outputs.should_run == 'true' uses: actions/upload-artifact@v4 with: name: ${{ env.ARTIFACT_NAME }} diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index 25527efb..594932e4 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -17,141 +17,13 @@ jobs: strategy: fail-fast: false matrix: - include: - # ============================================================ - # Windows: 16 jobs (1 PR + 15 master-only) - # ============================================================ - - os: windows-latest - os-name: Windows - ndk: r26d - build-system: cmake - ffmpeg: with-ffmpeg - page-size: 16kb - run-on: always - - # Windows: Additional 15 jobs (all configs except the one already in PR) - - os: windows-latest - os-name: Windows - ndk: r27c - build-system: cmake - ffmpeg: with-ffmpeg - page-size: 16kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r26d - build-system: ndk-build - ffmpeg: with-ffmpeg - page-size: 16kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r27c - build-system: ndk-build - ffmpeg: with-ffmpeg - page-size: 16kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r26d - build-system: cmake - ffmpeg: no-ffmpeg - page-size: 16kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r27c - build-system: cmake - ffmpeg: no-ffmpeg - page-size: 16kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r26d - build-system: ndk-build - ffmpeg: no-ffmpeg - page-size: 16kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r27c - build-system: ndk-build - ffmpeg: no-ffmpeg - page-size: 16kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r26d - build-system: cmake - ffmpeg: with-ffmpeg - page-size: 4kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r27c - build-system: cmake - ffmpeg: with-ffmpeg - page-size: 4kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r26d - build-system: ndk-build - ffmpeg: with-ffmpeg - page-size: 4kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r27c - build-system: ndk-build - ffmpeg: with-ffmpeg - page-size: 4kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r26d - build-system: cmake - ffmpeg: no-ffmpeg - page-size: 4kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r27c - build-system: cmake - ffmpeg: no-ffmpeg - page-size: 4kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r26d - build-system: ndk-build - ffmpeg: no-ffmpeg - page-size: 4kb - run-on: master-only - - os: windows-latest - os-name: Windows - ndk: r27c - build-system: ndk-build - ffmpeg: no-ffmpeg - page-size: 4kb - run-on: master-only + include: ${{ fromJson(github.event_name == 'pull_request' && '[{"os":"windows-latest","os-name":"Windows","ndk":"r26d","build-system":"cmake","ffmpeg":"with-ffmpeg","page-size":"16kb"}]' || '[{"os":"windows-latest","os-name":"Windows","ndk":"r26d","build-system":"cmake","ffmpeg":"with-ffmpeg","page-size":"16kb"},{"os":"windows-latest","os-name":"Windows","ndk":"r27c","build-system":"cmake","ffmpeg":"with-ffmpeg","page-size":"16kb"},{"os":"windows-latest","os-name":"Windows","ndk":"r26d","build-system":"ndk-build","ffmpeg":"with-ffmpeg","page-size":"16kb"},{"os":"windows-latest","os-name":"Windows","ndk":"r27c","build-system":"ndk-build","ffmpeg":"with-ffmpeg","page-size":"16kb"},{"os":"windows-latest","os-name":"Windows","ndk":"r26d","build-system":"cmake","ffmpeg":"no-ffmpeg","page-size":"16kb"},{"os":"windows-latest","os-name":"Windows","ndk":"r27c","build-system":"cmake","ffmpeg":"no-ffmpeg","page-size":"16kb"},{"os":"windows-latest","os-name":"Windows","ndk":"r26d","build-system":"ndk-build","ffmpeg":"no-ffmpeg","page-size":"16kb"},{"os":"windows-latest","os-name":"Windows","ndk":"r27c","build-system":"ndk-build","ffmpeg":"no-ffmpeg","page-size":"16kb"},{"os":"windows-latest","os-name":"Windows","ndk":"r26d","build-system":"cmake","ffmpeg":"with-ffmpeg","page-size":"4kb"},{"os":"windows-latest","os-name":"Windows","ndk":"r27c","build-system":"cmake","ffmpeg":"with-ffmpeg","page-size":"4kb"},{"os":"windows-latest","os-name":"Windows","ndk":"r26d","build-system":"ndk-build","ffmpeg":"with-ffmpeg","page-size":"4kb"},{"os":"windows-latest","os-name":"Windows","ndk":"r27c","build-system":"ndk-build","ffmpeg":"with-ffmpeg","page-size":"4kb"},{"os":"windows-latest","os-name":"Windows","ndk":"r26d","build-system":"cmake","ffmpeg":"no-ffmpeg","page-size":"4kb"},{"os":"windows-latest","os-name":"Windows","ndk":"r27c","build-system":"cmake","ffmpeg":"no-ffmpeg","page-size":"4kb"},{"os":"windows-latest","os-name":"Windows","ndk":"r26d","build-system":"ndk-build","ffmpeg":"no-ffmpeg","page-size":"4kb"},{"os":"windows-latest","os-name":"Windows","ndk":"r27c","build-system":"ndk-build","ffmpeg":"no-ffmpeg","page-size":"4kb"}]') }} steps: - name: Checkout code uses: actions/checkout@v4 - - - name: Decide whether to run - id: gate - shell: bash - run: | - if [ "${{ matrix.run-on }}" = "always" ] || [ "${{ github.ref }}" = "refs/heads/master" ]; then - echo "should_run=true" >> "$GITHUB_OUTPUT" - else - echo "should_run=false" >> "$GITHUB_OUTPUT" - fi - name: Setup NDK - if: steps.gate.outputs.should_run == 'true' uses: nttld/setup-ndk@v1.4.2 id: setup-ndk with: @@ -160,11 +32,9 @@ jobs: add-to-path: true - name: Install build tools - if: steps.gate.outputs.should_run == 'true' run: choco install ninja -y - name: Setup JDK 17 - if: steps.gate.outputs.should_run == 'true' uses: actions/setup-java@v3 with: java-version: '17' @@ -172,7 +42,6 @@ jobs: cache: gradle - name: Configure build parameters - if: steps.gate.outputs.should_run == 'true' shell: bash run: | # Set build system flag @@ -210,17 +79,15 @@ jobs: echo "ARTIFACT_NAME=apk-${OS_SHORT}-${NDK_SHORT}-${BUILD_SYS}-${FFMPEG_SHORT}-${PAGE_SHORT}" >> $GITHUB_ENV - name: Setup project (ndk-build mode) - if: steps.gate.outputs.should_run == 'true' && matrix.build-system == 'ndk-build' + if: matrix.build-system == 'ndk-build' shell: bash run: bash tasks.sh --setup-project - name: Build APK - if: steps.gate.outputs.should_run == 'true' shell: bash run: bash tasks.sh --release $BUILD_SYSTEM_FLAG $FFMPEG_FLAG $PAGE_SIZE_FLAG --build - name: Find and rename APK - if: steps.gate.outputs.should_run == 'true' shell: bash run: | APK_FILE=$(find "cgeDemo/build" -name "*.apk" | grep -i release | head -n 1) @@ -229,7 +96,6 @@ jobs: echo "APK saved as: artifacts/cgeDemo-${{ env.ARTIFACT_NAME }}.apk" - name: Upload artifacts - if: steps.gate.outputs.should_run == 'true' uses: actions/upload-artifact@v4 with: name: ${{ env.ARTIFACT_NAME }} From 01a3fee6ee1c8aaa639c055a8dd8b7868eda3782 Mon Sep 17 00:00:00 2001 From: "wangyang (wysaid)" Date: Sat, 17 Jan 2026 04:49:24 +0800 Subject: [PATCH 11/17] Address PR review comments --- .github/workflows/README.md | 4 ++-- .github/workflows/macos-build.yml | 6 +++++- .github/workflows/release.yml | 2 +- .github/workflows/ubuntu-build.yml | 6 +++++- .github/workflows/windows-build.yml | 6 +++++- 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 55075873..b103ff22 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -95,7 +95,7 @@ on: 构建产物 (APK) 使用以下命名格式: -``` +```text apk-{OS}-{NDK}-{BuildSystem}-{FFmpeg}-{PageSize}.apk ``` @@ -106,7 +106,7 @@ apk-{OS}-{NDK}-{BuildSystem}-{FFmpeg}-{PageSize}.apk ## Lint 检查 -代码质量检查仅在 master 分支推送时运行,确保主干代码质量。 +代码质量检查在 PR 和 master 分支推送时运行,确保主干代码质量。 ## 本地测试 diff --git a/.github/workflows/macos-build.yml b/.github/workflows/macos-build.yml index f563fe29..d77c0657 100644 --- a/.github/workflows/macos-build.yml +++ b/.github/workflows/macos-build.yml @@ -35,7 +35,7 @@ jobs: run: brew install ninja - name: Setup JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' @@ -94,6 +94,10 @@ jobs: shell: bash run: | APK_FILE=$(find "cgeDemo/build" -name "*.apk" | grep -i release | head -n 1) + if [ -z "$APK_FILE" ]; then + echo "Error: No release APK found in cgeDemo/build" + exit 1 + fi mkdir -p artifacts cp "$APK_FILE" "artifacts/cgeDemo-${{ env.ARTIFACT_NAME }}.apk" echo "APK saved as: artifacts/cgeDemo-${{ env.ARTIFACT_NAME }}.apk" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 12c2f889..c9390050 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -69,7 +69,7 @@ jobs: run: sudo apt-get update && sudo apt-get install -y ninja-build - name: Setup JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' diff --git a/.github/workflows/ubuntu-build.yml b/.github/workflows/ubuntu-build.yml index 1e0e68a8..548f2857 100644 --- a/.github/workflows/ubuntu-build.yml +++ b/.github/workflows/ubuntu-build.yml @@ -150,7 +150,7 @@ jobs: run: sudo apt-get update && sudo apt-get install -y ninja-build - name: Setup JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' @@ -210,6 +210,10 @@ jobs: shell: bash run: | APK_FILE=$(find "cgeDemo/build" -name "*.apk" | grep -i release | head -n 1) + if [ -z "$APK_FILE" ]; then + echo "Error: No release APK found in cgeDemo/build" + exit 1 + fi mkdir -p artifacts cp "$APK_FILE" "artifacts/cgeDemo-${{ env.ARTIFACT_NAME }}.apk" echo "APK saved as: artifacts/cgeDemo-${{ env.ARTIFACT_NAME }}.apk" diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index 594932e4..7984fdf9 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -35,7 +35,7 @@ jobs: run: choco install ninja -y - name: Setup JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' @@ -91,6 +91,10 @@ jobs: shell: bash run: | APK_FILE=$(find "cgeDemo/build" -name "*.apk" | grep -i release | head -n 1) + if [ -z "$APK_FILE" ]; then + echo "Error: No release APK found in cgeDemo/build" + exit 1 + fi mkdir -p artifacts cp "$APK_FILE" "artifacts/cgeDemo-${{ env.ARTIFACT_NAME }}.apk" echo "APK saved as: artifacts/cgeDemo-${{ env.ARTIFACT_NAME }}.apk" From a848d66b4b9fa4a3d2850333545eafb6c682acb2 Mon Sep 17 00:00:00 2001 From: "wangyang (wysaid)" Date: Sun, 18 Jan 2026 18:54:53 +0800 Subject: [PATCH 12/17] Use macos-latest runner for macOS CI --- .github/workflows/README.md | 2 +- .github/workflows/macos-build.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/README.md b/.github/workflows/README.md index b103ff22..6e028988 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -18,7 +18,7 @@ 1. **操作系统** (3种) - Windows (windows-latest) - - macOS (macos-13) + - macOS (macos-latest) - Ubuntu (ubuntu-latest) 2. **NDK 版本** (2种) diff --git a/.github/workflows/macos-build.yml b/.github/workflows/macos-build.yml index d77c0657..8b6f8b57 100644 --- a/.github/workflows/macos-build.yml +++ b/.github/workflows/macos-build.yml @@ -17,7 +17,7 @@ jobs: strategy: fail-fast: false matrix: - include: ${{ fromJson(github.event_name == 'pull_request' && '[{"os":"macos-13","os-name":"macOS","ndk":"r27c","build-system":"ndk-build","ffmpeg":"no-ffmpeg","page-size":"4kb"}]' || '[{"os":"macos-13","os-name":"macOS","ndk":"r26d","build-system":"cmake","ffmpeg":"with-ffmpeg","page-size":"16kb"},{"os":"macos-13","os-name":"macOS","ndk":"r27c","build-system":"cmake","ffmpeg":"with-ffmpeg","page-size":"16kb"},{"os":"macos-13","os-name":"macOS","ndk":"r26d","build-system":"ndk-build","ffmpeg":"with-ffmpeg","page-size":"16kb"},{"os":"macos-13","os-name":"macOS","ndk":"r27c","build-system":"ndk-build","ffmpeg":"with-ffmpeg","page-size":"16kb"},{"os":"macos-13","os-name":"macOS","ndk":"r26d","build-system":"cmake","ffmpeg":"no-ffmpeg","page-size":"16kb"},{"os":"macos-13","os-name":"macOS","ndk":"r27c","build-system":"cmake","ffmpeg":"no-ffmpeg","page-size":"16kb"},{"os":"macos-13","os-name":"macOS","ndk":"r26d","build-system":"ndk-build","ffmpeg":"no-ffmpeg","page-size":"16kb"},{"os":"macos-13","os-name":"macOS","ndk":"r27c","build-system":"ndk-build","ffmpeg":"no-ffmpeg","page-size":"16kb"},{"os":"macos-13","os-name":"macOS","ndk":"r26d","build-system":"cmake","ffmpeg":"with-ffmpeg","page-size":"4kb"},{"os":"macos-13","os-name":"macOS","ndk":"r27c","build-system":"cmake","ffmpeg":"with-ffmpeg","page-size":"4kb"},{"os":"macos-13","os-name":"macOS","ndk":"r26d","build-system":"ndk-build","ffmpeg":"with-ffmpeg","page-size":"4kb"},{"os":"macos-13","os-name":"macOS","ndk":"r27c","build-system":"ndk-build","ffmpeg":"with-ffmpeg","page-size":"4kb"},{"os":"macos-13","os-name":"macOS","ndk":"r26d","build-system":"cmake","ffmpeg":"no-ffmpeg","page-size":"4kb"},{"os":"macos-13","os-name":"macOS","ndk":"r27c","build-system":"cmake","ffmpeg":"no-ffmpeg","page-size":"4kb"},{"os":"macos-13","os-name":"macOS","ndk":"r26d","build-system":"ndk-build","ffmpeg":"no-ffmpeg","page-size":"4kb"},{"os":"macos-13","os-name":"macOS","ndk":"r27c","build-system":"ndk-build","ffmpeg":"no-ffmpeg","page-size":"4kb"}]') }} + include: ${{ fromJson(github.event_name == 'pull_request' && '[{"os":"macos-latest","os-name":"macOS","ndk":"r27c","build-system":"ndk-build","ffmpeg":"no-ffmpeg","page-size":"4kb"}]' || '[{"os":"macos-latest","os-name":"macOS","ndk":"r26d","build-system":"cmake","ffmpeg":"with-ffmpeg","page-size":"16kb"},{"os":"macos-latest","os-name":"macOS","ndk":"r27c","build-system":"cmake","ffmpeg":"with-ffmpeg","page-size":"16kb"},{"os":"macos-latest","os-name":"macOS","ndk":"r26d","build-system":"ndk-build","ffmpeg":"with-ffmpeg","page-size":"16kb"},{"os":"macos-latest","os-name":"macOS","ndk":"r27c","build-system":"ndk-build","ffmpeg":"with-ffmpeg","page-size":"16kb"},{"os":"macos-latest","os-name":"macOS","ndk":"r26d","build-system":"cmake","ffmpeg":"no-ffmpeg","page-size":"16kb"},{"os":"macos-latest","os-name":"macOS","ndk":"r27c","build-system":"cmake","ffmpeg":"no-ffmpeg","page-size":"16kb"},{"os":"macos-latest","os-name":"macOS","ndk":"r26d","build-system":"ndk-build","ffmpeg":"no-ffmpeg","page-size":"16kb"},{"os":"macos-latest","os-name":"macOS","ndk":"r27c","build-system":"ndk-build","ffmpeg":"no-ffmpeg","page-size":"16kb"},{"os":"macos-latest","os-name":"macOS","ndk":"r26d","build-system":"cmake","ffmpeg":"with-ffmpeg","page-size":"4kb"},{"os":"macos-latest","os-name":"macOS","ndk":"r27c","build-system":"cmake","ffmpeg":"with-ffmpeg","page-size":"4kb"},{"os":"macos-latest","os-name":"macOS","ndk":"r26d","build-system":"ndk-build","ffmpeg":"with-ffmpeg","page-size":"4kb"},{"os":"macos-latest","os-name":"macOS","ndk":"r27c","build-system":"ndk-build","ffmpeg":"with-ffmpeg","page-size":"4kb"},{"os":"macos-latest","os-name":"macOS","ndk":"r26d","build-system":"cmake","ffmpeg":"no-ffmpeg","page-size":"4kb"},{"os":"macos-latest","os-name":"macOS","ndk":"r27c","build-system":"cmake","ffmpeg":"no-ffmpeg","page-size":"4kb"},{"os":"macos-latest","os-name":"macOS","ndk":"r26d","build-system":"ndk-build","ffmpeg":"no-ffmpeg","page-size":"4kb"},{"os":"macos-latest","os-name":"macOS","ndk":"r27c","build-system":"ndk-build","ffmpeg":"no-ffmpeg","page-size":"4kb"}]') }} steps: - name: Checkout code From 753fa81ca5ace134041f1f026969d939972678dc Mon Sep 17 00:00:00 2001 From: "wangyang (wysaid)" Date: Sun, 18 Jan 2026 18:55:43 +0800 Subject: [PATCH 13/17] Update lint job to setup-java v4 --- .github/workflows/ubuntu-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ubuntu-build.yml b/.github/workflows/ubuntu-build.yml index 548f2857..119e1a21 100644 --- a/.github/workflows/ubuntu-build.yml +++ b/.github/workflows/ubuntu-build.yml @@ -237,7 +237,7 @@ jobs: uses: actions/checkout@v4 - name: Setup JDK 17 - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: '17' distribution: 'temurin' From 749b3fd03cec0fcf52c3e9a5f2d3bb2480f68719 Mon Sep 17 00:00:00 2001 From: "wangyang (wysaid)" Date: Sun, 18 Jan 2026 19:00:00 +0800 Subject: [PATCH 14/17] Install NDK via sdkmanager on macOS --- .github/workflows/macos-build.yml | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/.github/workflows/macos-build.yml b/.github/workflows/macos-build.yml index 8b6f8b57..61a8049c 100644 --- a/.github/workflows/macos-build.yml +++ b/.github/workflows/macos-build.yml @@ -23,13 +23,23 @@ jobs: - name: Checkout code uses: actions/checkout@v4 - - name: Setup NDK - uses: nttld/setup-ndk@v1.4.2 - id: setup-ndk - with: - ndk-version: ${{ matrix.ndk }} - link-to-sdk: true - add-to-path: true + - name: Setup Android SDK + uses: android-actions/setup-android@v3 + + - name: Install NDK + shell: bash + run: | + case "${{ matrix.ndk }}" in + r26d) NDK_VERSION="26.2.11394342" ;; + r27c) NDK_VERSION="27.2.12479018" ;; + *) + echo "Error: Unsupported NDK version ${{ matrix.ndk }}" + exit 1 + ;; + esac + yes | sdkmanager "ndk;${NDK_VERSION}" + echo "ANDROID_NDK_HOME=$ANDROID_SDK_ROOT/ndk/${NDK_VERSION}" >> "$GITHUB_ENV" + echo "$ANDROID_SDK_ROOT/ndk/${NDK_VERSION}" >> "$GITHUB_PATH" - name: Install build tools run: brew install ninja From d1e029ec0931ec649065cc65efb756bc2337c85b Mon Sep 17 00:00:00 2001 From: "wangyang (wysaid)" Date: Sun, 18 Jan 2026 19:03:48 +0800 Subject: [PATCH 15/17] Normalize NDK flavor parsing on macOS --- .github/workflows/macos-build.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/.github/workflows/macos-build.yml b/.github/workflows/macos-build.yml index 61a8049c..1240738c 100644 --- a/.github/workflows/macos-build.yml +++ b/.github/workflows/macos-build.yml @@ -29,11 +29,13 @@ jobs: - name: Install NDK shell: bash run: | - case "${{ matrix.ndk }}" in - r26d) NDK_VERSION="26.2.11394342" ;; - r27c) NDK_VERSION="27.2.12479018" ;; + NDK_FLAVOR="${{ matrix.ndk }}" + NDK_FLAVOR=$(printf "%s" "$NDK_FLAVOR" | tr -d '\r\n') + case "$NDK_FLAVOR" in + r26d*) NDK_VERSION="26.2.11394342" ;; + r27c*) NDK_VERSION="27.2.12479018" ;; *) - echo "Error: Unsupported NDK version ${{ matrix.ndk }}" + echo "Error: Unsupported NDK version $NDK_FLAVOR" exit 1 ;; esac From 44f6a7bbe06da90c1dacd3e9b0f1448416acf3be Mon Sep 17 00:00:00 2001 From: "wangyang (wysaid)" Date: Sun, 18 Jan 2026 19:07:25 +0800 Subject: [PATCH 16/17] Handle sdkmanager pipefail on macOS --- .github/workflows/macos-build.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/macos-build.yml b/.github/workflows/macos-build.yml index 1240738c..1d1070ea 100644 --- a/.github/workflows/macos-build.yml +++ b/.github/workflows/macos-build.yml @@ -39,7 +39,14 @@ jobs: exit 1 ;; esac + set +o pipefail yes | sdkmanager "ndk;${NDK_VERSION}" + SDKMANAGER_STATUS=${PIPESTATUS[1]} + set -o pipefail + if [ "$SDKMANAGER_STATUS" -ne 0 ]; then + echo "Error: sdkmanager failed with status $SDKMANAGER_STATUS" + exit "$SDKMANAGER_STATUS" + fi echo "ANDROID_NDK_HOME=$ANDROID_SDK_ROOT/ndk/${NDK_VERSION}" >> "$GITHUB_ENV" echo "$ANDROID_SDK_ROOT/ndk/${NDK_VERSION}" >> "$GITHUB_PATH" From c790e5b9bca3b1e56a957b61040bbc667e6c0096 Mon Sep 17 00:00:00 2001 From: "wangyang (wysaid)" Date: Sun, 18 Jan 2026 20:42:41 +0800 Subject: [PATCH 17/17] Run full workflows on workflow branches and add test release mode --- .github/workflows/README.md | 8 ++++++++ .github/workflows/macos-build.yml | 4 +++- .github/workflows/release.yml | 14 +++++++++++++- .github/workflows/ubuntu-build.yml | 4 +++- .github/workflows/windows-build.yml | 4 +++- 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/.github/workflows/README.md b/.github/workflows/README.md index 6e028988..556192d5 100644 --- a/.github/workflows/README.md +++ b/.github/workflows/README.md @@ -91,6 +91,10 @@ on: 非 master 分支的推送**不会触发** workflow,避免资源浪费。只有创建 PR 时才会触发精简构建。 +### 4. workflow 分支(全量构建) + +当分支名包含 `workflow` 时,会触发**全量构建**(等同于 master 全量矩阵),用于验证完整矩阵是否可通过。 + ## 产物命名规则 构建产物 (APK) 使用以下命名格式: @@ -108,6 +112,10 @@ apk-{OS}-{NDK}-{BuildSystem}-{FFmpeg}-{PageSize}.apk 代码质量检查在 PR 和 master 分支推送时运行,确保主干代码质量。 +## Release 工作流(测试分支) + +当分支名包含 `workflow` 且触发 `release.yml` 时,将从 `build.gradle` 读取 `versionName`,生成 `v{版本号}-test` 的测试标签,**仅构建并上传 APK 工件**,不会创建 Release 或发布任何内容。 + ## 本地测试 可以使用项目根目录的 `tasks.sh` 脚本在本地进行构建测试: diff --git a/.github/workflows/macos-build.yml b/.github/workflows/macos-build.yml index 1d1070ea..a863a386 100644 --- a/.github/workflows/macos-build.yml +++ b/.github/workflows/macos-build.yml @@ -2,7 +2,9 @@ name: macOS Build on: push: - branches: [ "master" ] + branches: + - "master" + - "*workflow*" pull_request: branches: [ "master" ] diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index c9390050..d1475c10 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,6 +2,8 @@ name: Release APKs on: push: + branches: + - "*workflow*" tags: - 'v*.*.*' - 'v*.*.*-beta*' @@ -52,8 +54,18 @@ jobs: run: | if [ "${{ github.event_name }}" = "workflow_dispatch" ]; then echo "RELEASE_TAG=${{ inputs.version }}" >> $GITHUB_ENV + echo "SHOULD_RELEASE=${{ inputs.create_release }}" >> $GITHUB_ENV + elif [ "${{ github.ref_type }}" = "branch" ]; then + VERSION=$(grep -E 'versionName' build.gradle | head -n 1 | sed -E 's/.*versionName[^\"]*\"([^\"]+)\".*/\1/') + if [ -z "$VERSION" ]; then + echo "Error: Failed to parse versionName from build.gradle" + exit 1 + fi + echo "RELEASE_TAG=v${VERSION}-test" >> $GITHUB_ENV + echo "SHOULD_RELEASE=false" >> $GITHUB_ENV else echo "RELEASE_TAG=${{ github.ref_name }}" >> $GITHUB_ENV + echo "SHOULD_RELEASE=true" >> $GITHUB_ENV fi echo "APK_NAME=cgeDemo-${{ matrix.artifact_name }}.apk" >> $GITHUB_ENV @@ -101,7 +113,7 @@ jobs: if-no-files-found: error - name: Upload to GitHub Release - if: github.event_name == 'push' || inputs.create_release + if: env.SHOULD_RELEASE == 'true' uses: softprops/action-gh-release@v2 with: tag_name: ${{ env.RELEASE_TAG }} diff --git a/.github/workflows/ubuntu-build.yml b/.github/workflows/ubuntu-build.yml index 119e1a21..16ec1fc2 100644 --- a/.github/workflows/ubuntu-build.yml +++ b/.github/workflows/ubuntu-build.yml @@ -2,7 +2,9 @@ name: Ubuntu Build on: push: - branches: [ "master" ] + branches: + - "master" + - "*workflow*" pull_request: branches: [ "master" ] diff --git a/.github/workflows/windows-build.yml b/.github/workflows/windows-build.yml index 7984fdf9..9974da29 100644 --- a/.github/workflows/windows-build.yml +++ b/.github/workflows/windows-build.yml @@ -2,7 +2,9 @@ name: Windows Build on: push: - branches: [ "master" ] + branches: + - "master" + - "*workflow*" pull_request: branches: [ "master" ]