Heroku应用程序的运行时是否可以知道它的提交ID?

时间:2014-10-31 09:16:11

标签: git heroku cedar sbt-buildinfo

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

  

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

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

如何在slug中记录HEAD提交?这个信息是否有可用的环境变量?

2 个答案:

答案 0 :(得分:4)

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

SOURCE_VERSION环境变量(构建时)

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

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

(感谢@srtech pointing that out!)

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

Heroku具有 beta 功能,可以在运行的dyno上写出/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
   }
}

..所以release.commit是你追求的领域。

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

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

slug的尺寸明显大于Git diff(90MB vs 0.5KB),但除此之外,该解决方案工作得相当好。我实际上是在使用Travis进行持续部署,因此Travis正在为我做sbt stage deployHeroku(Git commit id在构建时可以在该环境中使用),这意味着我可以从笔记本电脑上进行git-push此举,Travis将把大量的slug上传到Heroku。

答案 1 :(得分:0)

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