Java 多模块持续集成(Maven 示例)

一、为什么要用 Jenkins?

目前,我们在持续集成上使用的是 GitLab 自带的 gitlab-ci。它支持自动化完成代码编译、镜像构建与镜像推送,减少开发人员在项目构建上的时间开销。

但是,gitlab-ci 有一个明显的缺陷:在遇到多模块项目时(如基于 SpringBoot 搭建的微服务项目),它显得有些无力。具体表现为,gitlab-ci 不支持多管道,每当项目中某个模块的代码有新的提交,gitlab-ci 都会触发全项目的自动构建,而无法仅针对产生变动的子模块进行构建。当项目规模较大时,这种构建方式会导致自动构建的代价非常大。

而在这种场景下,Jenkins 可以很好地实现我们的需求。当代码提交触发构建事件时,Jenkins 可以筛选出产生变动的子模块,并对这些子模块进行构建与打包,使我们的自动化构建变得精准而优雅。

下图为 Jenkins 持续集成的工作流示意图:
在这里插入图片描述

二、Jenkins 安装与部署

本节将介绍 Jenkins 的安装与部署。若只想了解流水线的构建,可以直接跳过本节内容。

2.1 环境准备

我们将采用 Docker 的方式部署 Jenkins,因此,部署前需在宿主机完成 Docker 环境的搭建。

💡 Docker 环境搭建不作为本文分享内容,请自行实现。

2.2 基础镜像

Jenkins 官方已提供现成的 Docker 镜像 jenkinsci/blueocean,该镜像内已包含以下组件:

  • Docker
  • ​Java
  • Git

但是我们不能直接使用它,因为它并未安装常用的构建工具(如 Maven、Gradle 等)。

为解决这个问题,我们可以参考以下 Dockerfile 文件,构建符合我们自身需求的 Jenkins 镜像:

FROM jenkinsci/blueocean:1.24.7
MAINTAINER pentaxie@qq.com

ARG BASE_DIR=/opt/maven

USER root
ADD apache-maven-3.6.3-bin.tar.gz ${BASE_DIR}
ADD settings.xml ${BASE_DIR}/apache-maven-3.6.3/conf
RUN ["cp","/usr/share/zoneinfo/Asia/Shanghai","/etc/localtime"]

ENV M2_HOME=${BASE_DIR}/apache-maven-3.6.3
ENV PATH=$PATH:$M2_HOME/bin

💡 该镜像在官方镜像的基础上,安装了 Maven,并相应地修改了 Maven 配置文件。

2.3 启动 Jenkins

完成 Jenkins 基础镜像的构建后,我们可以直接使用 Docker 命令启动容器:

docker run \
  -u root \
  -d \
  -p 38080:8080 \
  -v /data/test/jenkins-data:/var/jenkins_home \
  -v /var/run/docker.sock:/var/run/docker.sock \
  hub.panda.com/dc-jenkins:2.289

其中,两个 -v 需要了解其作用:

  • 第一个 -v 表示将 Jenkins 的安装及数据存储目录挂载到宿主机,下次我们重启 Jenkins 的 Docker 容器时,Jenkins 中的数据才得以保留
  • 第二个 -v 表示支持容器内的 Docker 客户端直接使用宿主机的 Docker 服务,这样我们在容器内执行构建命令时,实际上是在宿主机构建镜像

2.4 插件安装

Jenkins 启动后,首先需要安装社区推荐的插件。

除此之外,我们还需要在 插件管理 界面自行安装以下插件:

  • GitLab
  • Maven Integration
  • Pathignore​

上述插件的主要功能为:

插件名称主要功能
GitLab支持 GitLab Token 的配置
Maven IntegrationMaven 集成插件,支持在流水线中创建 Maven Project
Pathignore路径过滤插件,支持子模块过滤(实现多模块持续集成的关键)

2.5 必要配置

2.5.1 GitLab Token 设置

安装完 GitLab 插件后,需要在 系统管理 - 系统设置 页面添加 GitLab Token。

GitLab Token 是 GitLab 提供的身份验证的令牌,其生成方式可参考下图:
gitlab_token_1.jpg

💡 该 Token 尽可能赋予足够的权限,避免后续 Jenkins 集成出现权限不足的情况。

Token 生成后,即可参考以下图例进行添加:
gitlab_token_add.jpg
gitlab_token.jpg

💡 添加后,需点击图中的 Test Connection 按钮进行校验,确保 Token 可以正常运作。

2.5.2 Maven 设置

基础镜像部分介绍到,我们在官方 Jenkins 镜像的基础上安装了 Maven,并设置了环境变量与配置文件。

但这些还不够,使用 Jenkins 时,我们还需要在 系统管理 - 全局工具配置 页面中配置 Maven 的具体位置,使 Jenkins 能准确找到 Maven 的地址。
maven.jpg

2.5.3 时区设置

在基础镜像部分,我们已经将镜像的时区设置为东八区。

但是在 Jenkins 的界面中,每个用户的初始时区都是伦敦时间,需要我们手动设置为东八区:
timezone.jpg
完成此步骤后,Jenkins 的整个初始化配置过程便完成了,接下来可开始创建流水线进行深入体验。

三、构建流水线

本节将以 多模块集成流水线 为例,展示具体的流水线构建流程。

3.1 创建任务

集成了 Maven Integration 插件后,我们就可以在 新建任务 界面中创建一个 Maven Project:
new_project.jpg

💡 通过 Maven Project,我们可以很便捷地在 Jenkins 上实现代码的编译与打包。

3.2 配置流水线

流水线任务创建后,需要经过一系列配置。

3.2.1 代码源

Jenkins 支持从 GitLab 上拉取代码。
gitlab_source_1.jpg

💡 仓库地址记得使用 HTTPS,如果要使用 SSH 方式,需在容器中创建私钥(本文不介绍此种方式)。

如果我们的 GitLab 项目是 Private 级别,那么我们还需要创建一个 GitLab 凭据**(Username with password)**,该凭据需要填写具有项目对应权限的 GitLab 用户名与密码,如下所示:
gitlab_source_2.jpg

3.2.2 构建器

构建器用于设置流水线任务触发的条件。

在本例中,我们勾选 Build when a change is pushed to GitLab
pipeline_builder.jpg
该选项实现了当 GitLab 上有代码提交等行为时,触发 Jenkins 作业。

需要注意的是,要实现 GitLab 主动向 Jenkins 推送触发事件,需在 GitLab 上配置 Webhooks:
webhooks.jpg
Webhooks 中,有两个配置项需要格外注意:

  • URL 为 Jenkins 对应构建项目的地址,如本例为:http://192.168.5.98:38080/project/demo
  • Secret token 为 Jenkins 对应构建项目的令牌,通过点击 高级 按钮进行生成,具体示例可见下图

jenkins_secret_token.jpg
此外,图例中的 Allowed Branched 需要指定触发构建的分支。默认情况下,任意分支的提交都会触发构建任务。

💡 在本例中,我们设置为只有 master 分支发生变更才会触发构建任务。

3.2.3 构建环境

构建环境设定了构建过程中的一些条件与行为。

由于本节主要介绍多模块的持续集成,因此关键点在于 Do not build if only specified paths have changed 选项。

💡 该选项由 Pathignore 插件提供,可支持子模块的单独构建。

pipeline_builder_2.jpg
图例中的配置表示,只有子模块 dim-service 产生了变更项,才会触发构建任务。这是实现多模块持续集成的根基,在此基础上,我们可以很轻松地过滤掉其他子模块的构建流程。

3.2.4 Pre Steps

顾名思义,Pre Steps 可以完成构建前的一些准备工作。

例如,我们想要在构建时推送 Docker 镜像,那么就需要提前登录对应的 Docker 仓库:
pre_steps.jpg

3.2.5 Build

该步骤指明了我们整个流水线想要完成的构建指令。

在本例中,我们通过 -pl 参数指定构建的模块为 dim-service,配合上述 Pathignore 插件的过滤功能,我们可以实现当 dim-serivce 子模块发生变更项时自动触发该模块的 Docker 镜像创建与推送:
build.jpg

💡 docker:builddocker:push 依赖 docker-maven-plugin 插件,可自行研究,或等待后续教程。

完成上述所有步骤后,点击 应用保存,便完成了流水线的配置。如果项目有多个模块,创建多个对应的流水线任务即可。

3.3 构建与验收

现在,我们可以提交一次代码,验证一下流水线任务执行情况。若无异常,在我们提交代码后,流水线会自动开启构建任务,完成我们预设的构建工作。

💡 代码提交时,各子模块对应的流水线任务都会被触发,但是由于 Pathignore 插件的作用,流水线任务检测自身对应的子模块无变更项时,当前被触发的构建任务不会执行任何构建操作。

在构建任务明细中,可以通过点击 控制台输出 按钮,查看具体的构建日志:
console_output.jpg
如果一切顺利,即可在我们的 Docker 私仓里看到本次构建的镜像了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Jenkins 是一个开源的持续集成和部署工具,它可以帮助我们自动化构建、测试和部署软件项目。对于多模块项目,你可以使用 Jenkins 来构建和部署每个模块。 下面是一个基本的步骤来配置 Jenkins 处理多模块项目: 1. 安装和配置 Jenkins:首先,你需要在服务器上安装 Jenkins,并完成必要的配置(如配置 Java 环境、设置管理员账号等)。 2. 创建 Jenkins 任务:在 Jenkins 主界面上,点击 "New Item" 创建一个新的 Jenkins 任务。选择 "Freestyle project" 或者其他适合你需求的项目类型。 3. 配置源码管理:在任务配置页面的 "Source Code Management" 部分,选择适合你的版本控制工具(如 Git)并配置相关的仓库地址和凭证。 4. 构建触发器:选择适当的构建触发器,比如 SCM 变更触发、定时触发等。 5. 构建环境配置:在 "Build" 部分,配置构建环境,比如 Maven、Gradle 等构建工具和命令。 6. 构建步骤:在构建步骤中,你可以使用 Maven 或 Gradle 命令来构建每个模块。你需要为每个模块创建一个独立的构建步骤,并指定相应的构建命令。 7. 构建后操作:在构建后操作中,你可以配置一些后续的操作,比如测试报告生成、代码质量检查、构建产物的归档等。 8. 保存并立即构建:完成配置后,保存任务设置并点击 "Build Now" 手动触发一次构建,以验证构建配置是否正确。 以上是一个简单的示例,你可以根据实际需求和项目结构进行更详细的配置。希望对你有所帮助!如果你有任何其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值