4、持续集成环境搭建:Jenkins安装配置、Docker化部署、Agent管理、插件生态
持续集成环境,说白了就是流水线的「发动机」。没有它,你写再多代码也跑不起来。我见过太多团队,代码写得漂亮,但一提到搭建CI环境就头疼。嗯,今天咱们就把这块硬骨头啃下来。
4.1 Jenkins安装配置:从零开始
Jenkins这玩意儿,我最早接触还是1.x版本,那时候装个插件都能折腾半天。现在好多了,但坑依然不少。
安装方式的选择
我个人习惯用Docker部署,原因很简单——干净、好迁移、好回滚。但如果你在老旧服务器上干活,传统安装方式可能更稳妥。
先说说传统安装。在Ubuntu上,我一般这么干:
# 添加Jenkins源
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
# 安装
sudo apt-get update
sudo apt-get install jenkins
# 启动
sudo systemctl start jenkins
sudo systemctl enable jenkins
安装完第一件事是什么?不是配插件,是改端口。默认8080端口经常被占用,我习惯改成18080:
# 编辑配置文件
sudo vim /etc/default/jenkins
# 修改 HTTP_PORT=18080
# 重启
sudo systemctl restart jenkins
4.2 Docker化部署:这才是现代玩法
为什么要Docker化?你想想看,传统安装方式,升级Jenkins版本时,插件兼容性问题能让你崩溃。Docker化之后,一个镜像搞定所有。
我推荐用官方镜像,但别直接用latest,要指定版本:
# docker-compose.yml
version: '3.8'
services:
jenkins:
image: jenkins/jenkins:lts-jdk11
container_name: jenkins-master
ports:
- "18080:8080"
- "50000:50000"
volumes:
- jenkins_home:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
environment:
- JAVA_OPTS=-Djenkins.install.runSetupWizard=false
volumes:
jenkins_home:
这里有个关键点:挂载docker.sock。为什么?因为我们要在Jenkins容器里调用宿主机的Docker来构建镜像。这叫「Docker in Docker」的轻量方案。
核心思路: Jenkins主节点只负责调度,构建任务交给Agent。主节点别装太多东西,保持干净。
启动后,访问 http://你的IP:18080。如果看到初始化界面,说明成功了。但别急着点「安装推荐插件」,我建议先配好管理员账号:
# 创建管理员用户脚本
cat <<EOF | docker exec -i jenkins-master bash
echo 'jenkins.model.Jenkins.instance.securityRealm.createAccount("admin", "your_strong_password")' | java -jar /usr/share/jenkins/jenkins-cli.jar -auth admin:$(cat /var/jenkins_home/secrets/initialAdminPassword) groovy =
EOF
嗯,这命令有点长。我一般直接进容器操作,更直观:
docker exec -it jenkins-master bash
cat /var/jenkins_home/secrets/initialAdminPassword
# 复制密码,浏览器访问,按提示操作
4.3 Agent管理:分布式才是王道
单节点Jenkins,说白了就是玩具。生产环境必须上分布式。为什么?你想想看,一个构建任务跑半小时,其他任务全堵着,开发团队不骂娘才怪。
Agent类型选择
| 类型 | 适用场景 | 我踩过的坑 |
|---|---|---|
| SSH Agent | 固定服务器,网络稳定 | 密钥配置容易忘,连接超时 |
| Docker Agent | 临时任务,环境隔离 | 镜像拉取慢,磁盘撑爆 |
| Kubernetes Agent | 大规模集群,动态扩缩 | RBAC配置复杂,Pod启动慢 |
我个人最常用Docker Agent。配置起来很简单:
# 在Jenkins系统配置里添加云
# 类型选择:Docker
# Docker Host URI: unix:///var/run/docker.sock
# 然后添加镜像模板
# 镜像:jenkins/agent:latest-jdk11
# 远程文件系统根目录:/home/jenkins
# 用法:尽可能使用这个节点
小技巧: Agent镜像别用太大。我见过有人用ubuntu:20.04做Agent,每次拉取1GB,构建5分钟,拉镜像10分钟。用alpine或者官方agent镜像,小很多。
我曾经遇到过一个坑:Agent节点磁盘满了,构建到一半直接失败。排查了半天,发现是日志没清理。后来我加了定时任务:
# 在Agent节点上,每天凌晨清理
0 3 * * * find /var/lib/jenkins/workspace -type d -mtime +7 -exec rm -rf {} \;
4.4 插件生态:别贪多,够用就行
Jenkins有1800多个插件,但90%你根本用不上。我见过有人装了200个插件,启动都要5分钟,还经常冲突。嗯,这里要克制。
必装插件清单
根据我的经验,以下插件是核心中的核心:
- Pipeline:流水线核心,没有它你玩不转
- Git:代码拉取必备
- Docker Pipeline:Docker构建和发布
- Blue Ocean:可视化流水线,调试方便
- Credentials Binding:密钥管理,安全第一
选装插件看场景:
- 做Java项目:加Maven Integration、SonarQube Scanner
- 做前端项目:加NodeJS Plugin
- 做容器化:加Kubernetes Plugin
- 做通知:加Slack或钉钉插件
插件管理最佳实践
我建议用代码管理插件列表,而不是手动点:
# plugins.txt
pipeline-model-definition:latest
git:latest
docker-workflow:latest
blueocean:latest
credentials-binding:latest
sonar:latest
slack:latest
然后在Dockerfile里自动安装:
FROM jenkins/jenkins:lts-jdk11
COPY plugins.txt /usr/share/jenkins/ref/plugins.txt
RUN jenkins-plugin-cli --plugin-file /usr/share/jenkins/ref/plugins.txt
这样每次重建镜像,插件版本都是可控的。不会出现「昨天还好好的,今天突然报错」的情况。
4.5 实战:搭建一个最小可用环境
说了这么多,咱们动手搭一个。目标:5分钟内跑通一个Hello World流水线。
第一步:启动Jenkins
docker run -d --name jenkins \
-p 18080:8080 -p 50000:50000 \
-v jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkins/jenkins:lts-jdk11
第二步:配置基本插件
访问 http://localhost:18080,用初始密码登录。选择「安装推荐插件」,等几分钟。
第三步:创建第一个流水线
pipeline {
agent any
stages {
stage('Hello') {
steps {
echo 'Hello, CI World!'
}
}
stage('Build') {
steps {
sh 'echo "Building..."'
}
}
stage('Test') {
steps {
sh 'echo "Testing..."'
}
}
}
post {
success {
echo '流水线执行成功!'
}
failure {
echo '流水线执行失败,请检查日志。'
}
}
}
点「Build Now」,看到蓝色球就说明成功了。嗯,就是这么简单。
记住: 持续集成环境不是搭完就完事了。你要持续维护——升级版本、清理日志、监控磁盘。我每周五下午都会花半小时检查Jenkins的健康状态,这个习惯保持了三年,帮我避免了好几次生产事故。
好了,Jenkins环境搭建就聊到这儿。下一章咱们讲流水线脚本的编写,那才是真正体现DevOps功底的地方。