xianyuCcCcCCCcc头像
CI/CD 流水线:GitLab + Jenkins + Docker 部署实战封面图

CI/CD 流水线:GitLab + Jenkins + Docker 部署实战

CI/CD 流水线:GitLab + Jenkins + Docker 部署实战

摘要:在现代软件开发中,DevOps 和 CI/CD(持续集成与持续交付)已经成为提升交付效率、保证代码质量的核心引擎。本文基于一套完整的实战笔记,从软件开发生命周期的演进讲起,详细剖析瀑布模型与敏捷开发的区别,并手把手带你基于 GitLab、Jenkins 和 Docker 搭建一条从代码提交、自动拉取、编译构建、推送到目标服务器,再到构建 Docker 镜像并一键运行的完整自动化流水线,最后实现基于 Tag 的多版本参数化构建部署。


一、 软件开发生命周期与 CI/CD 核心概念

1.1 软件开发生命周期 (SDLC)

软件开发生命周期(Software Development Life Cycle,SDLC)是集合了计划、开发、测试和部署过程的集合。通常包含五个阶段:

  1. 需求分析:收集信息,分析可行性及预算,确立项目目标。
  2. 设计:设计系统架构、功能形态,并创建项目计划。
  3. 实现:项目经理分配任务,开发者编写代码。
  4. 测试:测试人员进行功能测试、代码测试、压力测试等。
  5. 进化:根据用户反馈进行功能修改、Bug 修复或增加新功能。

1.2 瀑布模型 vs 敏捷开发

  • 瀑布模型:最著名的传统模型,高度结构流程化,像生产线一样单向流动。优点是简单易理解,提供阶段性检查节点;缺点是完全线性,用户只有等到末期才能看到成果,风险极大,且完全不适应用户需求的变化。
  • 敏捷开发:核心是迭代开发与增量开发。它将大周期拆分为多次小周期(迭代),每次迭代都交付一个用户可以感知的完整功能(增量)。
    • 好处:早期交付,降低成本(如盖楼,半年就交付一栋回款,而不是等两年一次性交10栋);降低风险,及时发现市场需求,避免全部造好却卖不出去。

1.3 什么是持续集成 (CI) 与持续部署 (CD)

持续集成 (Continuous Integration) 指的是频繁地(一天多次)将代码集成到主干,核心措施是代码合并前必须通过自动化测试,保证快速迭代的同时保持高质量。
完整的 CI/CD 流程包含以下步骤:

  1. 提交:开发者向代码仓库(GitLab)提交代码。
  2. 测试(第一轮):代码仓库配置 Hook,提交即触发自动化测试。
  3. 构建:将源码转换为可运行的实际代码(如打包成 Jar)。
  4. 测试(第二轮):构建完成后进行深度测试。
  5. 部署:将打包好的版本(Artifact)发到生产服务器。
  6. 回滚:一旦出问题,快速切回上一个版本的构建结果。

持续集成的组成要素:

  • 一个自动构建过程(拉取、编译、测试、统计)。
  • 一个代码存储库(GitLab/Git/SVN)。
  • 一个持续集成服务器(如 Jenkins)。

二、 环境架构规划与准备

为了完整模拟企业级的流水线,我们规划以下四台节点:

主机名IP 地址角色说明核心软件
gitlab192.168.100.153代码托管仓库GitLab (2核2G)
jenkins192.168.100.154持续集成服务器JDK, Maven, Docker, Jenkins (2核4G)
web192.168.100.155目标部署服务器Docker, docker-compose (2核4G)
Windows192.168.100.132开发本地环境JDK 1.8, Maven 3.8.4, IDEA, Git

2.1 Windows 开发环境配置

  • JDK:安装 jdk-8u152-windows-x64(JDK = JRE + 开发工具,JRE = JVM + 核心类库)。

image-20261111185445735

image-20261111185535356

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

image-20261111185847761

image-20261111185827056

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

image-20261111190127830


三、 代码托管: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。

image-20261111190649719

3.2 Windows 端推送到 GitLab

  1. 在 Windows 本地安装 Git 客户端。image-20261111190814325

  2. 在 IDEA 中配置 Git(File -> Settings -> Version Control -> Git)。

  3. 对刚才创建的 demo_web 项目进行 git add、git commit(如提交信息为 web_test_v1)。image-20261111191137160

    image-20261111191225112

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

image-20261111191434525

image-20261111191508006


四、 持续集成核心: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 初始化与系统工具配置

  1. 访问 http://192.168.100.154:8080,输入初始密码,创建管理员账号(如 jerry)。

    image-20261111191919089

  2. 上传离线插件:在“系统管理 -> 插件管理 -> 高级”中,上传 jquery.hpi、git-parameter.hpi、publish-over-ssh.hpi 等关键插件。

  3. 全局工具配置:将本地解压好的 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

    image-20261111192141135

    同页面

    image-20261111192204198

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

image-20261111192316976


五、 自动化流水线实战:从拉取到部署的五次构建

创建一个“自由风格的软件项目”,命名(如 mytest),并绑定 GitLab 项目地址和凭据。

第1次构建:拉取代码

直接点击“立即构建”,Jenkins 会触发 Git 插件,将 web_demo 项目的代码拉取到 Jenkins 容器的 workspace/mytest 目录下。

image-20261111192715219

第2次构建:编译打包

在“构建”选项卡中,添加构建步骤:“调用顶层 Maven 目标”。
目标填写:

clean package -DskipTests

点击构建,Maven 会在工作区生成 target/demo-0.0.1-SNAPSHOT.jar 文件。

image-20261111192957807

image-20261111193100173

第3次构建:推送 Jar 包至目标服务器

在“构建后操作”中,添加“Send build artifacts over SSH”。

  • Source files:target/*.jar
  • Remote directory:/usr/local/test
    构建成功后,Jenkins 会将打好的 Jar 包传到 Web 服务器的指定目录。

image-20261111193200297

第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)和参数化构建。

  1. 打标签:在 GitLab 项目中创建标签,例如在代码 v1.0 时打上 v1.0 标签。修改代码返回值为 v2.0,提交后再打上 v2.0 标签。

  2. 配置 Jenkins 参数化:在任务配置中勾选“参数化构建过程”,添加 Git Parameter:

    • 参数名设为 tag。
    • 参数类型选“标签”。
    • 默认值填 origin/master。

    image-20261111193347653

  3. 配置源码管理:在源码管理的分支指定处,填入 $tag 变量。

  4. 添加构建前置步骤:在 Maven 构建前,新增一个“执行 shell”的构建步骤,填入:

    git checkout $tag
    

    (注意:需要将此步骤拖拽到 Maven 构建步骤之前)

    image-20261111193447855

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

image-20261111193535769


转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/xianyuCcCcCCCcc/article/details/170557060

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--