CI/CD 流水线:GitLab + Jenkins + Docker 部署实战
摘要:在现代软件开发中,DevOps 和 CI/CD(持续集成与持续交付)已经成为提升交付效率、保证代码质量的核心引擎。本文基于一套完整的实战笔记,从软件开发生命周期的演进讲起,详细剖析瀑布模型与敏捷开发的区别,并手把手带你基于 GitLab、Jenkins 和 Docker 搭建一条从代码提交、自动拉取、编译构建、推送到目标服务器,再到构建 Docker 镜像并一键运行的完整自动化流水线,最后实现基于 Tag 的多版本参数化构建部署。
一、 软件开发生命周期与 CI/CD 核心概念
1.1 软件开发生命周期 (SDLC)
软件开发生命周期(Software Development Life Cycle,SDLC)是集合了计划、开发、测试和部署过程的集合。通常包含五个阶段:
- 需求分析:收集信息,分析可行性及预算,确立项目目标。
- 设计:设计系统架构、功能形态,并创建项目计划。
- 实现:项目经理分配任务,开发者编写代码。
- 测试:测试人员进行功能测试、代码测试、压力测试等。
- 进化:根据用户反馈进行功能修改、Bug 修复或增加新功能。
1.2 瀑布模型 vs 敏捷开发
- 瀑布模型:最著名的传统模型,高度结构流程化,像生产线一样单向流动。优点是简单易理解,提供阶段性检查节点;缺点是完全线性,用户只有等到末期才能看到成果,风险极大,且完全不适应用户需求的变化。
- 敏捷开发:核心是迭代开发与增量开发。它将大周期拆分为多次小周期(迭代),每次迭代都交付一个用户可以感知的完整功能(增量)。
- 好处:早期交付,降低成本(如盖楼,半年就交付一栋回款,而不是等两年一次性交10栋);降低风险,及时发现市场需求,避免全部造好却卖不出去。
1.3 什么是持续集成 (CI) 与持续部署 (CD)
持续集成 (Continuous Integration) 指的是频繁地(一天多次)将代码集成到主干,核心措施是代码合并前必须通过自动化测试,保证快速迭代的同时保持高质量。
完整的 CI/CD 流程包含以下步骤:
- 提交:开发者向代码仓库(GitLab)提交代码。
- 测试(第一轮):代码仓库配置 Hook,提交即触发自动化测试。
- 构建:将源码转换为可运行的实际代码(如打包成 Jar)。
- 测试(第二轮):构建完成后进行深度测试。
- 部署:将打包好的版本(Artifact)发到生产服务器。
- 回滚:一旦出问题,快速切回上一个版本的构建结果。
持续集成的组成要素:
- 一个自动构建过程(拉取、编译、测试、统计)。
- 一个代码存储库(GitLab/Git/SVN)。
- 一个持续集成服务器(如 Jenkins)。
二、 环境架构规划与准备
为了完整模拟企业级的流水线,我们规划以下四台节点:
| 主机名 | IP 地址 | 角色说明 | 核心软件 |
|---|---|---|---|
| gitlab | 192.168.100.153 | 代码托管仓库 | GitLab (2核2G) |
| jenkins | 192.168.100.154 | 持续集成服务器 | JDK, Maven, Docker, Jenkins (2核4G) |
| web | 192.168.100.155 | 目标部署服务器 | Docker, docker-compose (2核4G) |
| Windows | 192.168.100.132 | 开发本地环境 | JDK 1.8, Maven 3.8.4, IDEA, Git |
2.1 Windows 开发环境配置
- JDK:安装
jdk-8u152-windows-x64(JDK = JRE + 开发工具,JRE = JVM + 核心类库)。


- Maven:解压
apache-maven-3.8.4-bin。关键步骤:编辑conf/settings.xml,配置本地仓库路径<localRepository>,并添加阿里云镜像<mirror>以加速依赖下载。


- IDEA:安装
IntelliJ IDEA 2019.3.1,并在配置中引入相关插件。新建一个 Maven 项目(如demo_web),选择Spring Web模板,并将pom.xml中的 Java 版本改为1.8。

三、 代码托管:GitLab 部署与项目拉取
3.1 GitLab 安装与初始化
# 安装相关依赖包
yum -y install policycoreutils openssh-server openssh-clients postfix
# 启动ssh服务
systemctl enable sshd --now
# 设置postfix开机自启,并启动,postfix支持gitlab发信功能
systemctl enable postfix --now
# 下载gitlab包,并且安装
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6/gitlab-ce-12.4.2-ce.0.el6.x86_64.rpm
rpm -ivh gitlab-ce-12.4.2-ce.0.el6.x86_64.rpm
# 修改gitlab配置
[root@gitlab ~]# vim /etc/gitlab/gitlab.rb
//23行
external_url 'http://192.168.100.153:82'
//1112行
nginx['listen_port'] = 82
# 重载配置及启动gitlab
[root@gitlab ~]# gitlab-ctl reconfigure
[root@gitlab ~]# gitlab-ctl restart
执行 gitlab-ctl reconfigure 和 gitlab-ctl restart 重载配置。
启动后访问页面,修改 root 初始密码,然后创建一个私有组(如 xianyu_group) 和 一个普通用户(如 xianyu)。将 xianyu 加入该组并赋予 Owner 权限。在组内新建一个私有空项目 web_demo。

3.2 Windows 端推送到 GitLab
-
在 Windows 本地安装 Git 客户端。

-
在 IDEA 中配置 Git(File -> Settings -> Version Control -> Git)。
-
对刚才创建的
demo_web项目进行git add、git commit(如提交信息为web_test_v1)。

-
在 IDEA 中 Push 到远程,配置 Remote URL 为 GitLab 提供的 HTTP 地址(如
http://192.168.100.153:82/xianyu_group/web_demo.git),输入账号密码验证后即可成功推送。刷新 GitLab 页面即可看到代码。


四、 持续集成核心:Jenkins 部署与插件配置
4.1 Jenkins 的安装 (Docker 方式)
在 Jenkins 服务器上,先安装 maven, Docker 和 docker-compose,配置好镜像加速。
编写 docker-compose.yml:
version: "3.1"
services:
jenkins:
image: jenkins/jenkins:2.346.3-lts-jdk8
container_name: jenkins
ports:
- 8080:8080
- 50000:50000
volumes:
- ./data/:/var/jenkins_home/
启动后如果遇到 Permission denied,执行 chmod 777 data/ 赋予权限并重启。
为了解决插件下载慢的问题,修改 data/hudson.model.UpdateCenter.xml,将更新中心替换为清华源。同时开启服务器 IP 转发 net.ipv4.ip_forward=1。
4.2 初始化与系统工具配置
-
访问
http://192.168.100.154:8080,输入初始密码,创建管理员账号(如jerry)。
-
上传离线插件:在“系统管理 -> 插件管理 -> 高级”中,上传
jquery.hpi、git-parameter.hpi、publish-over-ssh.hpi等关键插件。 -
全局工具配置:将本地解压好的
jdk和maven目录移动到 Jenkins 容器的数据卷data/目录下,在 Jenkins 界面配置 JDK 别名和JAVA_HOME(如/var/jenkins_home/jdk),以及 Maven 路径。[root@jenkins data]# mv /usr/local/jdk/ ./ [root@jenkins data]# mv /usr/local/maven/ ./Jenkins页面—系统管理—Global Tool Configuration(全局工具配置)指定容器中的jdk环境 /var/jenkins_home/jdk

同页面

-
配置 Publish over SSH:在“系统配置”中,配置目标 Web 服务器的 SSH 凭据(IP、密码等),用于后续推送文件和执行命令,配置后点击
Test Configuration验证连接成功。

五、 自动化流水线实战:从拉取到部署的五次构建
创建一个“自由风格的软件项目”,命名(如 mytest),并绑定 GitLab 项目地址和凭据。
第1次构建:拉取代码
直接点击“立即构建”,Jenkins 会触发 Git 插件,将 web_demo 项目的代码拉取到 Jenkins 容器的 workspace/mytest 目录下。

第2次构建:编译打包
在“构建”选项卡中,添加构建步骤:“调用顶层 Maven 目标”。
目标填写:
clean package -DskipTests
点击构建,Maven 会在工作区生成 target/demo-0.0.1-SNAPSHOT.jar 文件。


第3次构建:推送 Jar 包至目标服务器
在“构建后操作”中,添加“Send build artifacts over SSH”。
- Source files:
target/*.jar - Remote directory:
/usr/local/test
构建成功后,Jenkins 会将打好的 Jar 包传到 Web 服务器的指定目录。

第4次构建:拉取 Docker 容器化文件
在 Windows IDEA 中,创建 Dockerfile 和 docker-compose.yml:
# Dockerfile
FROM openjdk:8
COPY demo-0.0.1-SNAPSHOT.jar /usr/local/
WORKDIR /usr/local
CMD java -jar demo-0.0.1-SNAPSHOT.jar
# docker-compose.yml
version: '3.1'
services:
mystest:
build:
context: ./
dockerfile: Dockerfile
image: mystest:v1.0
container_name: mystest
ports:
- 8080:8080
Commit 并 Push 到 GitLab,然后在 Jenkins 中重新执行一次构建,拉取包含 Docker 配置的最新代码。
第5次构建:远程容器化部署
前置准备:确保 Web 目标服务器上已安装 Docker 和 docker-compose。
回到 Jenkins 的任务配置,修改“构建后操作”的 SSH 命令:
cd /usr/local/test/docker
mv ../target/*jar ./
docker-compose down
docker-compose up -d --build
构建完成后,访问 http://192.168.100.155:8080/test,即可看到页面成功显示。
(注:多次构建可能产生 none 虚悬镜像,可以在命令最后加上 docker image prune -f 进行清理)
六、 进阶:参数化构建与多版本发布
为了让流水线具备发布不同历史版本的能力,我们引入 Git 标签(Tag)和参数化构建。
-
打标签:在 GitLab 项目中创建标签,例如在代码 v1.0 时打上
v1.0标签。修改代码返回值为 v2.0,提交后再打上v2.0标签。 -
配置 Jenkins 参数化:在任务配置中勾选“参数化构建过程”,添加 Git Parameter:
- 参数名设为
tag。 - 参数类型选“标签”。
- 默认值填
origin/master。

- 参数名设为
-
配置源码管理:在源码管理的分支指定处,填入
$tag变量。 -
添加构建前置步骤:在 Maven 构建前,新增一个“执行 shell”的构建步骤,填入:
git checkout $tag(注意:需要将此步骤拖拽到 Maven 构建步骤之前)

验证:现在点击“Build with Parameters”,下拉框会自动列出 v1.0 和 v2.0。选择 v1.0 构建,访问网页显示 v1.0 内容;选择 v2.0 构建,刷新网页即可看到 v2.0 的内容。一条支持版本控制的 CI/CD 流水线正式打通!

转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/xianyuCcCcCCCcc/article/details/170557060




