Jenkins 中的构建产物与缓存

在 CICD 的流程中,需要保存的产物主要有两类,构建产物和缓存。构建产物是最终的执行结果,缓存是为了优化下一次的构建速度。本篇主要描述的是在 Jenkins 中如何对构建产物和缓存进行归档,并结合对象存储进行实践。有部分示例使用的是 在 Kubernetes 上动态创建 Jenkins Slave 进行构建,配置过程可以参考超链接文档。

1. 部署 Minio 及 S3cmd 使用

1.1 部署 Minio

  • 安装
1
pip3 install s3cmd
  • 配置

  • 在 Jenkins 配置中,设置 Minio 相关的配置
  • 新建一条自由风格的流水线
编辑需要执行的 Step ,然后设置构建后需要归档的文件
  • 在构建日志中,可以看到已经归档成功
与 Jenkins 本地归档不同的是,此时的归档在当次构建页面上,不会展示。
  • 在 Minio 中,查看构建归档的结果

3. 缓存

Jenkins 中的缓存主要有两种实践方式,全部流水线共用缓存,每条流水线单独缓存。由于采用的是 Kubernetes 动态提供的 Agent ,可以将主机上的 Docker Volume 挂载到 Pod ,提供 Node 级别的缓存,这样全部 Pod 就会共用一个缓存目录。这样处理比较简单,但同时共用一个依赖库文件夹会带来潜在的并发问题。下图是相关的配置:另外一种方式是每条流水线一个缓存,这样够精细,但也增加了存储和执行时间的开销。下面主要介绍如何使用 jobcacher 进行缓存。
  • 搜索并安装插件 jobcacher
  • 查看 jobcacher 插件配置
在 Jenkins 配置中,可以看到 jobcacher 默认使用的是内置的存储,也就是 /var/jenkins_home 下的文件存储。如下图,下拉框中,还有另外一个 AWS 的 S3 存储可选。这里仅查看,不做设置和测试。
  • 新建流水线
新建流水线,内容如下:
pipeline {
agent {
kubernetes {
yaml """
apiVersion: v1
kind: Pod
spec:
containers:</p>
<ul>
<li>name: nodejs
image: node:10-alpine
command:
<ul>
<li>cat
tty: true
"""
}}
stages {
stage('checkout') {
steps {
git branch: 'master', url: "<a href="https://github.com/vuejs/vue">https://github.com/vuejs/vue</a>"
}
}
stage('install') {
steps {
container('nodejs') {
cache(caches: [[$class: 'ArbitraryFileCache', excludes: '', includes: '*<em>/</em>', path: 'node_modules']], maxCacheSize: 512) {
sh "npm install"
}
}
}
}
}
}
  • 首次构建

可以看到 Jenkins 将设置的目录进行了缓存。在 Jenkins 目录 /var/jenkins_home/jobs/test/cache/3ec03583f8eaec275cb2183db769ff47 中,可以看到相关文件。

abbrev colors flow-remove-types-no-whitespace lodash._baseclone require-relative accepts combined-stream
...

1
2
3
4
5
ls /var/jenkins_home/jobs/test/cache/3ec03583f8eaec275cb2183db769ff47

  • 带缓存构建