神兵利器:Jenkins + Docker UP 工作效率 🚀🚀🚀

序言

  在现代软件开发中,持续集成(CI)与持续交付(CD) 已经成为保障团队高效协作与稳定交付的关键能力。随着应用规模的不断扩大,传统的手工部署方式已无法满足快速迭代和高可靠性的需求。为了提升开发效率、降低运维风险,构建一套自动化、可复用、可扩展的 CI/CD 流水线,已成为每一位开发者和团队不可或缺的技能。

  本文将从零开始,带领你一步步搭建一套基于 Jenkins + Docker + Harbor 的 CI/CD 环境。通过这套实践方案,你将能够实现以下目标:

  • 代码提交后自动触发构建与测试
  • Maven 打包 Java 项目并生成可运行的 Jar
  • 使用 Docker 打包镜像并推送到 Harbor 私服
  • 自动化部署新版本应用,支持测试与生产环境的差异化策略
  • 借助插件与配置,实现灵活的构建、发布与回滚

  本指南不仅涵盖了环境准备与安装步骤,还提供了详细的配置说明和常见问题处理方法。无论你是初次接触 CI/CD 的开发者,还是希望优化团队交付流程的工程师,都可以通过本文快速上手,构建一套适合自身项目的自动化流水线。

  让我们从 Jenkins 的部署开始,逐步搭建起一条从代码到上线的高效“高速公路”。

工作流程

Jenkins CI_CD 流程

  1. 代码提交 (Developer): 开发人员将代码提交到代码仓库,例如 GitHub 或 GitLab。
  2. Jenkins Job 触发 (Jenkins Server): Jenkins 监控代码仓库的变化。当检测到代码更新(例如,push 到指定分支)时,触发预先配置的 Jenkins Job。
  3. 拉取代码 (Jenkins Server): Jenkins Job 首先从代码仓库拉取最新的代码。
  4. 执行构建脚本 (Jenkins Server): Jenkins Job 执行预定义的构建脚本。该脚本通常包含以下步骤:
    • 代码编译(如果需要)。
    • 单元测试。
    • 静态代码分析。
  5. 构建 Docker 镜像 (Jenkins Server): 构建脚本使用 Dockerfile 构建 Docker 镜像。Dockerfile 包含了构建镜像所需的所有指令,例如基础镜像、依赖安装、代码复制等。
  6. 推送 Docker 镜像到 Harbor (Jenkins Server): 构建完成后,Jenkins Job 将 Docker 镜像推送到 Harbor 私有仓库。在推送之前,需要先登录到 Harbor。
  7. Harbor 私有仓库 (Harbor Registry): Harbor 存储 Docker 镜像,并提供访问控制和镜像管理功能。
  8. 拉取 Docker 镜像 (Target Server): 目标服务器(例如,运行应用程序的服务器)从 Harbor 私有仓库拉取最新的 Docker 镜像。
  9. 停止旧容器 (Target Server): 在启动新容器之前,需要先停止当前正在运行的旧容器。
  10. 启动新容器 (Target Server): 使用新拉取的 Docker 镜像启动新的容器。
  11. 应用运行 (Target Server): 新的容器启动后,应用程序开始运行。

环境准备

  • Linux 服务器 (Ubuntu20+ / CentOS7+)
  • 已安装:dockerdocker-compose
  • 服务器内存建议 ≥ 4GB
  • 预留端口:
    • Jenkins: 18080
    • Harbor: 28080

部署 Jenkins

准备工作

1
mkdir -p /data/ci_cd/jenkins_lts/data

配置 docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
cat >> /data/ci_cd/jenkins_lts/docker-compose.yml <<EOF
version: '3.7'

services:
jenkins:
image: jenkins/jenkins:lts
container_name: jenkins
environment:
- TZ=Asia/Shanghai
user: root
volumes:
- ./data:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
- /usr/libexec/docker/cli-plugins:/usr/libexec/docker/cli-plugins
- /etc/docker/daemon.json:/etc/docker/daemon.json
- /etc/localtime:/etc/localtime:ro
# harbor私服凭证
- /root/.docker:/root/.docker
# 历史ssh服务器信息
- /root/.ssh:/root/.ssh
ports:
- "18080:8080"
- "50000:50000"
restart: always
EOF

启动 Jenkins

1
2
cd /data/ci_cd/jenkins_lts
docker-compose up -d

访问 Web 界面

  浏览器访问:http://your-server-ip:18080出现如下界面说明安装 Jenkins 成功:

测试安装成功

密码

  Jenkins 密码在初次启动时相关日志会打印,比如:

1
docker-compose logs -f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2025-08-25 08:59:29.359+0000 [id=57]    INFO    jenkins.install.SetupWizard#init: 

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:

d4cf8ac2e04f425ea8b34bc286db64f9

This may also be found at: /var/jenkins_home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

2025-08-25 08:59:37.452+0000 [id=72] INFO jenkins.InitReactorRunner$1#onAttained: Completed initialization

插件配置

安装推荐的插件

等待安装完成

创建管理员账户

插件安装

  进入设置-插件管理- Available Plugins 安装: Docker Plugin 、Publish Over SSH、Git Parameter 插件

注意事项

  由于有些配置需要重启生效,所以初次安装完 Jenkins 后,需要将容器重启一下。

部署 Harbor

  详见从 0 到 1 搭建私有 Docker 私服 Harbor 一文。

Jenkins 集成 Maven

maven Integration

安装 Maven

  进入系统管理─全局工具配置菜单:

全局工具配置

选择稳定的 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 目录,解压重命名后在全局配置增加如下配置:

image-20250826153143188

Jenkins 集成 Docker

  在 Jenkins 宿主机执行:

1
docker login your-server-ip:8082 -u admin -p Harbor12345

Jenkins 打通服务器

  在 Jenkins 构建 CICD 流水线时,不可避免需要和各个应用相关的服务器打通,以方便后续在相应服务器执行脚本,为此,我们需要为相关的服务器配置密码或密钥。

Publish over SSH 服务器配置

配置 SSH 服务器位置

新增服务器

其他

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

凭证

创建凭据

实战

Jenkins + Java 应用包部署实战

  在某些生产环境中, Java 应用需要部署到客户的内网服务器,需要将 Java 项目打生产环境的包后,通过一些 VPN 上传到客户内网服务器中,之后进行发布工作。

  对于上述操作而已,如果每次都由开发手动切环境打包,打卡 VPN 连接内网服务器上传生产包,会比较占用开发资源,因此,我们可以让开发同学将对应项目的生产打包工作在 Jenkins 配置好,后续交由测试人员在 Jenkins 一键点击,Jenkins 运行相关打包任务,待生产包构建完成,由测试人员将生产包发布到内网服务器,执行发布脚本,提高工作效率。

  那么,如何在 Jenkins 配置一个任务,可以执行一个项目的生产环境打包工作呢?

  非常简单,我们可以按照如下步骤处理即可:

新建任务

  进行如下配置:

配置构建参数

设置对应打包的仓库和分支

配置一些任务执行日志参数

配置 maven 打包命令和归档的 jar 包

扩展──测试环境

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

增加jar包上传和执行脚本配置

Jenkins + Docker + Harbor + Java 应用部署实战

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

  具体步骤如下:

新建任务

配置任务策略

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

参数化构建配置

配置仓库

配置 maven 命令

配置执行脚本推送镜像到harbor私服

配置Java应用发布的服务器,执行发版脚本

优点

  • 自动化: 自动化构建、测试和部署流程,减少人工干预。
  • 快速迭代: 快速构建和部署新版本,加速迭代周期。
  • 一致性: 确保所有环境中使用相同的 Docker 镜像,提高一致性。
  • 可重复性: 通过 Dockerfile 和构建脚本,可以轻松地重复构建和部署过程。
  • 可靠性: 减少人为错误,提高部署的可靠性

踩坑记录

Web 页面访问很慢

Jenkins 服务 ip 如果是动态的,在 ip 变化后,访问 Jenkins Web 界面会非常慢。出现这个问题的原因在于反向代理使用的是旧的 ip,解决方案是在系统管理-系统配置界面修改 ip 为当前 ip 即可:

Jenkins URL

文章信息

时间 说明
2025-06-06 初稿
2025-09-22 部署 Harbor 小节独立一文
0%