背景介绍
在使用Jenkins从源码开始构建时,由于需要从远程仓库拉取依赖导致Jenkins构建速度较慢,需要优化Jenkins构建速度。借助Job Cacher能力,将依赖存储到对象存储中,再次部署时直接从对象存储拉取依赖,加速Jenkins构建速度。
Job Cacher插件介绍
Job Cacher插件是一个作业缓存插件,能够为依赖项和构建制品提供缓存,能够减少构建时长。Job Cacher支持本地、S3以及AWS S3三种存储方式,并提供jenkins.plugins.itemstorage.ItemStorage和jenkins.plugins.jobcacher.Cache两个扩展点让用户按需添加自定义缓存和缓存存储方式。安装Job Cacher插件后,可以在jenkins的pipeline和free style的job中使用该插件能力,同时支持自定义缓存缓存大小以使缓存不会无限制增长。
JobCacher缓存参数说明
参数 | 是否必须 | 说明 |
maxCacheSize | 否 | 允许的最大缓存,单位MB。该参数可以防止缓存无限期增长,设置为零或为空可跳过检查缓存大小。 |
skipSave | 否 | 如果设置为 true,则不保存缓存;默认为false。 |
skipRestore | 否 | 如果设置为 true,则跳过还原缓存;默认为false。 |
defaultBranch | 否 | 如果当前分支没有缓存,它将从指定的分支设定其缓存。不设置可为每个分支生成新的缓存。该选项可用于微调缓存有效性。 |
caches | 是 | 定义要使用的缓存。仅支持ArbitraryFileCache,相关参数如下: |
ArbitraryFileCache参数说明:
参数 | 是否必须 | 说明 |
path | 是 | 缓存路径。可以是绝对路径或相对工作空间的相对路劲。 |
cacheName | 否 | 缓存名称。通过该名称确保缓存的唯一性。 |
includes | 否 | 用于匹配应包含在缓存中的文件。 |
excludes | 否 | 用于匹配应从缓存中排除的文件。 |
useDefaultExcludes | 否 | 是否使用默认排除项,默认为true |
cacheValidityDecidingFile | 否 | 一个或多个文件的工作区相对路径,应用于确定缓存是否为最新。只会恢复最新的缓存,并且只会创建过时的缓存。 |
compressionMethod | 是 | 要使用的压缩方法。支持ZIP、TARGZ、TARGZ_BEST_SPEED、TAR_ZSTD、TAR压缩方法,默认为TARGZ。 |
使用Job Cacher插件
在Jenkins上使用Job Cacher插件需要现在Jenkins的插件中心安装该插件,并在Jenkins的全局配置中配置该插件使用的存储方式,然后在Jenkins的pipeline或free style的任务中使用,具体流程如下:
安装Job Cacher插件
在Jenkins的插件管理页面,选择Job Cacher插件并安装。
配置对象存储相关信息
安装Job Cacher插件后,需要配置Job Cacher插件,在Jenkins全局配置的Item Storage中配置S3对象存储,按实际填写S3对象存储具体配置,配置项如下图所示:
接入pipeline
安装并配置好Job Cacher插件后,可以在pipeline中使用该插件,使用方法如下:
cache(maxCacheSize: 250, , caches: [
arbitraryFileCache(path: '/root/.m2/repository')
]) {
// ...
}
使用前后效果:
第一次构建日志:
15:50:03 [Cache for /root/.m2/repository with id b03f679c87d5f9296252817a1d200013] Searching cache in job specific caches...
15:50:03 [Cache for /root/.m2/repository with id b03f679c87d5f9296252817a1d200013] Searching cache in default caches...
15:50:03 [Cache for /root/.m2/repository with id b03f679c87d5f9296252817a1d200013] Skip restoring cache as no up-to-date cache exists
15:50:03 [Pipeline] {
15:50:03 [Pipeline] sh
15:50:04 + mvn -U -e clean package -Dmaven.test.skip=true
15:50:05 [INFO] Error stacktraces are turned on.
15:50:05 [INFO] Scanning for projects...
15:50:05 Downloading from public: maven.aliyun.com/repository/public/org/springframework/boot/spring-boot-starter-parent/2.3.12.RELEASE/spring-boot-starter-parent-2.3.12.RELEASE.pom
15:50:07 Downloading from public: maven.aliyun.com/repository/public/org/springframework/boot/spring-boot-dependencies/2.3.12.RELEASE/spring-boot-dependencies-2.3.12.RELEASE.pom
第二次构建日志:
15:47:45 [Pipeline] cache
15:47:45 [Cache for /root/.m2/repository with id b03f679c87d5f9296252817a1d200013] Searching cache in job specific caches...
15:47:45 [Cache for /root/.m2/repository with id b03f679c87d5f9296252817a1d200013] Found cache in job specific caches
15:47:45 [Cache for /root/.m2/repository with id b03f679c87d5f9296252817a1d200013] Restoring cache...
15:47:50 [Cache for /root/.m2/repository with id b03f679c87d5f9296252817a1d200013] Cache restored in 4454ms
15:47:50 [Pipeline] {
15:47:50 [Pipeline] sh
15:47:50 + mvn -U -e clean package -Dmaven.test.skip=true
15:47:51 [INFO] Error stacktraces are turned on.
15:47:51 [INFO] Scanning for projects...
15:47:51 [INFO]
15:47:51 [INFO] -----------< com.ctg.edas.demo:spring-cloud-consumer-nacos >------------
15:47:51 [INFO] Building spring-cloud-consumer-nacos 1.0-SNAPSHOT
15:47:51 [INFO] --------------------------------[ jar ]---------------------------------
15:47:52 [INFO]
15:47:52 [INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ spring-cloud-consumer-nacos ---
15:47:52 [INFO]
15:47:52 [INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ spring-cloud-consumer-nacos ---
15:47:52 [INFO] Using 'UTF-8' encoding to copy filtered resources.
15:47:52 [INFO] Copying 1 resource
15:47:52 [INFO] Copying 1 resource
15:47:52 [INFO]
15:47:52 [INFO] --- maven-compiler-plugin:3.8.1:compile (default-compile) @ spring-cloud-consumer-nacos ---
15:47:52 [INFO] Changes detected - recompiling the module!
15:47:52 [INFO] Compiling 5 source files to /home/jenkins/agent/workspace/k8s-code-build-first/target/classes
15:47:53 [INFO]
15:47:53 [INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ spring-cloud-consumer-nacos ---
15:47:53 [INFO] Not copying test resources
15:47:53 [INFO]
15:47:53 [INFO] --- maven-compiler-plugin:3.8.1:testCompile (default-testCompile) @ spring-cloud-consumer-nacos ---
15:47:53 [INFO] Not compiling test sources
15:47:53 [INFO]
15:47:53 [INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ spring-cloud-consumer-nacos ---
15:47:53 [INFO] Tests are skipped.
15:47:53 [INFO]
15:47:53 [INFO] --- maven-jar-plugin:3.2.0:jar (default-jar) @ spring-cloud-consumer-nacos ---
15:47:53 [INFO] Building jar: target/spring-cloud-consumer-nacos.jar
15:47:54 [INFO]
15:47:54 [INFO] --- spring-boot-maven-plugin:2.3.12.RELEASE:repackage (repackage) @ spring-cloud-consumer-nacos ---
15:47:54 [INFO] Replacing main artifact with repackaged archive
15:47:54 [INFO] ------------------------------------------------------------------------
15:47:54 [INFO] BUILD SUCCESS
15:47:54 [INFO] ------------------------------------------------------------------------
15:47:54 [INFO] Total time: 2.873 s
15:47:54 [INFO] Finished at: 2024-03-27T07:47:54Z
15:47:54 [INFO] ------------------------------------------------------------------------
15:47:54 [Pipeline] }
15:47:54 [Cache for /root/.m2/repository with id b03f679c87d5f9296252817a1d200013] Creating cache...
15:48:01 [Cache for /root/.m2/repository with id b03f679c87d5f9296252817a1d200013] Cache created in 6853ms
15:48:01 [Pipeline] // cache
从首次和第二次日志对比可以清楚看到,第一次构建的时候因为没有从S3对象存储找到对应的缓存需要拉取源码依赖,再次构建的时候直接从S3对象存储拉取缓存,大大加速Jenkins构建速度。
后续展望
在实际使用过程中,同租户下的应用存在相同依赖的情况,如果让Jenkins的每个任务独享一个缓存,存在缓存空间占据过大的情况,因此需要在该插件的基础上修改,让用户按照自己的需求自己定义是否共用同一个缓存。在微服务应用平台的实际应用过程中,我们在该插件的基础上增加preCachePath参数,实现相同租户下的任务共享同一S3对象存储,节省对象存储空间的同时由于缓存最终达到一致,同时可以将缓存依赖的能力做进一步封装为平台高级能力,满足不同租户需求。