加速Jenkins构建

6
我有一个NodeJs应用程序。我有一个Jenkins任务,它执行以下操作:
  • 进行git克隆
  • 运行npm install
  • 运行测试
  • 压缩所有的html、css、js文件
  • 使用aws同步将静态内容发送到S3
  • 压缩非静态内容以便稍后部署到我们的阶段环境。
我正在寻找改进构建的方法。这是我的一些想法:
  • 可能缓存节点模块并不每次都运行npm install
  • 使用artifactory作为本地节点模块存储
  • 并行运行aws同步命令
  • 使用s3cmd命令代替aws sync(我们有一个问题,因为git clone会更改文件的修改时间,所以aws sync会将相同的文件发送到S3)
  • 使用git diff获取文件更改列表,只向S3发送那些文件
是否还有其他可以提高构建时间的方法?
3个回答

6

一些好的想法 - 这是我也会考虑的:

首先,尝试测量每个步骤(克隆、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 可能已经解决了这个问题。
  • 总的来说,尝试了解是否需要在每次构建中运行所有步骤,或者是否可以将其中一些步骤移动到其他构建计划或其他时间段(在晚上?)。如果您的主要目的是运行单元测试以向开发人员提供快速反馈,则也许您不需要每次都压缩/复制/部署应用程序。或将其拆分为两个构建计划,一个运行测试并快速返回,另一个执行所有部署。将其放在单独的构建计划中将使您可以灵活安排。

这些是我作为第一步尝试的一些初步想法。


2
执行浅克隆可以加快克隆过程,因为它不会下载所有提交记录。
git clone --depth 1 clone_url...

你应该可以使用这个插件缓存node_modules: https://plugins.jenkins.io/jobcacher

0
我创建了这样的脚本来检查 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
    '''
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接