【问题标题】:Can the runtime of a Heroku app know it's commit id?Heroku 应用程序的运行时可以知道它的提交 id 吗?
【发布时间】:2014-12-27 13:28:00
【问题描述】:

我希望my Heroku app(Play/Scala,在 Heroku Cedar 上运行)的运行时能够向我报告它是从哪个 git commit 构建的。 Heroku 应用程序通常由 slug 编译器在 Heroku 的基础架构上构建 - 不幸的是,slug 编译器将 this 作为此构建过程的早期部分:

删除未使用的文件,包括 .git 目录、.gitmodules 文件、 log 和 tmp 中的任何内容,以及顶级中指定的任何内容 .slugignore 文件。

...所以 Git 信息不再可用于我用来记录 Git 提交的 sbt-buildinfo 插件。

如何在 slug 中记录 HEAD 提交?是否有包含此信息的环境变量?

【问题讨论】:

  • 您可以在 repo 中放置一个结帐后挂钩,将 id 记录在不会被删除的地方。要在克隆/初始化时自动获取它,请将其放入模板存储库中。
  • @jthill 我不确定我是否理解 - 克隆存储库时不会复制客户端挂钩,那么它们将如何进入 slug 编译器? git-scm.com/book/en/v2/… ...你的意思是“模板仓库”的特殊含义,除了它是应用程序代码所在的地方吗?
  • 模板是 git 功能,当您执行 git initgit clone 时,git 会从某个模板目录复制初始内容。例如,默认模板中包含示例挂钩。因此,无论创建那些 repos 的过程是 slug 编译器正在清理的,它也在对内容进行检查。使进程使用的 repo 模板具有您想要的结帐挂钩。
  • Heroku 总是跑在 master 的顶端。如果您 git pull 然后在 git reflog 中找到顶部条目,您将获得提交 ID。
  • 未经测试,但我认为您可以使用平台 api (devcenter.heroku.com/articles/platform-api-reference) 首先获取最新版本,从中获取 slug id。然后获取有关可以从中提取提交 ID 的 slug 的信息。

标签: git heroku cedar sbt-buildinfo


【解决方案1】:

三种不同的选择,最好先...

SOURCE_VERSION 环境变量(构建时间)

从 2015 年 4 月 1 日起,SOURCE_VERSION 环境变量可用于在 Heroku 上运行的构建。对于 git-push 构建,这是正在构建的源的 git commit SHA-1:

https://devcenter.heroku.com/changelog-items/630

(感谢@srtech 提供pointing that out!)

/etc/heroku/dyno 元数据文件(运行时)

Heroku 具有 beta 功能,可以将/etc/heroku/dyno 元数据文件写入正在运行的测功机上。如果您通过电子邮件发送支持,您可能会被添加到测试版中。这是 Heroku 自己使用它的地方:

https://github.com/heroku/fix/blob/6c8ab7a/lib/heroku_dyno_metadata.rb

内容如下:

{
   "dyno":{
      "physical_id":"161bfad9-9e83-40b7-b385-78305db2f168",
      "size":1,
      "name":"run.7145"
   },
   "app":{
      "id":null
   },
   "release":{
      "id":50,
      "commit":"2c3a0b24069af49b3de35b8e8c26765c1dba9ff0",
      "description":null
   }
}

..so release.commit 是您所追求的领域。

特定于 SBT:使用 sbt-heroku 在本地构建 slug

我最初的解决方案是使用 Heroku 自己发布的 sbt-heroku 插件。这意味着不再通过git push 进行部署(在 Heroku 自己的基础架构上编译 slug),而是在本地编译 slug 并将其直接上传到 Heroku。因为 slug 是在本地编译的,所以在我的工作 repo 中,Git 信息都在那里,构建过程可以easily identify the commit id 并将其嵌入到应用程序的代码中。

slug 的大小比 Git diff 大得多(90MB vs 0.5KB),但除此之外,该解决方案的效果还不错。我实际上是在使用 Travis 进行持续部署,因此 Travis 正在为我执行 sbt stage deployHeroku(构建时 Git 提交 ID 在该环境中可用),这意味着我可以在移动时从笔记本电脑上进行 git-push,并且Travis 会将大型 slug 上传到 Heroku。

【讨论】:

  • 目前,/etc/heroku/dyno 文件(仍处于 alpha 阶段)可以使用 heroku labs:enable runtime-dyno-metadata 命令启用。
  • 另外(刚刚注意到),当您启用该参数时,您还将获得几个预填充的环境变量,包括拥有完整 SHA 值的HEROKU_SLUG_COMMIT。对我来说,它看起来比 json 文件更容易访问。
【解决方案2】:

在您的代码上运行 checkout filter (also known as a "smudge"),并将 HEAD SHA 嵌入到您的应用的配置文件中。

【讨论】:

  • 与@jthill 的解决方案类似,我认为这需要覆盖 Heroku 运行的 slug 编译器,以确保克隆的存储库中存在“过滤器”-来自您答案中的链接:“您但必须小心,因为 .gitattributes 文件已提交并随项目一起传递,但驱动程序(在本例中为 dater)不是,因此它不会在任何地方都有效。”
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 2012-08-02
  • 2015-04-12
  • 2017-10-31
  • 1970-01-01
  • 2014-11-03
  • 2011-05-28
  • 1970-01-01
相关资源
最近更新 更多