持续集成的缓存目录

功能介绍

项目本地安装依赖包时,会把下载的文件缓存起来,所以下次安装快很多。比如 npm install 会在项目中生成 ./node_modules,而缓存在 ~/.npm 目录,后者体积更小,更通用。

如果使用「CODING 提供的云主机」进行持续集成构建,每次都会创建新的虚拟服务器,构建完毕即销毁,所以需要指定「缓存目录」保存起来用于加速下次构建。

如果使用「自定义构建节点」进行持续集成构建,构建完毕不会销毁服务器,所以无需指定「缓存目录」。

如果在持续集成中使用 Docker,则需要把「缓存目录」挂载到 Docker 中。

默认环境构建

「默认环境」是 Linux 系统(root 用户),缓存目录如下:

包管理工具 缓存目录
Maven /root/.m2/
Gradle /root/.gradle/
npm /root/.npm/
composer /root/.cache/composer/
pip3 /root/.cache/pip/
yarn /usr/local/share/.cache/yarn/

在持续集成设置中勾选对应的「缓存目录」即可,如果没有则自行录入。

CODING 持续集成 缓存目录

Docker 环境构建

如果使用 Docker 环境构建,先勾选「缓存目录」,再挂载到 Docker 中即可(一般为 root 用户)。Jenkinsfile

pipeline {
  agent any
  stages {
    stage('检出') {
      steps {
        checkout([
          $class: 'GitSCM',
          branches: [[name: env.GIT_BUILD_REF]], 
          userRemoteConfigs: [[url: env.GIT_REPO_URL, credentialsId: env.CREDENTIALS_ID]]
        ])
      }
    }
    stage('Java 缓存') {
      agent {
        docker {
          image 'adoptopenjdk:11-jdk-hotspot'
          args '-v /root/.gradle/:/root/.gradle/ -v /root/.m2/:/root/.m2/'
          reuseNode true
        }
      }
      steps {
        sh './gradlew test'
      }
    }
    stage('npm 缓存') {
      steps {
        script {
          docker.image('node:14').inside('-v /root/.npm/:/root/.npm/') {
            sh 'npm install'
          }
        }
      }
    }
  }
}

如果使用「自定义构建节点」,需按照服务器的用户名,比如腾讯云 Ubuntu 服务器的默认用户名为 ubuntu,所以缓存目录为 /home/ubuntu/.npm/,对应的代码为:

docker.image('node:14').inside('-v /home/ubuntu/.npm/:/root/.npm/') {
  sh 'npm install'
}

缓存 Docker 基础镜像

每次构建都拉取 Docker 基础镜像(如 Dockerfile 继承的镜像、CI agent 镜像),耗时较久,可通过缓存进行加速。

参考以下 Jenkinsfile,修改镜像名称即可:

pipeline {
  agent any
  environment{
    DOCKER_CACHE_EXISTS = fileExists '/root/.cache/docker/php-8.0-cli.tar'
  }
  stages {
    stage('加载缓存') {
      when { expression { DOCKER_CACHE_EXISTS == 'true' } }
      steps {
        sh 'docker load -i /root/.cache/docker/php-8.0-cli.tar'
      }
    }
    stage('使用镜像(请修改此段)') {
      agent {
        docker {
          image 'php:8.0-cli'
          args '-v /root/.cache/:/root/.cache/'
          reuseNode 'true'
        }
      }
      steps {
        sh "php -v"
      }
    }
    stage('生成缓存(仅运行一次)') {
      when { expression { DOCKER_CACHE_EXISTS == 'false' } }
      steps {
        sh 'mkdir -p /root/.cache/docker/'
        sh 'docker save -o /root/.cache/docker/php-8.0-cli.tar php:8.0-cli'
      }
    }
  }
}

缓存目录增加 /root/.cache/,然后构建两次,即可发现第二次速度变快,说明缓存已生效:

警告: 缓存镜像会逐渐过时,建议定时清除。比如官方「php:8.0-cli」逐渐指向「php:8.0.1-cli」、「php:8.0.2-cli」,而缓存的「php:8.0-cli」不会变化。

上一篇持续集成的环境变量
最近更新
感谢反馈有用
感谢反馈没用

在阅读中是否遇到以下问题?

您希望我们如何改进?