但我根本找不到任何方法来获取这些信息。在Heroku运行控制台中没有环境变量。尽管"heroku releases"会显示部署信息列表,包括SHA-1哈希的前几个字符,这让我想Heroku一定在某个地方存储它,但我就是找不到。有人知道吗?
我意识到我没有清楚地提出问题:我的意思是在Heroku上的Rails中找到SHA-1哈希。就像我可以做这样的事情:
<h1><%= ENV['REV']</h1>
谢谢您!
<h1><%= ENV['REV']</h1>
谢谢您!
将 Heroku 视为任何其他远程 Git 存储库 - 您可以使用 git ls-remote
:
git ls-remote heroku
(这里的 heroku
是远程名称)
更新:
由于原帖实际上是要在 Ruby 环境中获取 SHA,一种可能的方法是使用自定义 Buildpack。
要开始,前往Heroku 的 Ruby Buildpack并 fork 它以便您可以制作自己的变体。现在克隆您的 fork 并查看lib/language_pack/ruby.rb
。添加一个新方法,例如:
def get_SHA
#get SHA
#save SHA to ENV, ala: ENV['SHA'] = retrieved_sha
end
如何获取SHA就取决于你了。你可以执行一个git命令并使用返回的结果:
git log -1 --format="%H"
或者你可以使用@avaynshtok的建议,使用Heroku gem使用releases
方法。
然后,一旦你有了SHA,将其设置为ENV变量。
接下来,在ruby.rb
中找到compile
方法,并在其末尾添加get_sha
方法:
def compile
Dir.chdir(build_path)
install_ruby
setup_language_pack_environment
allow_git do
install_language_pack_gems
build_bundler
create_database_yml
install_binaries
run_assets_precompile_rake_task
get_sha #your additional method
end
end
将更改推送回 GitHub,然后前往命令行。您需要为 Heroku 应用程序添加一个新的配置变量:
heroku config:add BUILDPACK_URL=git@github.com:<your GitHub username>/heroku-buildpack-ruby.git
请注意,您需要确保已将<your GitHub username>
替换为您自己的 GitHub 用户名,以便指向您分叉的存储库。
最后,执行一个启用 Heroku 实验功能 的命令,该功能允许 slug 编译器访问用户变量:
heroku labs:enable user_env_compile
现在,您应该已经准备好了。那么现在会发生什么呢?当您推送到 Heroku 时,Heroku 将接收更改,然后看到您设置了自定义构建包 url。因此,它将从 GitHub 获取您的自定义构建包,然后使用它来创建 slug 。这意味着一旦它运行完所有默认编译命令,它将以您的 get_sha
方法结束,该方法应将 ENV 变量 SHA
设置为适当的 SHA。现在,您应该可以从 Ruby 中访问该 ENV 变量,并根据需要使用它。
heroku addons:add deployhooks:http url=http://yourapp.com/deployhookroute
。当该路由接收到POST时,它可以将该信息设置为整个应用程序可用。唯一的缺点是,恶意人员可能会欺骗信息,因此如果需要锁定和安全,这可能不是最佳选择。如果您愿意,我也可以更新我的答案。 - redhotvengeancegit ls-remote heroku
并不能总是给出生产实例正在运行的提交。在回滚后会出现问题。在运行 heroku releases:rollback v42
后,git ls-remote heroku
的输出与回滚之前相同,尽管这不是 Heroku 上当前生产环境中的提交。 - Flimm您可以使用Heroku gem来获取发布信息:https://github.com/heroku/heroku
c = Heroku::Client.new <LOGIN>, <PASSWORD>
c.releases(<APPNAME>).last['commit']
或者,您可以使用您的API密钥进行身份验证:
c = Heroku::Client.new '', <API_KEY>
def current_sha
@current_sha ||= begin
heroku = PlatformAPI.connect_oauth(ENV['HEROKU_TOKEN'])
slug_id = heroku.release.list(ENV['HEROKU_APP']).last["slug"]["id"]
heroku.slug.info(ENV['HEROKU_APP'], slug_id)["commit"]
end
end