Jenkins 是一个开源的自动化工具,我们在软件项目中用它来实现持续集成和持续交付 (CI/CD)。它基于 Java 构建,能够帮助我们自动化构建、测试和部署应用程序等任务。
作为自动化服务器领域的“老兵”,Jenkins 在 2026 年依然扮演着关键角色。虽然现在出现了许多基于 SaaS 的新型 CI 工具,但 Jenkins 凭借其强大的插件生态和极高的可控性,依然是我们构建企业级私有化流水线的首选。
- 使用 Java 编写,并在 Java 虚拟机 (JVM) 上运行。
- 可以通过系统包或直接运行 WAR 文件来安装。
- 能够自动化重复性的开发和部署任务,从而提高效率。
在 Ubuntu 上安装 Jenkins:分步指南
在开始安装之前,请确保满足以下要求:
- 一台 Ubuntu 服务器 (22.04 或 24.04 LTS)。
- 拥有 Root 或 sudo 权限。
- 1 GB 内存即可运行,但我们强烈建议使用 4 GB 内存以获得更流畅的现代插件体验,以及 2 个 CPU 核心(这是适应 2026 年资源需求的底线)。
- Jenkins LTS 官方支持 Java 17 和 Java 21。在我们的实践中,Java 21 的性能表现更为优异。
步骤 1:更新系统
在安装任何软件包之前,我们要确保系统是最新的。这不仅能避免依赖冲突,还能确保我们拥有最新的安全补丁。打开终端并运行以下命令:
sudo apt update
sudo apt upgrade -y
步骤 2:安装 Java
Jenkins 需要 Java 才能运行。Jenkins LTS 官方支持 Java 17 和 Java 21。我们要安装 OpenJDK 21 软件包:(如果已经安装了 Java,请跳过此步骤)。
sudo apt install openjdk-21-jdk -y
运行以下命令来验证 Java 是否安装成功:
java -version
输出:
你将看到类似 openjdk version "21.0.x" 的输出,这表示 Java 环境已就绪。
步骤 3:添加 Jenkins 软件源
为了确保我们获得的是官方最新的稳定版(LTS),而不是 Ubuntu 仓库中可能过时的版本,我们需要添加 Jenkins 官方的 GPG 密钥和软件源。这是我们在生产环境中必须遵守的最佳实践。
导入 Jenkins 密钥以验证软件源:
curl -fsSL https://pkg.origin.jenkins.io/debian-stable/jenkins.io-2026.key | sudo tee /usr/share/keyrings/jenkins-keyring.asc > /dev/null
将 Jenkins 软件源添加到系统的软件包列表中:
echo "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc] https://pkg.origin.jenkins.io/debian-stable/ binary/" | sudo tee /etc/apt/sources.list.d/jenkins.list > /dev/null
步骤 4:安装 Jenkins
既然我们已经添加了 Jenkins 的软件源,那就再次更新软件包列表以索引新加入的源:
sudo apt update
然后安装 Jenkins:
sudo apt install jenkins -y
步骤 5:启动并启用 Jenkins
安装完成后,让我们启动 Jenkins 服务并设置其为开机自启:
sudo systemctl start jenkins
sudo systemctl enable jenkins
步骤 6:调整防火墙设置
Jenkins 默认在端口 8080 上运行。如果你正在使用防火墙(例如 ufw),我们需要允许该端口的流量通过。
sudo ufw allow 8080
sudo ufw reload
步骤 7:解锁并初始化 Jenkins
- 访问
http://your_server_ip_or_domain:8080。 - 获取管理员密码:
sudo cat /var/lib/jenkins/secrets/initialAdminPassword。 - 选择“安装推荐的插件”。在 2026 年,这通常已经包含了 Git、Pipeline 和 Docker 相关的必备插件。
- 创建管理员用户。
—
深入 Jenkins:2026 年现代 CI/CD 的工程化实践
仅仅安装 Jenkins 只是第一步。在现代软件开发中,尤其是面对 AI 辅助编程(Vibe Coding)和云原生架构的普及,我们需要用更先进的方式来配置 Jenkins。接下来,我们将分享我们在实际项目中如何将 Jenkins 打造成现代化的交付引擎。
1. Jenkins Pipeline 即代码:从脚本到工程
你可能遇到过这样的情况:团队中的 Jenkins 配散落在 Web UI 的各个角落,一旦服务器崩溃,所有的构建逻辑都无法复现。这就是为什么我们要坚持使用 Pipeline as Code (PaC) 的原因。
我们将所有的构建逻辑写在 Jenkinsfile 中,并与源代码一起存储在 Git 仓库里。这不仅提高了可追溯性,还让我们能够利用现代 IDE(如 Cursor 或 VS Code)进行语法高亮和 AI 辅助编写。
让我们来看一个实际的例子:这是一个适用于 2026 年技术栈(Node.js + Docker)的声明式 Pipeline 示例。我们将在后续章节中详细解释其中的 AI 集成部分。
pipeline {
agent any
environment {
// 我们可以使用环境变量管理配置,避免硬编码
NODE_VERSION = ‘21‘
DOCKER_IMAGE = "my-app:${env.BUILD_NUMBER}"
}
stages {
stage(‘Preparation‘) {
steps {
// 清理工作空间,确保每次构建都是纯净的
cleanWs()
echo ‘Fetching changes from Git...‘
}
}
stage(‘AI-Assisted Code Analysis‘) {
steps {
echo "Running static analysis with LLM integration..."
// 在这里,我们可以调用脚本与 LLM API 交互,分析代码质量
// sh ‘npm run ai-lint‘
}
}
stage(‘Build‘) {
steps {
echo "Building application with Node ${NODE_VERSION}..."
sh ‘npm install‘
sh ‘npm run build‘
}
}
stage(‘Dockerize‘) {
steps {
script {
// 使用 Groovy 的动态特性,根据条件决定是否构建 Docker 镜像
if (env.BUILD_NUMBER.toInteger() % 2 == 0) {
echo "Building Docker image..."
sh "docker build -t ${DOCKER_IMAGE} ."
} else {
echo "Skipping Docker build for this iteration."
}
}
}
}
}
post {
always {
// 无论成功或失败,都清理 Docker 悬空镜像,防止磁盘空间耗尽
sh ‘docker image prune -f‘
}
success {
// 构建成功后,发送通知到 Slack 或 Teams
// emailext subject: "Build OK", body: "Job succeeded", to: "[email protected]"
echo ‘Job succeeded!‘
}
failure {
echo ‘Job failed!‘
}
}
}
代码解析:
-
environment块:我们定义了全局变量。这使得在不同环境(开发、测试、生产)之间切换配置变得非常简单。 -
agent any:告诉 Jenkins 这个 Pipeline 可以在任何可用的代理节点上运行。这在 Kubernetes 环境下特别有用,Jenkins 会动态弹起一个 Pod 来运行任务。 - INLINECODE15ba6fa2 块:我们在 INLINECODEb10b1427 阶段混合使用了声明式和脚本式语法。这展示了 Jenkins 的灵活性——当声明式语法无法满足复杂逻辑时,我们随时可以切入纯 Groovy 代码。
2. 容器化与 Kubernetes:云原生的必经之路
在 2026 年,几乎没有哪家科技公司还在“裸机”上部署应用。我们通常使用 Docker 容器化应用,并使用 Kubernetes (K8s) 进行编排。
Jenkins 的传统安装方式(如上文所述)非常适合作为主节点,但在处理构建任务时,我们建议使用 Kubernetes Plugin。这允许 Jenkins 为每一次构建动态创建一个 Pod(构建完成后自动销毁)。这不仅极大地提高了资源利用率,还彻底解决了“构建环境污染”的问题。
我们的实践经验:
在配置 config.xml 或 Kubernetes Pod Template 时,我们通常会定义一个包含多种工具的容器镜像。例如,一个镜像里同时包含 Node.js、Python 和 Docker CLI。这样,同一个 Jenkins Agent 就能处理不同技术栈的项目。
3. 融合 Agentic AI:智能 CI/CD 的未来
这是最令人兴奋的部分。现在市面上有很多 AI 编程工具,比如 Cursor、Windsurf 等。它们改变了我们写代码的方式——Vibe Coding(氛围编程)正在成为一种主流:我们用自然语言描述意图,AI 生成代码。
但是,如果代码审查和部署流程还是 2010 年的老样子,那效率依然提不上去。我们开始在 Jenkins Pipeline 中集成 Agentic AI(代理式 AI)。
场景:AI 自动化修复
想象一下,当单元测试失败时,传统的 CI 会直接报错并停止。而在我们的 AI 集成流水线中,流程是这样的:
- 测试失败:Jenkins 捕获到错误日志。
- 上下文收集:Jenkins 将错误的堆栈信息、相关的代码片段通过 API 发送给 LLM(如 GPT-4o 或 Claude 4.0)。
- 自动修复:AI 生成修复补丁。
- 回滚验证:Jenkins 应用补丁并重新运行测试。
这是一个简化的脚本示例,展示我们如何调用 AI API 进行分析:
stage(‘AI Auto-Fix‘) {
steps {
script {
// 捕获构建失败(如果有的话)
def buildLog = currentBuild.rawBuild.getLog(100).join("
")
// 使用 Jenkins HTTP Request 插件调用 AI 接口
// 注意:实际生产中请务必管理好 API Key,不要硬编码
def response = sh(
script: """
curl -X POST https://api.openai.com/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer \${AI_API_KEY}" \
-d ‘{
"model": "gpt-4o",
"messages": [{"role": "user", "content": "This build failed with this error: ${buildLog}. Please suggest a fix."}]
}‘
""",
returnStdout: true
).trim()
echo "AI Analysis Result: ${response}"
// 在这里,我们可以编写逻辑将 AI 的建议写入文件,甚至直接修改代码并 Commit 回来
// echo "Attempting to apply patch..."
}
}
}
在这个阶段,AI 不仅仅是一个聊天机器人,它成为了运维团队的一员。这种自主修复的能力虽然还在探索阶段,但已经显示出巨大的潜力,特别是在减少凌晨 2 点被叫醒处理构建失败的问题上。
4. 常见陷阱与性能优化:专家视角
在我们过去几年的运维经历中,踩过无数的坑。让我们来看看有哪些地方是需要特别注意的:
#### 陷阱 1:Java 堆内存溢出 (OOM)
现象:Jenkins Web 界面极其卡顿,或者构建任务莫名其妙被杀掉。
原因:默认的 Jenkins 启动配置分配的堆内存太小(通常是 256MB-512MB)。在加载了大量插件(这在 2026 年是常态)后,内存很快就不够用了。
解决方案:我们需要修改 Jenkins 的启动参数文件(通常位于 /etc/default/jenkins 或 systemd override 文件中)。
# 编辑配置文件
sudo nano /etc/default/jenkins
# 找到 JAVA_ARGS 行,将其修改为:
# JAVA_ARGS="-Xmx4096m -XX:MaxPermSize=512m"
# 这里的 -Xmx4096m 表示最大堆内存为 4GB,根据你的服务器资源进行调整。
# 然后重启 Jenkins
sudo systemctl restart jenkins
#### 陷阱 2:依赖地狱
现象:本地运行正常,一上 Jenkins 就报错找不到依赖。
原因:通常是因为缓存了旧的构建产物,或者是 node_modules 的版本冲突。
解决方案:这就是为什么我们在 Pipeline 中加入了 INLINECODE3eb5f066。另外,对于 Node.js 项目,使用 INLINECODE076aeb4c 而不是 INLINECODE91733ce9 是最佳实践,因为它严格遵循 INLINECODE0a4ff055,跳过某些用户配置,更“干净”。
#### 陷阱 3:安全凭证泄露
现象:有人不小心把 Jenkinsfile 包含明文密码的代码推到了公开仓库。
解决方案:绝对不要在 INLINECODEaed7897a 中硬编码任何密钥。请务必使用 Jenkins 的 Credentials Plugin。在代码中通过 INLINECODE451d8067 闭包来调用。
withCredentials([usernamePassword(credentialsId: ‘my-docker-hub‘, usernameVariable: ‘USER‘, passwordVariable: ‘PASS‘)]) {
sh "docker login -u $USER -p $PASS"
}
总结:我们在 2026 年的选择
Jenkins 可能不再是那个最“酷”的新工具,但它就像我们手中的瑞士军刀,虽然简单,但在处理复杂、定制化需求时依然无可替代。通过结合容器化技术、Pipeline as Code 以及新兴的 Agentic AI,我们让这位“老将”焕发了新生。
在这篇文章中,我们探讨了从基础安装到深度定制的全过程。希望这能帮助你在 2026 年构建出更高效、更智能的研发流水线。