如何使用共享包缓存优化基于 Docker 的 CI 运行器

在 Unleashed Technologies,我们使用 Gitlab CI 和 Docker runners 进行持续集成测试。 我们已投入大量精力来加快构建执行速度。 我们所做的优化之一是在所有 CI 作业之间共享一个缓存卷,允许它们共享文件,例如包下载缓存。

配置 Docker runner 非常简单——我们只是简单地放弃了 volumes = ["/srv/cache:/cache:rw"] 进入我们的 config.toml 文件:

concurrent = 6
check_interval = 0

[[runners]]
  name = "ut-ci01"
  url = "https://gitlab.example.com/"
  token = "xxxxxxxxxxxxx"
  executor = "docker"
  [runners.docker]
    tls_verify = false
    image = "unleashed/php:7.1"
    privileged = false
    disable_cache = false
    volumes = ["/srv/cache:/cache:rw"]
  [runners.cache]

因此,所有 CI 作业都会有一个 /cache 可用目录(映射到 /srv/cache 在 Docker 主机上)。

下一步是让包管理器在作业运行命令时使用这个缓存目录 composer install 或者 yarn install. 幸运的是,这些包管理器允许我们使用环境变量配置它们的缓存目录:

    作曲家: COMPOSER_CACHE_DIR
    纱: YARN_CACHE_FOLDER
    国家公园管理委员会: NPM_CONFIG_CACHE
    凉亭: bower_storage__packages
    红宝石: GEM_SPEC_CACHE
    点: PIP_DOWNLOAD_CACHE

所以我们简单地添加了这些 ENV 中的指令 Dockerfiles 为我们的基础图像:

ENV COMPOSER_CACHE_DIR /cache/composer
ENV YARN_CACHE_FOLDER /cache/yarn
ENV NPM_CONFIG_CACHE /cache/npm
ENV bower_storage__packages /cache/bower
ENV GEM_SPEC_CACHE /cache/gem
ENV PIP_DOWNLOAD_CACHE /cache/pip

现在,只要作业需要安装包,它就会从我们的本地缓存中提取,而不是从远程服务器下载! 这为我们的构建提供了显着的速度提升。

此快速提示最初发布在 Colin 的博客上,并在获得作者许可的情况下在此处重新发布。

阅读更多

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注