В 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
Теперь, когда заданию требуется установить пакет, он будет извлекать данные из нашего локального кэша вместо загрузки с удаленного сервера! Это обеспечивает заметное улучшение скорости для наших сборок.
Этот быстрый совет был первоначально опубликован в блоге Колина и опубликован здесь с разрешения автора.