7

我在 Heroku 上托管了一个开发分支,我们有几个人使用这个分支来查找错误,最好显示最新部署在 Heroku 上的提交的 SHA-1 哈希,以便我们知道哪些错误属于对哪个提交。

但我根本找不到任何方法来找到这些信息。heroku 运行控制台中的 ENV 变量中没有任何内容。虽然“heroku 版本”确实显示了一个部署信息列表,包括 SHA-1 哈希的前几个字符,这让我认为 Heroku 必须将它存储在某个地方,但我就是找不到位置。有人知道吗?

我意识到我并没有真正把问题说得清楚:我的意思是在 Heroku 上的 Rails 中找到 SHA-1 哈希。就像我可以做这样的事情:

<h1><%= ENV['REV']</h1>

谢谢你!

4

3 回答 3

10

像对待任何其他远程 Git 存储库一样对待 Heroku - 你可以使用git ls-remote

git ls-remote heroku

heroku这里是远程名称)

更新:

由于 OP 实际上希望在 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 var。

接下来,在 中找到compile方法ruby.rb,并将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 将收到更改,然后看到您设置了自定义 buildpack url。所以它会从 GitHub 获取你的自定义 buildpack,然后使用它来创建 slug。这意味着一旦它运行完所有默认编译命令,它将以您的get_sha方法结束,该方法应将 ENV var 设置SHA为适当的 SHA。现在您应该可以从 Ruby 中访问该 ENV 变量,以按照您的意愿进行操作。

于 2012-06-11T00:13:42.207 回答
3

您可以使用 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>

缺点是您需要在某处(在您的应用程序或 Heroku 环境中)存储登录名/密码组合(或 API 密钥)。

您还可以使用部署挂钩来获取此信息:https ://devcenter.heroku.com/articles/deploy-hooks

于 2012-06-11T02:29:53.573 回答
1

我最终为此使用了Heroku 平台 API gem。这是一个很大的冗长,但是被记住了,所以每次部署你只需要这样做一次,并且可以避免使用自定义构建包(繁琐)和部署钩子(不安全):

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
于 2014-11-26T15:26:27.823 回答