【问题标题】:Speeding up Jenkins build加速 Jenkins 构建
【发布时间】:2020-07-16 20:34:15
【问题描述】:
我有一个 NodeJs 应用程序。
我有一份 Jenkins 的工作来做这件事:
- 是否进行 git 克隆
- 运行 NPM 安装
- 运行测试
- Gzip 压缩所有 html、css、js 文件
- 使用 aws sync 将静态内容发送到 S3
- Gzip 压缩非静态内容,以便稍后将其部署到我们的舞台环境中。
我正在寻找改进构建的方法。我的一些想法
- 可能是缓存节点模块而不是每次都运行 npm install
- 使用 artifactory 作为本地节点模块存储
- 并行运行 aws sync 命令
- 使用 s3cmd 命令代替 aws sync(我们有一个问题,aws sync 将相同的文件发送到 S3,因为 git clone 更改了文件的修改时间)
- 使用 git diff 获取已更改文件的列表,并仅将这些文件发送到 S3
我还能做些什么来缩短构建时间吗?
【问题讨论】:
标签:
node.js
git
amazon-web-services
jenkins
npm
【解决方案1】:
一些好主意 - 以下是我也会考虑的:
首先,尝试测量每个步骤(克隆、npm install、运行测试...)所需的时间,然后尝试改进每个步骤。您可以尝试专注于占用大部分时间的那项,也可以尝试获得一些速成,然后再尝试解决更难的问题。
一些想法:
- 您每次都需要
git clone 吗?也许考虑改用git pull。在构建结束时,执行git reset --hard ; git clean -f -d 作为最后一步,以摆脱任何未提交或本地更改的文件。我发现这样做比每次都写一个完整的git clone 要快得多。
-
npm install:与上述步骤一致,如果您保留之前构建的node_modules 文件夹,此步骤也应该快很多。当然,更新或删除依赖项的风险仍然存在。许多代码更改不需要您重新安装所有节点模块。您甚至可以输入一些逻辑来检测 package.json 文件自上次构建以来是否发生了变化,并且在这种情况下只运行完整的 npm install。
- 我通过运行一个完整、干净的构建的夜间构建解决了上述问题:每天一次新的
git clone 和一个完整的npm install。白天的所有其他构建都使用以前的构建状态,因此速度要快得多。如果您发现这会导致错误的结果,您可以安排每天运行几次干净构建。
- 调整
s3cmd/aws 命令——我认为这些命令的工作方式与rsync 类似,如果使用正确,它会非常快速高效。只能尝试git diff 路线作为最后的手段。使用git pull 而不是git clone 可能已经解决了这个问题。
- 一般而言,请尝试了解是否需要在每次构建时运行所有步骤,或者您是否可以将其中一些步骤移至其他构建计划或其他时间段(在晚上?)。如果您构建计划的主要目的是运行单元测试以向开发人员提供快速反馈,那么您可能不需要每次都压缩/复制/部署应用程序。或者将其拆分为两个构建计划,一个运行测试并快速返回,另一个执行所有部署。将其包含在单独的构建计划中将使您能够灵活地安排时间。
这些是我会尝试作为第一步的一些初步想法。
【解决方案3】:
我创建了这样的脚本来检查 package.json 的 md5sum
stage('NPM Build') {
steps {
sh '''
node -v && npm -v
'''
// rm -rf node_modules
sh '''
CACHE_FOLDER=${HOME}/.cache/md5
echo "EXECUTOR_NUMBER: ${EXECUTOR_NUMBER}"
MD5_FILE_NAME=package-json_${EXECUTOR_NUMBER}.md5sum
[ -d ${CACHE_FOLDER} ] || mkdir -p ${CACHE_FOLDER}
ls ${CACHE_FOLDER}
if [ -f ${CACHE_FOLDER}/${MD5_FILE_NAME} ];then
cp ${CACHE_FOLDER}/${MD5_FILE_NAME} ${MD5_FILE_NAME}
md5sum package.json
cat ${MD5_FILE_NAME}
md5sum -c ${MD5_FILE_NAME} || npm ci
else
echo "No md5sum backup"
npm ci
fi
echo "create new md5sum backup"
md5sum package.json
md5sum package.json > ${MD5_FILE_NAME}
cp ${MD5_FILE_NAME} ${CACHE_FOLDER}
'''
sh '''
npm run ngcc
'''
sh '''
npm run build
'''
}
}