无需更改代码即可重新部署 Heroku 应用

Posted

技术标签:

【中文标题】无需更改代码即可重新部署 Heroku 应用【英文标题】:Redeploy Heroku app without code changes 【发布时间】:2017-05-11 18:35:02 【问题描述】:

我想部署一个 Heroku 应用程序,最好使用 git push -u heroku master 来完成。但是,这只有在有任何待处理的提交被推送到 master 时才有效。

在没有推送的情况下如何重新部署应用程序?我试过git push -u heroku master -f,下面还是一样

Branch master set up to track remote branch master from heroku.
Everything up-to-date

PS:我也想保留现有的应用程序,这意味着我不能使用这个答案https://***.com/a/22043184/968442

【问题讨论】:

这听起来像XY problem。您希望通过再次重新部署相同的代码来实现什么? 我更改了几个配置变量的情况,值得重新部署但没有提交 Setting a config var 导致您的应用程序重新启动。无需重新部署即可生效。你能说得更具体点吗? 不幸的是,我删除的 configvar 是 DISABLE_COLLECTSTATIC=1,它应该调用另一个 Django 命令 manage.py collectstatic,该命令与 heroku 部署逻辑挂钩。 【参考方案1】:

通常设置配置变量会导致您的应用程序重新启动。在大多数情况下,执行此操作后无需重新部署。

如果你真的需要触发一个新的部署,你可以添加一个新的空提交,然后再次推送到 Heroku:

git commit --allow-empty -m "Trigger Heroku deploy after enabling collectstatic"
git push heroku master

新的空提交是常规提交。它有一个哈希、一个作者、一个时间戳等。它将与它的父级具有相同的树。这应该会导致 Heroku 使用与上一次提交相同的代码再次构建您的应用程序 slug。

这有点尴尬,但确实有效。

【讨论】:

听起来很公平,也能胜任。现在我很想备份/恢复存储库(.git)以从 github 隐藏此提交。 即使是git commit --allow-empty,我也收到了来自 Heroku 的 Everything up-to-date... 啊,我明白了!我在不同的本地分支机构(而不是master)。所以我不得不执行:git push -f heroku the_branch_i_changed:master. 只做git commit --amend; git push heroku master -f而不做实际的改变,除非你对重写公共分支历史有严格的规定。 我的 JS 资产是在部署过程中构建的,它们依赖于 ENV 变量。因此,即使我在设置 ENV var 时重新启动了我的应用程序,除非我进行部署,否则我的 JS 也不会重建。 ...只是指出这一点,因为有一些合法的场景需要重新部署【参考方案2】:

你也可以从 UI 中做到这一点!

    登录您的Heroku 仪表板并转到deploy 部分 找到Manual deploy选项

点击Deploy Branch按钮!

注意:您必须将您的应用连接到 GitHub 才能使用此选项(请参阅下面 Derek 的评论)。

【讨论】:

值得注意的是,您必须将应用连接到 GitHub 才能使用此选项。如果您使用 Heroku Git 部署方法而没有将应用程序连接到其 GitHub 存储库,那么如何手动部署并不是很明显。 同意,但这是合理的,heroku仪表板,单击部署选项卡,单击连接到github按钮,在搜索字段中输入您的github repo,确认并连接。我相信连接后它会在推送时自动部署。 使用 Heroku Git 部署需要将master 分支重命名为main 分支以允许手动部署【参考方案3】:

现在还有一个 Heroku 命令行插件,可让您重新发布最近部署的 slug。

见https://www.npmjs.com/package/heroku-releases-retry

【讨论】:

一开始我以为这是解决方案,但实际上它只做redploy而不是rebuild。但是还有一种方法可以通过推送新的提交来重建而不污染 Git 历史:***.com/q/9713183/322863 Python 项目与 npm 有什么关系?【参考方案4】:

您可以运行heroku restart --app app_name,一切顺利。

【讨论】:

这不会重建应用程序,只会重新启动它 @PanMan 问题是“我怎样才能在没有推送的情况下重新部署应用程序?”。它不是要求重新构建应用程序,而是要求重新启动,并且鉴于没有任何更改,我不明白您为什么要这样做。 它清楚地说“重新部署”而不是“重新启动”。例如,我需要重新部署(而不是重新启动),因为我正在尝试使用 Heroku 对我的应用程序进行 Docker 化,并且在调试时,我不想潜在地污染我的 git 树。这就是我最终解决这个 SO 问题的方式。【参考方案5】:

事实证明,Heroku 有一个名为 heroku release retry 的简洁插件,可让您重试上次部署,而无需向存储库添加错误提交。

// install plugin
heroku plugins:install heroku-releases-retry
// retry release
heroku releases:retry --app your-app

来源:https://www.darraghoriordan.com/2019/03/02/heroku-push-failed-force-rebuild

【讨论】:

以上是关于无需更改代码即可重新部署 Heroku 应用的主要内容,如果未能解决你的问题,请参考以下文章

在 Heroku 上进行热部署,无需停机

客户端IP不同,heroku中的每个页面重新加载

更改文件 json 中的其余 API 而无需重新部署

Postgres 和 Docker 在文件更改时重新部署

在 Heroku 上,在实例已经使用更改的模型代码重新启动后,Django syncdb / South 迁移是不是存在危险?

无需重启服务器即可更改静态内容(html、css、JS) Wildfly 8