使用基础设施即代码在 Android 上自动化 Jenkins

从手动到自动化
在 2023年3月,我探索了如何在Android设备上使用Termux运行Jenkins,证明了将老旧智能手机变成CI/CD基础设施在技术上是可行的。手动设置有效,但需要2-3小时的配置,且容易出错。
快进到2025年:我已使用基础设施即代码(Infrastructure as Code)原则实现了整个流程的自动化。曾经需要数小时手动配置的工作,现在只需一个命令,15分钟内即可完成。本文将介绍自动化解决方案以及在构建过程中吸取的经验教训。
为什么要在Android上自动化Jenkins?
动机很简单:
-
可重复性:手动设置在多台设备上很难复制。自动化确保了一致性。
-
减少电子垃圾:数百万部功能正常的Android设备被闲置。为何不将它们改造成构建代理?
-
学习机会:构建此自动化项目让我学到了关于服务管理、SSH配置和测试方法的宝贵经验。
-
经济高效的CI/CD:对于小型项目、业余爱好者或教育环境,改造后的手机提供了免费的计算资源。
我的目标不仅仅是自动化我的设置——而是创建一个任何人都可以使用的可重复解决方案。
基础设施即代码解决方案
完整的自动化方案可在 github.com/gounthar/termux-jenkins-automation 获取。该解决方案使用了:
-
Ansible:跨8个可重用角色的基础设施自动化
-
Jenkins Configuration as Code (JCasC):声明式Jenkins配置
-
Termux:无需root权限即可在Android上运行的Linux环境
架构概览
该自动化部署了一套完整的Jenkins基础设施在一个Android设备上。
┌───────────────────────────────────────┐
│ Android Phone (Termux) │
│ ┌──────────────────────────────────┐ │
│ │ Jenkins Controller (Minimal) │ │
│ │ - Port 8080 (Web UI) │ │
│ │ - JCasC configured │ │
│ └──────────┬───────────────────────┘ │
│ │ SSH (localhost:8022) │
│ ┌──────────▼───────────────────────┐ │
│ │ Jenkins Agent (SSH) │ │
│ │ - Build tools installed │ │
│ │ - 2 executors │ │
│ └──────────────────────────────────┘ │
└───────────────────────────────────────┘
控制器负责任务编排,并将构建委托给(同一设备上的)代理。这种架构模仿了生产环境的设置,并传授了Jenkins的最佳实践。
八个Ansible角色
自动化被组织成专注、可重用的角色:
-
termux-base:核心Termux设置(SSH、Python、包管理)
-
termux-complete-setup:全面的软件包安装(59+个包,包括构建工具、语言、开发工具)
-
jenkins-controller:Jenkins安装和初始化
-
jenkins-agent:SSH代理配置和工作区设置
-
jenkins-jcasc:代码即配置部署
-
jenkins-backup:任务和配置备份实用程序
-
termux-boot-setup:可选的设备启动时自动启动
-
termux-buildtools:遗留的构建工具(已被termux-complete-setup取代)
每个角色都是幂等的,可以独立运行,也可以作为完整设置剧本的一部分运行。
快速入门
主编排剧本将所有内容整合在一起:
# On the Android device (in Termux)
pkg install openssh python
sshd
passwd
whoami
ifconfig wlan0
# On your laptop/PC
git clone https://github.com/gounthar/termux-jenkins-automation.git
cd termux-jenkins-automation
./scripts/run-setup.sh
# Answer prompts:
# - IP address (from ifconfig)
# - SSH port (8022 default)
# - Username (from whoami)
# - Jenkins admin password
# - Authentication method (SSH key recommended)
# Wait ~15 minutes
# Access Jenkins:
# http://<phone-ip>:8080
该脚本处理先决条件检查、库存配置和剧本执行。无需手动Ansible配置。
关键技术洞察
构建此自动化过程揭示了几个重要的经验:
服务管理:使用runit代替后台进程
最初,我将Jenkins作为后台进程运行(java -jar jenkins.war &)。这种方法存在问题:
-
终端关闭时进程终止
-
故障时无自动重启
-
无日志管理
-
难以监控
解决方案:使用Termux的服务管理系统,即runit和sv。
# Jenkins runs as a managed service
sv status jenkins
# Output: run: jenkins: (pid 31647) 95s; run: log: (pid 26734) 4516s
# Service management commands
sv up jenkins # Start
sv down jenkins # Stop
sv restart jenkins # Restart
日志由svlogd处理,并支持自动轮转。
# View live logs
tail -f ~/.jenkins/logs/current
# All logs automatically rotated and compressed
ls -lh ~/.jenkins/logs/
这模仿了生产环境的服务管理,并解决了“我的Jenkins一夜之间崩溃了”的问题。
全新安装测试
最大的错误:只在我的开发手机上测试。自动化在配置了数周的手动设备上完美运行。
当我在全新的Termux安装上测试时,立即失败了。我在数月前手动安装的缺失依赖项并未包含在剧本中。
修复方法:在多台设备上进行系统化的全新安装测试。这发现了:
-
缺失的仓库配置(
gcc-8需要root-repo和pointless仓库) -
未记录的包依赖项
-
SSH密钥权限问题
-
服务启动的竞态条件
全新安装测试成为开发工作流程的一部分。每次更改都会在擦除的设备上进行验证。
当前成功率:在全新的Termux安装上为98%(2%的失败通常是由于包安装期间的网络超时)。
Jenkins代码即配置
通过UI进行手动Jenkins配置是不可重复的。解决方案:JCasC(Jenkins Configuration as Code)。
完整的Jenkins配置以YAML格式呈现。
jenkins:
systemMessage: "Jenkins on Android (Termux) - Automated Setup"
numExecutors: 0 # Controller doesn't run builds
securityRealm:
local:
users:
- id: "admin"
password: "${JENKINS_ADMIN_PASSWORD:-admin}"
credentials:
system:
domainCredentials:
- domain:
name: "SSH Agent Credentials"
credentials:
- basicSSHUserPrivateKey:
id: "termux-agent-key"
privateKeySource:
directEntry:
privateKey: "${readFile:/data/data/com.termux/files/home/.jenkins/ssh/id_ed25519}"
nodes:
- permanent:
name: "termux-agent-1"
remoteFS: "/data/data/com.termux/files/home/jenkins-agent"
launcher:
ssh:
host: "localhost"
port: 8022
credentialsId: "termux-agent-key"
自动化部署此配置,Jenkins在启动时应用它。无需通过UI设置进行点击操作。
生产Jenkins的经验教训
虽然这个项目针对Android设备,但其模式适用于任何Jenkins部署:
-
基础设施即代码:所有配置都纳入版本控制。
-
服务管理:正确的进程监控(systemd、runit等)。
-
代码即配置:使用JCasC实现可重复的Jenkins配置。
-
全新安装测试:切勿假设依赖项已存在。
-
模块化角色:将自动化分解为专注、可重用的组件。
termux-jenkins-automation存储库在受限环境(无root、移动平台、资源有限)中演示了这些原则。如果它在Android上有效,这些模式肯定会在传统服务器上奏效。
下一步是什么?
该自动化方案对于单设备设置已达到生产级别。未来的增强功能可能包括:
-
多设备集群:将多个Android手机协调成Jenkins集群。
-
插件自动化:自动化插件安装和更新。
-
备份/恢复工作流:计划到云存储的备份。
-
性能优化:针对资源受限设备的内存调优。
-
监控集成:Prometheus指标导出。
基础已打牢。模式已验证。基础设施即代码。
