一、为什么要用 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 配置文件。