我希望my Heroku app(Play / Scala,在Heroku Cedar上运行)的运行时能够向我报告构建它的git提交。 Heroku应用程序通常由Heroku基础架构上的slug编译器构建 - 不幸的是,slug编译器将这个作为此构建过程的早期部分:
删除未使用的文件,包括.git目录,.gitmodules文件, log和tmp中的任何内容,以及顶级中指定的任何内容 .slugignore文件。
...所以Git信息不再可用于我用来记录Git提交的sbt-buildinfo
插件。
如何在slug中记录HEAD提交?这个信息是否有可用的环境变量?
答案 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-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嵌入到您应用的配置文件中。