searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

使用对象存储加速Jenkins构建速度

2024-06-18 09:31:33
68
0

背景介绍

      在使用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对象存储,节省对象存储空间的同时由于缓存最终达到一致,同时可以将缓存依赖的能力做进一步封装为平台高级能力,满足不同租户需求。

0条评论
0 / 1000
方****新
3文章数
0粉丝数
方****新
3 文章 | 0 粉丝
方****新
3文章数
0粉丝数
方****新
3 文章 | 0 粉丝
原创

使用对象存储加速Jenkins构建速度

2024-06-18 09:31:33
68
0

背景介绍

      在使用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对象存储,节省对象存储空间的同时由于缓存最终达到一致,同时可以将缓存依赖的能力做进一步封装为平台高级能力,满足不同租户需求。

文章来自个人专栏
个人技术专栏
3 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0