Перекомпилируйте слизню Heroku без push или изменения конфигурации

147

Мне интересно, есть ли способ заставить Heroku перекомпилировать слаг без нажатия новых коммитов и / или обновления переменных конфигурации.

Зачем мне это делать?

Я использую стек Cedar в Heroku для приложения Rails 3.2, и у меня возникают проблемы с rake assets:precompileошибкой задачи (только во время компиляции - позже она отлично работает с a heroku run). Я очень подозреваю, что это связано с тем, что некоторые переменные среды не были доступны во время компиляции слагов, и я думаю, что heroku labs:enable user_env_compileэкспериментальная функция решит эту проблему.

Однако, с user_env_compileвключенной функцией, изменения конфигурации не вызывают перекомпиляцию slug, и мой код не изменился, поэтому у меня нет никаких новых коммитов для отправки.

Конечно, я мог бы выдать «фиктивный» коммит с тривиальным изменением, что, вероятно, является самым простым ответом - но мне интересно, есть ли команда heroku, которая позволит мне напрямую перекомпилировать слаг.

Спасибо!

Натан
источник
1
Ничего в героке CLI клиента?
Мэтт Болл
Не прямой ответ, но всегда целесообразно документировать изменения зависимостей, такие как использование функций SAAS и т. Д. Я советую добавить запись в CHANGELOG, где упоминается, что вы теперь полагаетесь на эту функцию, и нажать это изменение, чтобы вызвать перестроение слизняк.
Патколл

Ответы:

93

Компиляция слагов запускается с помощью git pre-recieve hook, поэтому единственный способ перекомпилировать - это нажать новый коммит.

Для полноты см. Эту статью о Heroku для компилятора слагов . В нем обсуждалось использование ловушки предварительного получения для запуска процесса компиляции слагов под заголовком «Компиляция».

nmott
источник
23
Спасибо за Ваш ответ. Это правда, что ловушка git pre-receive компилирует слаг. (см., например: devcenter.heroku.com/articles/slug-compiler ). Это не обязательно означает, что heroku не (или не может) предоставить альтернативный механизм для вызова компиляции слизняков, такой как команда CLI heroku. Тем не менее, никто не упомянул такую ​​команду, поэтому я предполагаю, что ваш ответ точен, по крайней мере, на данный момент. Спасибо!
Натан
1
@Nathan Может быть, вы могли бы попросить поддержку Heroku о способе запуска компиляции пули с помощью Heroku Toolbelt? Если они пойдут на это, добавьте еще один ответ!
Culix
7
Теперь есть решение. Heroku-репо дополнения
Refael Ackermann
К вашему сведению, это решение не сработало, когда у меня было новое значение ENV для параметра в файле js, который компилируется в Rails application.js. Потребовалось выделить место для файла js и нажать, чтобы актив действительно перекомпилировался.
Джош Дил
12
repo:rebuildбольше не является действительной командой в плагине, как можно увидеть здесь: github.com/heroku/heroku-repo/commit/…
blindstuff
234

Самый простой обходной путь на данный момент - это нажать пустой коммит .

git commit --allow-empty -m "empty commit"
git push heroku master
Брэд Кох
источник
53
Вы можете сделать это и сохранить чистую историю совершить форс-толкая предыдущей фиксации впоследствии: git reset HEAD~; git push -f heroku master. Затраты времени на развертывание другого Heroku, но чистая история FTW.
Пол Аннесли
2
Просто чтобы дополнить этот псевдоним в вашем ~/.profileдобавлении: alias heroku-rebuild="git reset HEAD~; git push -f heroku master"или alias heroku-rebuild="git commit --allow-empty -m 'empty commit' && git push heroku master"вы можете просто набратьheroku-rebuild
unmultimedio
30

Мой общий подход заключается в следующем:

git commit --amend -C HEAD
git push heroku:master -f

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

В качестве дополнительного бонуса, поскольку у большинства людей проблемы с использованием Vim для редактирования сообщений коммитов. SHIFT-ZZ они быстро сохранят и выйдут из сообщения фиксации, не внося в него никаких изменений.

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

Спасибо Майклу Миору за идею использовать его, -C HEADчтобы не открывать редактор.

Крис Никола
источник
2
Или просто используйте, git commit --amend -C HEADчтобы вообще не открывать редактор и сохранить сообщение о коммите.
Майкл Миор
Спасибо @MichaelMior, это отлично сработало для меня и не мешало моей воспринятой истории мерзавцев.
Джеймс Уорд
Здесь нужно быть осторожным, если у вас другое центральное репо (в дополнение к героку). Если это так, это приведет к слиянию / дублированию коммита в истории при следующем извлечении, если вы уже выдвинули последний коммит.
Ник Ф
почему это так против пользователя?
Удача
20

Heroku выпустила плагин, который спрашивает: https://github.com/heroku/heroku-repo

Чтобы установить это:

$ heroku plugins:install heroku-repo

Для принудительного восстановления:

$ heroku repo:purge_cache -a appname
$ heroku repo:reset -a appname
$ git push heroku
Флимм
источник
15

Обновление: Heroku репо: восстановление было удалено .

Heroku имеет API для сборки, который вы можете использовать, см. Сборка и выпуск с использованием API


Вы можете использовать команду repo: rebuild, если надстройка heroku-repo .

heroku repo:rebuild -a appname

https://github.com/heroku/heroku-repo

khamaileon
источник
3
Просто прокомментировал и другую ветку, но здесь стоит повторить: аддон heroku-repo выглядит красиво, но после попытки я его не рекомендую. Есть плохая ошибка: он игнорирует флаг --app. Это заставило меня случайно перестроить нашу производственную среду, когда я собирался перестроить постановку. Эта ошибка была открыта для репо уже более года без разрешения. Я удалил этот плагин.
Джейсон Кроуфорд
6
Текущая версия heroku-repo не имеет подкоманды rebuild
Майк Слинн
Я должен сбросить удаленное репо, так как команда перестроения не работает
vaibhav jain
Вы обновили, и вы говорите, что он работает с "Build API", но я не совсем понимаю, как это работает ... Любая помощь? Нужно ли отправлять HTTP-запрос POST в API для перестройки моего приложения? Который на? Есть токен (причина безопасности)?
Дам Фа
5

Для этого есть плагин heroku .

$ heroku plugins:install heroku-releases-retry
Installing plugin heroku-releases-retry... done
$ heroku releases:retry
Retrying v16 on ⬢ murmuring-lowlands-3398... done, v17
Мэтт Джойнер
источник
3
Это повторит выпуск после неудачного выпуска. Он не будет повторять неудачную сборку.
Джереми
-3

Удалите ветку, затем снова нажмите ее. Не нужно использовать плагин.

git push heroku :master
git push heroku master
Эллиот Винклер
источник
Результатом будет «Push отклонено, невозможно удалить основную ветку».
Скали
-15

git push --force должно сработать :)

patcon
источник
3
Хм, я получаю "Все в курсе".
Брэд Кох