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
注意: 初始密码在 /var/lib/jenkins/secrets/initialAdminPassword 里。我曾经有个同事,装完找了半小时密码,最后发现就在这个文件里。别犯同样的错。

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或钉钉插件
避坑指南: 我曾经在生产环境装了一个「Allure」插件,结果和已有的「HTML Publisher」冲突,导致构建报告页面打不开。花了半天才定位到问题。所以,插件版本一定要和Jenkins版本匹配,升级前先在测试环境验证。

插件管理最佳实践

我建议用代码管理插件列表,而不是手动点:

# 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功底的地方。