菜单

CI/CD 流水线

相关源文件

本文档描述了 Magisk 项目的自动化持续集成和持续部署(CI/CD)流水线。它涵盖了 GitHub Actions 工作流、构建过程、测试基础设施和伪影管理,以确保代码质量并促进可靠的发布。

有关如何手动从源代码构建 Magisk 的信息,请参阅 从源代码构建。有关通用构建系统架构的详细信息,请参阅 构建系统

流水线概览

Magisk CI/CD 流水线使用 GitHub Actions 来自动执行跨多个平台和 Android API 级别的构建和测试。流水线由推送到 master 分支、拉取请求到 master 或手动分派触发。

来源:.github/workflows/build.yml1-127

工作流配置

CI/CD 流水线定义在 .github/workflows/build.yml 文件中。当影响构建的关键路径发生更改时,该文件会被触发。

触发路径

当更改推送到 master 分支中的文件时,工作流会自动运行

  • app/** - Android 应用程序代码
  • native/** - 本地 C++ 和 Rust 组件
  • buildSrc/** - 构建系统实用程序
  • build.py - 主构建脚本
  • gradle.properties - 构建配置
  • gradle/libs.versions.toml - 依赖版本
  • .github/workflows/build.yml - 工作流本身

作业结构

工作流包含三种主要类型的作业

  1. 构建作业 - 编译代码并生成伪影
  2. 测试构建作业 - 验证跨多个平台的构建兼容性
  3. 测试作业 - 在 Android 虚拟设备和 Cuttlefish 上运行集成测试

来源:.github/workflows/build.yml3-16

构建环境设置

在构建之前,工作流使用自定义 GitHub Action 来设置必要的环境。

环境设置处理

  • JDK 21 安装
  • Python 3 安装
  • GNU make 安装 (macOS)
  • 使用 sccache 配置编译器缓存
  • Gradle 依赖缓存
  • Android NDK 设置

此设置发生在 .github/actions/setup/action.yml 文件中,该文件在所有作业中重复使用。

来源:.github/actions/setup/action.yml1-107 .github/actions/setup/sccache.sh1-26

构建流程

主构建作业使用 build.py 脚本执行多个构建任务。

构建作业步骤

  1. 代码检出 - 检出包含子模块的仓库
  2. 环境设置 - 配置构建环境
  3. 发布构建 - 使用 -vr all 标志构建发布版本
  4. 调试构建 - 使用 -v all 标志构建调试版本
  5. 上传伪影 - 上传构建输出和符号

构建工件

构建过程产生两组伪影

  1. 主伪影位于 out 目录中

    • app-debug.apk - 调试 APK
    • app-release.apk - 发布 APK
    • test.apk - 测试应用程序
    • 各种本地二进制文件
  2. 调试符号和映射文件

    • 发布构建的 ProGuard 映射文件
    • C++/Rust 组件的本地调试符号

来源:.github/workflows/build.yml19-56

跨平台构建测试

为确保 Magisk 在不同的操作系统上正确构建,工作流包含一个在 Windows 和 Ubuntu 上运行的测试构建作业。

此作业验证代码是否能在不同平台上无错误地构建,但不生成伪影。它使用 .github/ci.prop 中指定的最小配置,将构建限制为仅 arm64-v8a ABI 以加快执行速度。

来源:.github/workflows/build.yml58-78 .github/ci.prop1-2

自动化测试基础设施

Magisk 使用两种模拟器类型进行自动化测试

  1. Android 虚拟设备 (AVD) - 标准 Android 模拟器
  2. Cuttlefish - Google 的 Android 模拟器,用于 AOSP 测试

AVD 测试

AVD 测试在从 23 到 36(Android 6.0 到 16.0)的各种 Android API 级别上验证 Magisk 功能。它为 64 位和 32 位架构运行单独的测试矩阵。

AVD 测试过程

  1. 从上一个作业下载构建伪影
  2. 创建具有目标 API 级别的 AVD
  3. 使用 Magisk 修补 ramdisk
  4. 启动模拟器并安装 Magisk
  5. 运行测试套件以验证功能
  6. 重启以验证持久性

对于 API 级别 23-35,它测试标准的 x86_64 架构。对于 API 级别 23-30,它还测试 32 位 x86 架构。对于 API 36,它测试标准和 16k 页面的变体。

来源:.github/workflows/build.yml80-167 scripts/avd_test.sh1-203 scripts/test_common.sh1-80

Cuttlefish 测试

Cuttlefish 测试提供比标准 AVD 更接近 AOSP 的环境。

Cuttlefish 测试过程

  1. 设置 Cuttlefish 环境
  2. 下载 AOSP 系统镜像
  3. 使用 Magisk 修补启动镜像
  4. 启动 Cuttlefish 模拟器
  5. 安装 Magisk 和测试应用
  6. 运行测试套件
  7. 验证重启后的持久性

Cuttlefish 测试目前使用最新的 AOSP 发布分支 (aosp-android-latest-release) 和 aosp_cf_x86_64_only_phone 设备配置。

来源:.github/workflows/build.yml169-210 scripts/cuttlefish.sh1-121

测试套件

测试套件通过仪器化测试来验证 Magisk 功能的各个方面。

测试类别描述测试类
应用功能核心 Magisk 应用功能MagiskAppTest
应用隐藏测试 Magisk 应用的隐藏/恢复AppMigrationTest
附加测试附加功能测试AdditionalTest

测试执行顺序

  1. 运行应用功能测试
  2. 测试应用隐藏功能
  3. 验证应用在隐藏后是否仍然正常工作
  4. 测试应用恢复
  5. 验证应用恢复后是否正常工作

所有测试均通过 Android 仪器框架使用 am instrument 命令执行。

来源:scripts/test_common.sh30-79

持续部署

虽然未在工作流文件中明确定义,但 Magisk 项目通过以下机制将 CI 流水线用于持续部署

  1. 金丝雀构建 - 来自 master 分支的自动构建,可作为“金丝雀”发布
  2. 发布构建 - 标记的发布,它们经过相同的构建流水线,但由手动触发

版本信息配置在 gradle.properties

  • magisk.versionCode - 数字版本代码(例如,28103)
  • magisk.stubVersion - 用于更新的存根 APK 版本(例如,40)

此信息在构建过程中作为注释编码在 APK 中,这使得应用能够确定是否有可用更新。

来源:gradle.properties31-34 buildSrc/src/main/java/Setup.kt348-355

缓存策略

CI/CD 流水线采用高效的缓存来加速构建

使用三种类型的缓存

  1. sccache - 缓存 C++ 和 Rust 编译器输出
  2. Gradle 依赖缓存 - 缓存下载的依赖项
  3. Gradle 构建缓存 - 缓存中间构建输出

这些缓存使用 GitHub Actions 缓存功能进行存储和恢复,具有不同的缓存键,具体取决于缓存的内容。

来源:.github/actions/setup/action.yml27-103 .github/workflows/build.yml44-56

与项目架构集成

CI/CD 流水线与整体 Magisk 构建系统集成,如 构建系统中所述。它利用模块化构建结构来生成 Magisk 的各种组件。

构建过程会编译:

  1. 本地组件 - 使用 Android NDK
  2. 存根 APK - 用于应用更新
  3. 主 APK - Magisk 管理器应用程序
  4. 测试 APK - 用于自动化测试

这些组件随后由测试作业用于验证功能。

来源: build.gradle.kts1-8 native/build.gradle.kts1-33 app/build.gradle.kts1-6

结论

Magisk 的 CI/CD 流水线提供了一个全面的系统,用于构建、测试和部署 Magisk 应用程序及其组件。它确保了在发布给用户之前,可以跨多个 Android API 级别和设备配置对更改进行彻底测试。

该流水线利用 GitHub Actions、高效的缓存和自动化测试来维护代码质量并促进快速开发。通过在 AVD 和 Cuttlefish 模拟器上进行测试,它提供了对不同 Android 环境的良好覆盖。