Подтвердить что ты не робот

Rails локальный актив: precompile - есть ли автоматизированный способ проверки изменений?

У меня возникли проблемы с предварительной компиляцией ресурсов во время разворачивания, поэтому я решил перейти на локальную предварительную компиляцию и проверить в результирующих файлах исходное дерево. У меня нет никаких проблем с этим подходом, кроме, что иногда я забываю запустить задачу прекомпиляции и выпускать без предварительной компиляции активов!: (

Мне интересно, если кто-нибудь встретил какой-то способ проверить, произошли ли какие-либо изменения в активах? В идеале я бы хотел выполнить какую-то проверку на моем CI-сервере и не выполнить сборку, если изменения активов не были выполнены.

У меня было несколько мыслей:

  • Запустите RAILS_ENV=production bundle exec rake assets:precompile на сервере CI и посмотрите, есть ли какой-либо вывод. (Кажется, что команда ничего не выводит, если активы обновлены.) Однако кажется, что вывод команды каким-то образом связан с средой, в которой он запущен, потому что после запуска команды локально, фиксации результатов, а затем запуск команды на сервере CI, по-прежнему есть выход из этой команды! Я хотел бы знать, почему это связано с окружающей средой, но я даже не могу найти источник для rake assets:precompile в рельсах rails github. Кто-нибудь знает, где источник для этого?

  • Как-нибудь напишите команду, которая может просматривать историю git и определить, изменились ли какие-либо активы в моей папке assets/ с момента последней предварительной компиляции. Не совсем уверен, как это сработает...

Это немного меня больше, чем пару раз, и иногда я не поймаю его, когда коллеги совершают изменения в активах - плюс действительно кажется, что это то, что компьютер должен уловить для человека. Я предполагаю, что несколько разумной третьей альтернативой было бы, чтобы сервер CI просто запустил эту команду и автоматически передал сгенерированные файлы в исходное дерево, но мне не нравится идея совершения моего CI-сервера.

Любые мысли? Спасибо.

4b9b3361

Ответ 1

Вы можете найти источник для задачи precompile в sprockets-rails. Причина, по которой вы не видите каких-либо изменений локально, может быть связана с отпечатком пальца, который по умолчанию включен в производстве и отключен в других средах (поскольку отладка с отпечатками пальцев может быть проблемой). Вы можете включить его, используя config.assets.digest, как описано в руководстве .

Как вы упомянули, легко забыть шаг предварительной компиляции. Элегантная автоматизация будет заключаться в том, чтобы удалить скомпилированные активы из вашего репо и добавить задачу capistrano (или CI) для прекомпиляции активов при каждом развертывании. Предварительная компиляция в идеале должна произойти на сервере CI (в отличие от запуска на каждом производственном сервере). Этот подход также устраняет необходимость продолжать сканирование скомпилированных активов для изменений (что вам действительно не нужно заботиться).

Автоматическая фиксация чего-либо для вашего репо - плохая идея - в дополнение к непреднамеренным фиксациям вы в конечном итоге свернете свою историю фиксации.

Ответ 2

Мой ответ основан на Git, реализация OP-мысли 2: можем ли мы сбой сборки на основе Git -metadata tell-us, что источник assets/ новее, чем текущий assets-precompile/ в. Ответ может быть улучшен на основе условий в среде выписки или некоторых знаний о сборке Rails.

  • git log -1 --format=%ct -- assets/ предоставит вам временную метку последней фиксации источника.
  • git log -1 --format=%ct -- assets-precompile/ предоставит вам временную метку самой последней предварительной компиляции.

Добавьте условие на ранней стадии сборки, которое сравнивает эти два числа, и если 1 >= 2, не удалось создать какую-либо сборку. Фактически, вы можете захотеть построить льготный период там, в случае, если кто-то проскальзывает с фиксацией между ними, когда вы проверяете и выполняете предварительную компиляцию, и когда вы совершаете фиксацию.

В качестве альтернативы, чтобы быть более строгим с этим, вы сохранили бы хеш-фиксацию {{assets/}} в файле, и если он изменится и отличается от того, что в последнем предварительном компиляции, опять же, не удастся создать какую-либо версию, пока он не будет предварительно скомпилирован и зарегистрирован:

git log --format=%H -- assets/

... и сравните это с хэшем commit, который вы обновляете с помощью предварительной фиксации. Вы также можете использовать %T для древовидного хеша вместо хэша commit, который может упростить ветвление.

Ответ 3

Я пробую те же усилия, но я не смог разобраться с этой проблемой. Первым шагом является использование привязки git pre-commit для компиляции активов (что будет делать только что-то, если есть модифицированные активы).

http://jimneath.org/2012/05/05/precompile-assets-using-a-git-hook.html

Изменить: похоже, что эта ссылка получила нуклеуцию, здесь архивная версия: https://web.archive.org/web/20161022195654/http://jimneath.org/2012/05/05/precompile-assets-using-a-git-hook.html

Ответ 4

Вот сценарий Bash, который можно использовать в качестве основы для предварительной компиляции ресурсов локально, если есть какие-либо изменения в master в (app | lib | vendor)/assets. Если изменения присутствуют, ресурсы предварительно компилируются локально, и вы выполняете rsync с вашим рабочим сервером. Он основан на предпосылке, что при каждом коммите в производственную ветвь будет происходить развертывание. Основано на статье, чтобы ускорить развертывание 5 шагов, чтобы сократить время развертывания вдвое. Автор: Michael Trojanek.

Предполагается использование наборов гемов rvm.

#!/bin/sh
cd /Users/my_user/Rails_Projects/myrailsapp
branch="master"
git checkout "$branch" &> /dev/null
curbranch='git branch | grep \* | cut -d ' ' -f2'
if [ "$curbranch" == "$branch" ]; then
  echo "You are on the $curbranch branch"
  changes='git diff --name-only HEAD~ HEAD | grep -E "(app|lib|vendor)/assets"'
  if [ -z "$changes" ]; then
    echo "No assets need to be precompiled"
  else
    echo "Here are files that have changes:  $changes"
    echo "Beginning precompile of Rails assets..."
    source /Users/my_user/.rvm/environments/[email protected]
    bundle exec rake assets:precompile RAILS_ENV=production
  fi
else
  echo "Unable to checkout "$branch" branch"
fi