Статьи

Как оптимизировать основанные на Docker CI Runners с помощью общих кэшей пакетов

В Unleashed Technologies мы используем Gitlab CI с бегунами Docker для нашего непрерывного интеграционного тестирования. Мы приложили значительные усилия для ускорения выполнения сборок. Одна из наших оптимизаций заключалась в том, чтобы разделить объем кэша между всеми заданиями CI, позволяя им обмениваться файлами, такими как кэши загрузки пакетов.

Конфигурировать Docker было действительно просто — мы просто сбросили 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: NPM_CONFIG_CACHE
  • bower_storage__packages : bower_storage__packages
  • RubyGems: GEM_SPEC_CACHE
  • pip: PIP_DOWNLOAD_CACHE

Поэтому мы просто добавили эти директивы ENV в Dockerfile для наших базовых образов:

 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 

Теперь, когда заданию требуется установить пакет, он будет извлекать данные из нашего локального кэша вместо загрузки с удаленного сервера! Это обеспечивает заметное улучшение скорости для наших сборок.


Этот быстрый совет был первоначально опубликован в блоге Колина и опубликован здесь с разрешения автора.