无需推送或配置更改即可重新编译Heroku插件


147

我想知道是否有一种方法可以强制Heroku在不推送新提交和/或不更新配置变量的情况下重新编译该段代码。

我为什么要这样做?:

我将Heroku上的Cedar堆栈用于Rails 3.2应用程序,并且我遇到了rake assets:precompile任务失败的问题(仅在编译期间---稍后它可以正常使用heroku run)。我高度怀疑这是由于在段编译期间某些环境变量不可用,我认为heroku labs:enable user_env_compile实验功能将解决此问题。

但是,user_env_compile启用该功能后,配置更改不会触发该段代码的重新编译,并且我的代码也没有更改,因此我没有要推送的任何新提交。

当然,我可以通过简单的更改来推动“虚拟”提交,这可能是最简单的答案---但我想知道是否存在一个heroku命令可以直接重新编译该段代码。

谢谢!


1
heroku CLI客户端中没有任何内容?
马特·鲍尔

这不是一个直接的答案,但是记录依赖项更改(如依赖SAAS功能等)总是明智的。我的建议是在CHANGELOG中添加一个条目,以提及您现在依赖此功能,并推动该更改以触发对它的重建。 sl
patcoll 2013年

Answers:


93

Slug编译是使用git pre-receiveve钩子调用的,因此,重新编译的唯一方法是推送新的提交。

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


23
感谢您的回答。的确,一个git pre-receive钩会编译该段代码。(例如,请参阅:devcenter.heroku.com/articles/slug-compiler)。这并不一定意味着heroku不(或不能)提供替代机制来调用slug编译,例如heroku CLI命令。就是说,没有人提到这样的命令,所以我想至少在现在,您的答案是正确的。谢谢!
内森

1
@Nathan也许您可以向Heroku支持寻求通过Heroku Toolbelt触发段编译的方法?如果他们愿意,请添加另一个答案!
culix 2012年

7
现在有一个解决方案。在Heroku的回购附加
Refael阿克曼

仅供参考,对于我来说,当我在js文件中有一个设置的新ENV值被编译到Rails application.js中时,此解决方案不起作用。花费了一定的空间给js文件,然后推动使资产实际重新编译。
2014年

12
repo:rebuild不再是插件中的有效命令,如此处所示:github.com/heroku/heroku-repo/commit/…–
blindstuff

234

目前,最简单的解决方法是推送一个空的commit

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

53
您可以执行此操作,并通过在之后强制推动上一个提交来保持干净的提交历史git reset HEAD~; git push -f heroku master。产生另一个Heroku部署的时间成本,但清除历史记录FTW。
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

30

我的一般方法是:

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

不能确定我是否会在生产中执行此操作,因为它确实会重写上一次提交,但理论上不会引起任何问题。但是,当您在暂存阶段测试事物时,它非常好。

作为额外的好处,因为大多数人在使用Vim编辑提交消息时SHIFT-ZZ会遇到问题,因此可以快速为您保存并退出提交消息,而无需对其进行任何更改。

在相关说明中,我对Heroku仍然没有此功能感到有些震惊。我经常看到Heroku最终由于问题而无法部署。

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


2
或者只是git commit --amend -C HEAD为了避免完全打开编辑器并保持提交消息不变。
Michael Mior 2014年

谢谢@MichaelMior,这对我非常有用,并且与我的git历史无关。
詹姆斯·沃德

这里要注意的一件事是,如果您有一个不同的中央存储库(除了heroku)。如果是这样,这将导致下次您拉出(如果您已经推送了最后一个提交)时,提交在历史记录中的合并/重复。
Nick F

为什么这么反用户?
幸运


15

更新: heroku repo:rebuild已被删除

Heroku有一个您可以使用的Build API,请参阅:构建和发布使用该API


如果安装了heroku-repo,则可以使用repo:rebuild命令。

heroku repo:rebuild -a appname

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


3
刚刚也评论了另一个线程,但是值得在这里重复:heroku-repo插件看起来不错,但是尝试之后我推荐它。有一个严重的错误:它忽略--app标志。当我打算重建阶段时,这导致我意外地重建了生产环境。此错误已针对存储库开放了一年多了,没有任何解决方法。我已经卸载了此插件。
jasoncrawford

6
当前版本的heroku-repo没有rebuild子命令
Mike Slinn

我必须重置远程
仓库,

您进行了更新,并说它可以与“ Build API”一起使用,但是我不太了解它的工作原理。有什么帮助吗?是否需要向API发送HTTP POST请求以重建应用程序?其中上 ?有令牌(出于安全原因)?
Dam Fa


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

将导致“推送被拒绝,无法删除主分支”。
skalee 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.