【问题标题】:heroku console show the latest sha hash from git deploymentheroku 控制台显示来自 git 部署的最新 sha 哈希
【发布时间】:2012-06-13 23:00:47
【问题描述】:

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

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

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

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

谢谢!

【问题讨论】:

  • 我要问为什么?你说`我们有几个人使用这个分支来寻找错误`我不是想拖钓,但想知道为什么你不会在 dev 中分支错误,上传它供其他人查看,然后合并一次“批准”或您有任何理由让他们查看 heroku 中的特定分支,而不是在他们自己的开发机器上。
  • 没问题,我不认为这是拖钓——也许我的方法没有得到最佳思维的支持,但如果他们只在本地机器上测试应用程序,我只是可以不要以为它会在 Heroku 上以完全相同的方式工作。
  • 但这就是暂存环境的用途,对吧?你有多少人在代码中乱七八糟?我的意思是,如果有一个错误,一个人从 master 分支,修复它,更新 staging。你批准它。然后您合并到 master 并推送到生产环境。都让你睡一觉。
  • 两个,他们不在代码里乱搞,只做表面测试。

标签: ruby-on-rails git heroku


【解决方案1】:

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

git ls-remote heroku

heroku 这里是远程名称)

更新:

由于 OP 实际上希望在 Ruby 环境中获取 SHA,一种可能的方法是使用 custom buildpack

要开始使用,请转到 Heroku's 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。

接下来,在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:&lt;your GitHub username&gt;/heroku-buildpack-ruby.git

请注意,您需要确保已将 &lt;your GitHub username&gt; 替换为...嗯,您的 GitHub 用户名,因此您指向的是您的分叉存储库。

最后,执行一个启用Heroku labs feature 的命令,该命令允许 slug 编译器访问用户变量:

heroku labs:enable user_env_compile

现在你应该准备好了。那么现在到底发生了什么?好吧,当您推送到 Heroku 时,Heroku 将收到更改,然后看到您设置了自定义 buildpack url。所以它会从 GitHub 获取你的自定义 buildpack,然后使用它来创建 slug。这意味着一旦它运行完所有默认编译命令,它将以您的 get_sha 方法结束,该方法应将 ENV var SHA 设置为适当的 SHA。现在,您应该可以从 Ruby 中访问该 ENV 变量了,按照您的意愿去做。

【讨论】:

  • 对不起我不清楚的问题。我要在 Rails 中找到这些信息
  • 啊,好吧,这有点改变。我不认为有任何内置的 Heroku 功能,但如果你在 Cedar 上,那么你可以 fork Ruby/Rails buildpack 并自己设置一个 ENV。
  • 我明白了。太糟糕了,我真的希望他们会在某个地方存储 SHA。我的意思是,它是从“heroku 发布”命令中检索到的,这表明他们在 somewhere ... 中找到了它
  • 是的,但是您正试图从您的 Ruby 服务器中访问该信息,该服务器在一个隔离的 slug 中运行,而不是从 repo 中。因此,除非 Heroku 手动将该信息传递给服务器本身(我对此表示怀疑),否则它不会存在。不过,您可以通过在 slug 编译期间使用自定义 buildpack 并设置 ENV var 来自己完成。如果您愿意,我可以更新我的答案并提供更多详细信息。
  • 另外,@avaynstok 提到了部署挂钩 - 也可以创造性地利用。您可以在您的应用程序中设置一个简单的 Web api 路由来接收 POST,然后在您的应用程序上启用部署挂钩:heroku addons:add deployhooks:http url=http://yourapp.com/deployhookroute。当该路由收到 POST 时,它可以设置该信息可用于应用程序的其余部分。唯一的缺点是恶作剧的人可能会欺骗信息,因此如果需要将其锁定和保护,这可能不是最佳选择。如果你愿意,我也可以用这个更新我的答案。
【解决方案2】:

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

【讨论】:

  • 钩子和客户端看起来都很有希望,我将使用 buildpack,因为它的构建似乎比我之前想象的要轻松得多,而且看起来拥有 ENV 变量可以避免调用Heroku 客户端每次想要查看 SHA(我打算像邮票一样放在每一页上)。尽管部署挂钩将通过将其存储在某个数据库表中来消除这种情况。因此,如果 buildpack 不起作用,我可能不得不求助于这个。谢谢 Avaynshtok
【解决方案3】:

我最终为此使用了Heroku platform 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

【讨论】:

  • 这确实是一个很棒的建议。我发现 Heroku 的 HTTP 部署钩子偶尔会很脆弱。
  • 这没有给我正确的提交。它返回一个简短的 sha,但我不确定它是什么,并且它不会在重复调用时更新。为发布列表定义的“last”方法在哪里?
  • 问题是这只在你有少于 200 个 git 提交的情况下才有效! discussion.heroku.com/t/…。 200 之后,您每次都获得相同的版本!必须以某种方式更有效地要求最后一个版本。
猜你喜欢
  • 1970-01-01
  • 2014-05-11
  • 2010-12-26
  • 2021-09-01
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 2015-05-03
  • 2014-08-19
相关资源
最近更新 更多