返回博客

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

Bruno Verachten
Bruno Verachten
2025 年 10 月 31 日

Jenkins on Android automation

从手动到自动化

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角色

自动化被组织成专注、可重用的角色:

  1. termux-base:核心Termux设置(SSH、Python、包管理)

  2. termux-complete-setup:全面的软件包安装(59+个包,包括构建工具、语言、开发工具)

  3. jenkins-controller:Jenkins安装和初始化

  4. jenkins-agent:SSH代理配置和工作区设置

  5. jenkins-jcasc:代码即配置部署

  6. jenkins-backup:任务和配置备份实用程序

  7. termux-boot-setup:可选的设备启动时自动启动

  8. 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的服务管理系统,即runitsv

# 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-repopointless仓库)

  • 未记录的包依赖项

  • 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指标导出。

基础已打牢。模式已验证。基础设施即代码。

亲手尝试

完整的自动化方案、文档和故障排除指南可在以下地址获取:

要求

  • 已安装Termux的Android设备

  • 安装了Ansible 2.10+的笔记本电脑/PC

  • 15分钟

无论您是想改造电子垃圾、构建家庭实验室,还是学习Jenkins管理,此自动化方案都提供了一个从裸Android设备到功能性Jenkins基础设施的可重复路径。

从手动实验到自动化解决方案——这就是基础设施即代码的旅程。


相关文章

关于作者

Bruno Verachten

Bruno Verachten

Bruno 是一位两个孩子的父亲、一个妻子的丈夫、一个否认的极客、养蜂人、永续农业爱好者和 Jenkins 项目的开发者关系。自 2013 年以来,他一直在使用各种产品/工具/平台(Gitlab CI、Circle CI、Travis CI、Shippable、Github Actions 等)进行持续集成和持续部署,主要用于移动和嵌入式开发。
他对嵌入式平台、ARM 和 RISC-V 生态系统以及边缘计算充满热情。他的主要目标是将 FOSS 项目和平台添加到 ARM 和 RISC-V 架构中,使它们变得和 X86_64 一样无聊
他还是 miniJen 的创建者,这是人类已知的最小的多 CPU 架构 Jenkins 实例。 a

© . This site is unofficial and not affiliated with The Linux Foundation.