加快Jenkins构建

时间:2015-11-05 23:35:36

标签: node.js git amazon-web-services jenkins npm

我有一个NodeJs应用程序。 我有一个詹金斯的工作,他做了很棒的事情:

  • 是git clone
  • 运行NPM安装
  • 运行测试
  • Gzips所有的html,css,js文件
  • 使用aws sync
  • 将静态内容发送到S3
  • Gzips非静态内容,以便以后可以将其部署到我们的舞台环境中。

我正在寻找改善构建的方法。我的一些想法

  • 可能是缓存节点模块而不是每次都运行npm install
  • 将artifactory用作本地节点模块存储
  • 并行运行aws sync命令
  • 使用s3cmd命令而不是aws sync(我们遇到一个问题,即aws sync将相同的文件发送到S3,因为git clone会更改文件的修改时间)
  • 使用git diff获取已更改的文件列表,并仅将这些文件发送到S3

我还能做些什么来改善构建时间吗?

3 个答案:

答案 0 :(得分:4)

一些好主意 - 这也是我也会考虑的:

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

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

答案 1 :(得分:1)

执行浅层克隆可加快克隆部分的速度。因为它没有下载所有提交。

git clone --depth 1 clone_url...

您应该可以使用此插件缓存node_moduleshttps://plugins.jenkins.io/jobcacher

答案 2 :(得分: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
    '''
  }
}