重新编译 Heroku slug 不需要推送或更改配置

160
我想知道是否有一种方法可以强制Heroku重新编译slug,而不需要推送新的提交或更新配置变量。
为什么我要这样做呢?:
我正在使用Heroku上的Cedar堆栈来运行一个Rails 3.2应用程序,我遇到了rake assets:precompile任务失败的问题(仅在编译期间---稍后通过heroku run可以正常工作)。 我非常怀疑这是由于在编译slug时某些环境变量不可用,而我认为启用heroku labs:enable user_env_compile实验功能将解决此问题。
然而,打开user_env_compile功能后,配置更改不会触发slug的重新编译,而且我的代码也没有更改,所以我没有新的提交要推送。
当然,我可以推送一个带有微不足道更改的“虚拟”提交,这可能是最简单的答案---但我想知道是否有一种Heroku命令可以直接重新编译slug。
谢谢!

1
在 Heroku CLI 客户端中没有任何内容吗? - Matt Ball
不是直接回答,但是记录依赖项的更改总是明智的,例如依赖SAAS功能等。我的建议是在CHANGELOG中添加一个条目,说明您现在依赖于此功能,并推送该更改以触发重建slug。 - patcoll
10个回答

266

目前最简单的解决方法是提交一个空的commit

git commit --allow-empty -m "empty commit"
git push heroku master

64
你可以通过在先前提交后使用强制推送的方法来做到这一点并保持干净的提交历史记录:git reset HEAD~; git push -f heroku master。虽然需要另一次 Heroku 部署的时间成本,但是这样做会获得干净的历史记录。 - Paul Annesley
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
1
无论答案的正确性和后续评论如何,我都忍不住会想“怎么可能没有更好的方法?” 这该怎么办? - user3190036
我还有一种变体,可以使用--auto-squash更轻松地重新设置基础和删除空提交。 git commit --allow-empty --fixup HEAD && git push heroku master - bas080

100

Slug编译是通过git预接收钩子来调用的,因此重新编译的唯一方法是推送新的提交。

为了完整起见,请参阅Heroku上有关slug编译器的文章。在“编译”标题下讨论了使用预接收钩子来调用slug编译过程的方法。


24
谢谢您的回答。确实,git预接收钩子编译了代码包(例如,请参见:http://devcenter.heroku.com/articles/slug-compiler)。这并不意味着Heroku不能提供其他机制来调用代码包的编译,比如通过Heroku CLI命令。尽管如此,因为没有人提到这样的命令,所以我认为您的答案至少目前是准确的。谢谢! - Nathan
1
@Nathan 也许你可以向Heroku支持团队询问通过Heroku Toolbelt触发slug编译的方法?如果他们同意了,就添加另一个答案吧! - culix
1
对我来说,当我在一个js文件中有一个新的ENV值用于设置,并将其编译到Rails应用程序.js中时,这个解决方案并没有起作用。需要向js文件提交一个空格并进行推送,才能使资产重新编译。 - Josh Diehl
1
heroku-repo插件看起来不错,但是在尝试后我不建议使用它。存在一个严重的bug:它忽略了--app标志。这导致我意外地重建了我们的生产环境,而我本意是要重建staging。这个bug已经存在于repo中超过一年了,但没有解决方案。我已经卸载了这个插件。 - jasoncrawford
请注意,自此发布以来,命令可能已更改。我刚尝试了一下,但它一直给我返回“! `repo:rebuild`不是Heroku命令。”然后,在确保插件已安装的情况下查看了“repo”的帮助文档,我认为新命令(虽然不确定)是“heroku repo:purge_cache -a appname”。 - omnidan
13
在插件中,“repo:rebuild”不再是有效的命令,可以在这里看到:https://github.com/heroku/heroku-repo/commit/fb1306de5813dffadc046e82cd327175ca58c44b - blindstuff

34

我的一般做法是:

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

在没有确信的情况下,我不确定是否要在生产环境中执行此操作,因为它在技术上重写了最后一次提交,但理论上不应该会引起任何问题。然而,在测试阶段测试时完全没问题。

另外的一个好处是,由于大多数人都有问题使用 Vim 来编辑提交信息,SHIFT-ZZ将快速保存并退出提交信息,而不对其进行任何更改。

顺便提一下,我略微震惊于 Heroku 还没有这个功能。我经常看到 Heroku 由于他们端的问题而无法部署。

感谢 Michael Mior 提出使用 -C HEAD 来避免打开编辑器的想法。


3
可以使用 git commit --amend -C HEAD 命令来避免打开编辑器,并保持提交信息不变。 - Michael Mior
谢谢@MichaelMior,这对我非常有用,而且没有影响到我的git历史记录。 - James Ward
2
这里需要注意的一件事是,如果您有一个不同的中央仓库(除了Heroku),那么如果您已经推送了最后一个提交,下次拉取时将会导致合并/重复提交历史记录。 - Nick F
为什么这么反用户? - Lucke

24

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

purge_cache sounds way more scary than just pushing an empty commit, This will delete the contents of the build cache stored in the repository. This is done inside a run process on the application. - jmunsch
要卸载插件,请运行以下命令:heroku plugins:uninstall heroku-repo - Flimm

16

3
在另一个帖子上已经评论过了,但在这里重复一下:heroku-repo插件看起来不错,但在尝试后我不建议使用它。有一个严重的错误:它会忽略--app标志。这导致我在想要重建staging环境时意外地重建了我们的生产环境。这个bug已经存在于repo中超过一年,但没有得到解决。我已经卸载了这个插件。 - jasoncrawford
6
目前的 heroku-repo 版本没有 rebuild 子命令。 - Mike Slinn
我必须重置远程仓库,因为重建命令无法工作。 - Vaibhav Jain
1
你更新了代码并且说它可以使用“构建API”,但我不是很理解它的工作原理...能帮忙解释一下吗? 我需要发送一个HTTP POST请求到API来重新构建我的应用程序吗?发送到哪个API?还需要一个令牌(出于安全考虑)吗? - Dam Fa

9

4
这方面有一个Heroku插件可供使用,具体可以参考此处
$ heroku plugins:install heroku-releases-retry
Installing plugin heroku-releases-retry... done
$ heroku releases:retry
Retrying v16 on ⬢ murmuring-lowlands-3398... done, v17

6
在发布失败后,这将重试发布。它不会重试构建失败的情况。 - Jeremy

2
如果您的应用程序已连接到仓库,则只需:
  1. 打开 部署 选项卡并滚动到底部
  2. 手动部署 下点击 部署分支

如何手动部署分支


2

Heroku并没有提供方便的方式,但是如果你进入到应用程序界面,就可以通过Heroku控制台找到。选择“Deploy”选项卡,然后向下滚动页面,你会看到一个标题为“Manual deploy”的部分。在输入框中输入你的分支名称,然后点击“Deploy Branch”按钮即可。


1
我必须集成Github以显示该选项。 - sennett

-4

删除该分支,然后重新推送即可,无需使用插件。

git push heroku :master
git push heroku master

推送被拒绝,无法删除主分支。 - skalee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接