Jenkins 是一个开源 CI/CD 服务器,可自动构建、测试和交付移动应用程序。与云解决方案不同,Jenkins 部署在自有基础设施上,通过 Web 界面或代码进行配置。根据 CloudBees(2025年)的数据,超过 160万 个团队使用 Jenkins 进行 CI/CD 流程。该系统通过 Master-Agent 架构支持分布式构建,并拥有 1800 多个用于集成开发工具的插件。
要点
Jenkins 是一个用 Java 编写的开源 CI/CD 服务器,用于自动化软件的构建、测试和交付。在移动开发的背景下,Jenkins 使团队能够自动构建 iOS 和 Android 应用程序,运行单元测试和 UI 测试,签名构建并将其交付到 App Store 或 Google Play,无需手动操作。
对 Jenkins 的需求出现在项目超越本地构建并需要来自多个开发者的定期代码集成时。手动构建每次提交耗时且容易出错 —— Jenkins 通过在仓库每次更改时启动自动流水线来解决这个问题。
根据 JetBrains Developer Ecosystem 2025 报告,54% 的移动团队使用 Jenkins 作为主要 CI/CD 平台。得益于插件架构,该系统支持任何语言和平台 —— 对于 Android,可以使用 Gradle 和 SDK Manager;对于 iOS,可以使用 Xcode Integration 和 Keychain Manager。
在需要对构建基础设施进行完全控制、定制 CI/CD 流程每一步并与企业安全系统集成的项目中使用 Jenkins。
Jenkins 架构基于 Master-Agent 模型构建。Master 服务器管理配置、任务调度和 Web 界面,而代理在专用或临时机器上执行实际的构建。这种架构允许从同一个 Master 服务器同时构建 macOS 代理上的 iOS 应用程序和 Linux 代理上的 Android 应用程序。
Jenkins 的 Master 节点将所有设置、插件和构建历史存储在$JENKINS_HOME主目录中。代理通过 SSH、JNLP 或 WebSocket 连接到 Master,并从队列中接收任务。对于移动开发,建议分配独立的 macOS 代理用于 iOS 构建和 Linux 代理用于 Android 构建,并安装相应 SDK 和工具。
每个代理可以是永久服务器或动态 Docker 容器。根据 CloudBees 文档,将构建分布到 5 个代理上可在 10 个并行任务时将 CI/CD 流水线总时间减少 70%。
Jenkins Pipeline 是整个 CI/CD 流程以代码形式存储在仓库中的定义。流水线在 Jenkinsfile 中描述,并支持两种语法:Declarative(结构化,带有预定义块)和 Scripted(灵活,基于 Groovy,完全控制执行流程)。
声明式语法推荐用于大多数移动项目,因为它提供了可读性和可预测性。Scripted Pipeline 适用于具有动态并行阶段、自定义错误处理和基于环境变量的条件逻辑的复杂场景。
Jenkins Pipeline 支持两种语法,它们决定了描述 CI/CD 流程步骤的方式。声明式语法使用带有 pipeline、stages、stage 和 steps 关键字的块结构,使其对新用户直观。脚本式语法基于 Groovy,通过条件语句和循环提供对执行的完全控制。
声明式流水线自动创建 Sandbox —— 一个用于执行 Groovy 脚本的安全环境。这限制了对 Java 和 Groovy 的危险方法的访问,这对于流水线安全性由管理员控制的企业环境至关重要。
声明式流水线建立在四个关键块上:pipeline(根块)、agent(指定代理)、stages(阶段序列)和 post(完成后的操作)。每个 stage 包含带有构建命令的 steps,post 块定义成功、失败或不稳定构建状态时的操作。
Post 块对移动项目特别有用 —— 可以配置在构建失败时向 Slack 发送通知,或在成功完成后归档 IPA 和 APK 工件。Jenkins 保证执行 post 操作,即使流水线被手动中断。
// iOS 应用程序的声明式 Pipeline
pipeline {
agent { label 'macos' }
stages {
stage('Build') {
steps {
sh 'xcodebuild -workspace App.xcworkspace -scheme App clean build'
}
}
stage('Test') {
steps {
sh 'xcodebuild -workspace App.xcworkspace -scheme App test'
}
}
}
}
脚本式流水线提供 node 块来代替 agent,并允许使用 Groovy 结构进行动态分支。这种语法适用于阶段集取决于构建参数或上一步结果的流水线。
// 具有并行阶段的脚本式 Pipeline
node('macos') {
stage('Parallel Builds') {
parallel(
ios: { buildIOS() },
android: { buildAndroid() }
)
}
}
def buildIOS() {
sh 'fastlane ios build'
}
对于 iOS 项目,Jenkinsfile 需要安装了 Xcode、CocoaPods 或 Swift Package Manager 和 Fastlane 的 macOS 代理。典型的流水线包括以下阶段:安装依赖、构建、运行测试、代码签名和交付到 TestFlight 或 App Store。
Jenkins 中 iOS 构建的关键特性是证书和 provisioning profile的管理。建议使用 Fastlane Match 从仓库自动获取证书,或使用 Jenkins Credentials Binding 插件安全存储密钥。
pipeline {
agent { label 'macos' }
environment {
MATCH_PASSWORD = credentials('match-password')
}
stages {
stage('Install Dependencies') {
steps {
sh 'pod install --repo-update'
}
}
stage('Build and Test') {
steps {
sh 'fastlane scan'
sh 'fastlane gym'
}
}
stage('Deploy to TestFlight') {
when { branch 'main' }
steps {
sh 'fastlane upload_testflight'
}
}
}
}
对于 iOS 单元测试,使用指定模拟器的 xcodebuild test。Jenkins 支持通过 JUnit 插件发布 XCTest 报告 —— 将 .xcresult 转换为 XML 格式以将测试结果嵌入构建仪表板。
Jenkins 中的 Android 构建在安装了 Java JDK、Android SDK、Gradle 和模拟器的 Linux 代理上执行。流水线包括以下阶段:linter 检查、单元测试、APK 或 AAB 构建、模拟器上的仪表测试和在 Google Play Console 中发布。
要管理 Android SDK,请在 Jenkinsfile 中使用 sdkmanager 安装所需平台和构建工具。建议在构建之间缓存 .gradle 和 .android 目录以加速后续运行。
pipeline {
agent { label 'linux' }
stages {
stage('Lint Check') {
steps {
sh './gradlew lint'
}
}
stage('Unit Tests') {
steps {
sh './gradlew testDebugUnitTest'
}
}
stage('Build APK') {
steps {
sh './gradlew assembleDebug'
}
post {
success {
archiveArtifacts artifacts: '**/build/outputs/apk/**/*.apk'
}
}
}
}
}
Android 上的仪表测试需要正在运行的模拟器。Jenkins 支持 Android Emulator 插件,该插件在测试前自动创建并启动模拟器。对于物理设备,使用 Firebase Test Lab —— 集成可通过 Google Cloud SDK 插件获得。
Jenkins 插件系统是该平台的主要优势。1800 多个插件涵盖 CI/CD 的所有阶段:从与版本控制系统的集成到部署到云服务。每个插件都向流水线添加新步骤,并扩展 Web 界面增加额外的配置页面。
对于移动开发,凭据管理插件集是必需的:Credentials Binding 用于存储 App Store Connect 令牌和 Google Play 服务账户。Xcode Integration 插件从 Jenkins UI 添加 iOS 应用程序的构建步骤。
| 插件 | 用途 | 平台 |
|---|---|---|
| Git Integration | 克隆仓库、分支操作和 Pull Request | iOS, Android |
| Gradle Plugin | 运行 Android 构建的 Gradle 任务并发布报告 | Android |
| Xcode Integration | 无需 Jenkinsfile 构建 iOS 项目 | iOS |
| Docker Pipeline | 在隔离环境的 Docker 容器中运行构建 | iOS, Android |
| Slack Notification | 在 Slack 频道发送构建状态通知 | iOS, Android |
Docker Pipeline 插件允许在单独的容器中运行每个构建阶段,从而保证环境的可重现性并消除环境差异问题。对于 Android 构建,使用 Gradle 社区预装 Android SDK 的镜像。
Jenkins 和 Travis CI 之间的选择取决于团队规模、预算和基础设施要求。Jenkins 是一种完全控制的自我托管解决方案,需要专用服务器和管理员。Travis CI 是按使用付费的云服务,无需服务器管理。
对于初创公司和小团队,Travis CI 更可取 —— 零基础设施成本,与 GitHub 的简单集成,以及适用于 iOS 和 Android 的现成构建。对于企业项目,Jenkins 提供优势:自己的 macOS 运行器,符合企业安全策略,通过 Jenkinsfile 进行精细的流水线配置。
根据 Stack Overflow Survey 2025 的数据,Jenkins 被 42% 的专业开发者使用,而 Travis CI 为 12%。然而,Travis CI 在开源社区中仍然很受欢迎,因为它为公共仓库提供免费计划和最低的入门门槛。
Jenkins 提供了一系列优势,使其成为移动开发 CI/CD 的标准。免费的 MIT 许可证允许在商业项目中不受限制地使用服务器,开源代码保证供应商独立性和安全审计的可能性。
Master-Agent 架构提供水平可扩展性 —— 添加新代理会线性增加流水线的吞吐量。Jenkins 通过 Jenkins X 支持 Kubernetes 中的动态代理,从而根据需要自动创建和销毁构建器。
插件生态系统涵盖所有现代工具:Docker、Kubernetes、Fastlane、SonarQube、GitLab、Bitbucket。如果没有现成的插件,您可以自己编写 Java 扩展,或使用 Pipeline Shared Libraries 在项目之间复用代码。
常见问题
Jenkins 是一个开源 CI/CD 服务器,用于自动构建、测试和交付 iOS 和 Android 应用程序。它在 Java 上运行,通过 Master-Agent 架构支持分布式构建,并通过 Web 界面或项目仓库中的 Jenkinsfile 进行配置。
Jenkins 以其自我管理的基础设施和插件系统而著称。与 Travis CI 或 GitHub Actions 不同,Jenkins 需要安装在自有服务器上,但为企业项目提供对构建环境、安全性和访问策略的完全控制。
Jenkins Pipeline 是以 Groovy 代码形式定义 CI/CD 过程并存储在 Jenkinsfile 中。流水线由阶段(stages)和步骤(steps)组成,描述构建、测试和部署。支持两种语法:Declarative 用于简单场景,Scripted 用于复杂场景。
对于 iOS,必须使用 Xcode Integration 和 Keychain Manager。对于 Android —— Gradle Plugin 和 Android Emulator。对于两个平台:Git Integration、Credentials Binding、Docker Pipeline 和用于构建状态通知的 Slack Notification。
在服务器上安装 Jenkins,添加用于 iOS 的 macOS 代理和用于 Android 的安装了 SDK 的 Linux 代理。在仓库根目录中创建描述构建阶段的 Jenkinsfile。对于 iOS,使用 Fastlane 进行代码签名;对于 Android,使用带依赖缓存的 Gradle 任务。
总结
我们将开发一款交钥匙移动应用程序
IT Sectr自2017年以来为初创企业和企业打造iOS和Android应用程序。我们将为您提供咨询并提出最佳解决方案。