序言
在现代软件开发中,持续集成(CI)与持续交付(CD) 已经成为保障团队高效协作与稳定交付的关键能力。随着应用规模的不断扩大,传统的手工部署方式已无法满足快速迭代和高可靠性的需求。为了提升开发效率、降低运维风险,构建一套自动化、可复用、可扩展的 CI/CD 流水线,已成为每一位开发者和团队不可或缺的技能。
本文将从零开始,带领你一步步搭建一套基于 Jenkins + Docker + Harbor 的 CI/CD 环境。通过这套实践方案,你将能够实现以下目标:
- 代码提交后自动触发构建与测试
- Maven 打包 Java 项目并生成可运行的 Jar
- 使用 Docker 打包镜像并推送到 Harbor 私服
- 自动化部署新版本应用,支持测试与生产环境的差异化策略
- 借助插件与配置,实现灵活的构建、发布与回滚
本指南不仅涵盖了环境准备与安装步骤,还提供了详细的配置说明和常见问题处理方法。无论你是初次接触 CI/CD 的开发者,还是希望优化团队交付流程的工程师,都可以通过本文快速上手,构建一套适合自身项目的自动化流水线。
让我们从 Jenkins 的部署开始,逐步搭建起一条从代码到上线的高效“高速公路”。
工作流程

- 代码提交 (Developer): 开发人员将代码提交到代码仓库,例如 GitHub 或 GitLab。
- Jenkins Job 触发 (Jenkins Server): Jenkins 监控代码仓库的变化。当检测到代码更新(例如,push 到指定分支)时,触发预先配置的 Jenkins Job。
- 拉取代码 (Jenkins Server): Jenkins Job 首先从代码仓库拉取最新的代码。
- 执行构建脚本 (Jenkins Server): Jenkins Job 执行预定义的构建脚本。该脚本通常包含以下步骤:
- 代码编译(如果需要)。
- 单元测试。
- 静态代码分析。
- 构建 Docker 镜像 (Jenkins Server): 构建脚本使用 Dockerfile 构建 Docker 镜像。Dockerfile 包含了构建镜像所需的所有指令,例如基础镜像、依赖安装、代码复制等。
- 推送 Docker 镜像到 Harbor (Jenkins Server): 构建完成后,Jenkins Job 将 Docker 镜像推送到 Harbor 私有仓库。在推送之前,需要先登录到 Harbor。
- Harbor 私有仓库 (Harbor Registry): Harbor 存储 Docker 镜像,并提供访问控制和镜像管理功能。
- 拉取 Docker 镜像 (Target Server): 目标服务器(例如,运行应用程序的服务器)从 Harbor 私有仓库拉取最新的 Docker 镜像。
- 停止旧容器 (Target Server): 在启动新容器之前,需要先停止当前正在运行的旧容器。
- 启动新容器 (Target Server): 使用新拉取的 Docker 镜像启动新的容器。
- 应用运行 (Target Server): 新的容器启动后,应用程序开始运行。
环境准备
- Linux 服务器 (Ubuntu20+ / CentOS7+)
- 已安装:
docker和docker-compose - 服务器内存建议 ≥ 4GB
- 预留端口:
- Jenkins: 18080
- Harbor: 28080
部署 Jenkins
准备工作
1 | mkdir -p /data/ci_cd/jenkins_lts/data |
配置 docker-compose.yml
1 | cat >> /data/ci_cd/jenkins_lts/docker-compose.yml <<EOF |
启动 Jenkins
1 | cd /data/ci_cd/jenkins_lts |
访问 Web 界面
浏览器访问:http://your-server-ip:18080出现如下界面说明安装 Jenkins 成功:

密码
Jenkins 密码在初次启动时相关日志会打印,比如:
1 | docker-compose logs -f |
1 | 2025-08-25 08:59:29.359+0000 [id=57] INFO jenkins.install.SetupWizard#init: |
插件配置



插件安装
进入设置-插件管理- Available Plugins 安装: Docker Plugin 、Publish Over SSH、Git Parameter 插件
注意事项
由于有些配置需要重启生效,所以初次安装完 Jenkins 后,需要将容器重启一下。
部署 Harbor
详见从 0 到 1 搭建私有 Docker 私服 Harbor 一文。
Jenkins 集成 Maven
maven Integration
安装 Maven
进入系统管理─全局工具配置菜单:


推荐使用稳定的 3.6.3 版本。
私服配置
进入 Jenkins 中修改 maven 的配置文件为公司对应的私服配置,之后重启 Jenkins
1 | cd /data/ci_cd/jenkins_lts/data/tools/hudson.tasks.Maven_MavenInstallation/maven-3.6.3/conf |
仓库路径变更
注意 maven 私服下载的 jar 仓库路径需要修改下为如下配置:
1 | <localRepository>/var/jenkins_home/tools/hudson.tasks.Maven_MavenInstallation/maven-3.6.3/repo</localRepository> |
jdk 配置(可忽略)
由于最新的的 Jenkins 版本不支持 JDK 8,可能出现不兼容问题,此时可以手动上传后续使用 jdk8,我们将 jdk8上传到 /data/ci_cd/jenkins_lts/data 目录,解压重命名后在全局配置增加如下配置:

Jenkins 集成 Docker
在 Jenkins 宿主机执行:
1 | docker login your-server-ip:8082 -u admin -p Harbor12345 |
Jenkins 打通服务器
在 Jenkins 构建 CICD 流水线时,不可避免需要和各个应用相关的服务器打通,以方便后续在相应服务器执行脚本,为此,我们需要为相关的服务器配置密码或密钥。
Publish over SSH 服务器配置


其他
在 Jenkins 的使用过程中,我们可能需要获取某个代码仓库的地址,此时需要相关用户权限,因此可能需要配置相关用户的凭证,以方便任务拉去代码打包。
凭证

实战
Jenkins + Java 应用包部署实战
在某些生产环境中, Java 应用需要部署到客户的内网服务器,需要将 Java 项目打生产环境的包后,通过一些 VPN 上传到客户内网服务器中,之后进行发布工作。
对于上述操作而已,如果每次都由开发手动切环境打包,打卡 VPN 连接内网服务器上传生产包,会比较占用开发资源,因此,我们可以让开发同学将对应项目的生产打包工作在 Jenkins 配置好,后续交由测试人员在 Jenkins 一键点击,Jenkins 运行相关打包任务,待生产包构建完成,由测试人员将生产包发布到内网服务器,执行发布脚本,提高工作效率。
那么,如何在 Jenkins 配置一个任务,可以执行一个项目的生产环境打包工作呢?
非常简单,我们可以按照如下步骤处理即可:

进行如下配置:




扩展──测试环境
有时候我们的测试环境可能未集成 Docker,而是使用的原生的 jar 包方式部署,此时在打包操作完成后,需要将打包后的 jar 包上传的部署的测试环境,重启相关应用,那么,可以额外增加下面的配置来达到该目的:

Jenkins + Docker + Harbor + Java 应用部署实战
在某些生产环境中, Java 应用部署到共有云服务器上,此时我们可以通过 Jenkins + Docker + Harbor + Java 进行一键生产环境部署工作。
具体步骤如下:


与之前有点差异,为了方便代码回滚,我们使用插件选择参数化构建:





优点
- 自动化: 自动化构建、测试和部署流程,减少人工干预。
- 快速迭代: 快速构建和部署新版本,加速迭代周期。
- 一致性: 确保所有环境中使用相同的 Docker 镜像,提高一致性。
- 可重复性: 通过 Dockerfile 和构建脚本,可以轻松地重复构建和部署过程。
- 可靠性: 减少人为错误,提高部署的可靠性
踩坑记录
Web 页面访问很慢
Jenkins 服务 ip 如果是动态的,在 ip 变化后,访问 Jenkins Web 界面会非常慢。出现这个问题的原因在于反向代理使用的是旧的 ip,解决方案是在系统管理-系统配置界面修改 ip 为当前 ip 即可:

文章信息
| 时间 | 说明 |
|---|---|
| 2025-06-06 | 初稿 |
| 2025-09-22 | 部署 Harbor 小节独立一文 |