Мне нужно установить более новую версию зависимости через Brew, чем та, которая содержится в образе Travis CI. Запуск brew update
добавляет более 100 секунд к каждому заданию сборки, поэтому я хотел бы найти способ кэширования установки или, по крайней мере, кэширования бутылки и формулы.
Кажется, должен быть простой рецепт для кэширования бутылок и формул из Brew, но пока я не нашел этот рецепт.
Если говорить точнее, я использую pyenv
в TravisCI и для заданий по сборке, которые запускают тесты с Python 2.6. Мне нужно pyenv
, чтобы быть последним ( 1.2.4 ), так как * Сбой 1010 * в более ранних версиях из-за недавних изменений в PyPI.
Я добавил условное выражение в .travis.yml
, и оно работает нормально:
if [[ "$pyver" == 2.6 ]]; then
brew upgrade pyenv &>/dev/null
fi
Однако выполнение команды занимает некоторое время. Я выделил команду обновления и рассчитал время:
time brew update
time brew upgrade pyenv
brew update
занимает более 100 секунд, brew upgrade
- 10 секунд.
Этот вывод привел к идее кэшировать бутылку и формулу и при каждом последующем запуске сборки:
HOMEBREW_NO_AUTO_UPDATE=1 brew upgrade pyenv
Есть вопрос, как кэшировать источники Brew . Это отлично работает.
cache:
directories:
- "$HOME/Library/Caches/Homebrew"
В $HOME/Library/Caches/Homebrew
я нахожу бутылку в кеше:
pyenv-1.1.5.sierra.bottle.tar.gz
pyenv-1.2.4.sierra.bottle.tar.gz
Однако даже с кэшированной бутылкой выполнение HOMEBREW_NO_AUTO_UPDATE=1 brew upgrade pyenv
не будет успешным, возможно потому, что обновленная формула не кэширована. Команда дает:
Error: pyenv 1.1.5 already installed
Я добавил кеширование по формуле:
cache:
directories:
- "$HOME/Library/Caches/Homebrew"
- /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core
и реализован следующий алгоритм:
- Запустите
HOMEBREW_NO_AUTO_UPDATE=1 brew upgrade pyenv
, чтобы обновить pyenv с использованием последней кэшированной формулы / бутылки.
- Проверить, установлено ли pyenv> = 1.2.4. Если формула и флакон pyenv 1.2.4 были кэшированы, он будет установлен на шаге (1) без запуска
brew update
.
- Если pyenv> = 1.2.4 не был кэширован, запустите
brew upgrade pyenv
и сохраните кэшированную бутылку и формулу.
и следующий скрипт:
function ver { printf "%03d%03d%03d" $(echo "$1" | tr '.' ' '); }
HOMEBREW_NO_AUTO_UPDATE=1 brew upgrade pyenv &>/dev/null
# Update brew and upgrade pyenv if necessary
if [ $(ver $(pyenv --version | cut -d ' ' -f2)) -lt $(ver 1.2.4) ]; then
brew upgrade pyenv &>/dev/null
fi
Однако я спрашиваю, стоит ли кэшировать /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core
. Примеры в документации Travis CI всегда кэшируют каталоги под $HOME
. Кажется, у меня могут возникнуть проблемы, когда Трэвис обновляет изображение. Удаляет ли Travis CI кэши ветвей после обновления изображения? Если нет, то мне кажется, что мне нужно сделать это вручную.
Есть ли лучший способ? Похоже, что Travis CI должен предлагать простой способ кэшировать формулу и бутылки Brew.
Разве я не должен беспокоиться о Brew и просто установить pyenv из источника?