Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Git Heroku应用程序的运行时能知道吗';什么是提交id?_Git_Heroku_Cedar_Sbt Buildinfo - Fatal编程技术网

Git Heroku应用程序的运行时能知道吗';什么是提交id?

Git Heroku应用程序的运行时能知道吗';什么是提交id?,git,heroku,cedar,sbt-buildinfo,Git,Heroku,Cedar,Sbt Buildinfo,我希望(Play/Scala,在Heroku Cedar上运行)的运行时能够向我报告它是从哪个git commit构建的。Heroku应用程序通常由slug编译器在Heroku的基础设施上构建-不幸的是,slug编译器将此作为构建过程的早期部分: 删除未使用的文件,包括.git目录、.gitmodules文件, 日志和tmp中的任何内容,以及顶级 .slug忽略文件 …所以我用来记录Git提交的插件不再可以使用Git信息 如何在slug中记录头部提交?是否有可用于此信息的环境变量?在代码上运行,

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

删除未使用的文件,包括.git目录、.gitmodules文件, 日志和tmp中的任何内容,以及顶级 .slug忽略文件

…所以我用来记录Git提交的插件不再可以使用Git信息


如何在slug中记录头部提交?是否有可用于此信息的环境变量?

在代码上运行,并将头部SHA嵌入到应用程序的配置文件中。

三个不同的选项,最好先

SOURCE\u VERSION
环境变量(构建时间) 从2015年4月1日起,有一个
SOURCE\u版本
环境变量可用于在Heroku上运行的构建。对于git推送生成,这是正在生成的源的git commit SHA-1:

(感谢@srtech for!)

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

内容如下所示:

{
   "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自己发布的插件。这意味着不再通过git push进行部署(在Heroku自己的基础设施上编译slug),而是在本地编译slug并将其直接上传到Heroku。因为slug是在本地编译的,所以在我的工作repo中,Git信息都在那里,构建过程可以将其编译并嵌入到应用程序的代码中


slug的大小远远大于Git diff(90MB vs 0.5KB),但除此之外,该解决方案运行良好。实际上,我使用Travis进行连续部署,因此Travis为我做了一些工作(Git提交id在构建时可在该环境中使用),这意味着我可以在移动时从笔记本电脑上推Git,Travis将向Heroku上传大量slug。

你可以在回购协议中设置一个签出后挂钩,将id记录在不会被删除的地方。若要在克隆/init时自动获取,请将其放在模板repo中。@jthill我不确定是否理解-克隆存储库时不会复制客户端挂钩,那么它们将如何进入slug编译器。。。除了应用程序代码所在的地方之外,你说的“模板回购”是指什么?当你执行
git init
git clone
git从某个模板目录复制初始内容时,模板是git的一项功能。例如,默认模板中有示例挂钩。因此,无论slug编译器正在清理哪些创建repo的过程,它都在对内容进行签出。使流程使用的回购模板具有所需的签出挂钩。Heroku始终运行主提示。如果您
git pull
,然后在
git reflog
中找到顶部条目,您将拥有提交id。未经测试,但我认为您可以使用平台api()首先获取最新版本,从中可以获取slug id。然后获取有关slug的信息,从中可以获取提交id。类似于@jthill的解决方案,我认为这需要重写Heroku运行的slug编译器,以确保克隆的repo中存在“过滤器”——从您的回答中的链接可以看出:“但是,您必须小心,因为.gittributes文件是提交的,并随项目一起传递,但驱动程序(在本例中为dater)除外。”现在,这个
/etc/heroku/dyno
文件(仍然是alpha格式)可以通过
heroku实验室:enable runtime dyno metadata
命令启用。另外(刚刚注意到),当您启用该参数时,您还将得到几个预填充的环境变量,包括保存完整SHA值的HEROKU\u SLUG\u COMMIT。对我来说,它看起来比json文件更容易访问。