Git 在应用程序中反映Heroku推送版本

Git 在应用程序中反映Heroku推送版本,git,ruby-on-rails-3.1,heroku,Git,Ruby On Rails 3.1,Heroku,每次我把我的应用程序推到heroku上,我都能看到这条线 -----> Launching... done, v43 是否有办法在应用程序中设置该版本号,以便其他人可以看到该版本号?AFAIK您只能通过CLI获取该版本: heroku releases --app <YOUR_APP_NAME> heroku发布的应用程序 您可以通过应用程序中的Heroku gem执行此操作,但这可能会带来更多麻烦。每次推送后,运行(假设使用bashshell): 然后,您可以从应用程序

每次我把我的应用程序推到heroku上,我都能看到这条线

-----> Launching... done, v43

是否有办法在应用程序中设置该版本号,以便其他人可以看到该版本号?

AFAIK您只能通过CLI获取该版本:

heroku releases --app <YOUR_APP_NAME>
heroku发布的应用程序 您可以通过应用程序中的Heroku gem执行此操作,但这可能会带来更多麻烦。每次推送
后,运行(假设使用
bash
shell):

然后,您可以从应用程序访问
rel
环境变量

或者,如果您想提供推送日期,IMO表示更具意义的信息:

heroku config:add rel=$(heroku releases | tail -2 | awk '{print $5,$6,$7}')
或者,我的最爱,其中包含日期和版本,没有空格:

heroku config:add rel=$(heroku releases | tail -2 | awk '{print $5"t"$6$7"."$1}')

我也遇到了同样的问题,并通过部署POST HTTP钩子解决了这个问题。基本上,逻辑是我在我的应用程序中创建了一个特定的URL,然后发布新的值来更新配置变量

我是用Python/Django实现的,但我相信同样的逻辑也可以用于其他语言:

import heroku
cloud = heroku.from_key(settings.HEROKU_API_KEY)
app = cloud.apps['mycoolapp']
latest_release = app.releases[-1]
app.config['RELEASE'] = latest_release.name
result['status'] = 200

您可以创建一个Ruby文件来执行以下操作:

require 'heroku'

heroku = Heroku::Client.new('username','password')
puts heroku.releases('appname')

这将返回一个JSON文档,其中包含大量关于部署的元数据,包括SHA、版本号等。

为什么要依赖于在每次推送之后运行命令?接受的答案比自己设置配置更糟糕

而是将以下内容添加到您的文件中:

gem 'heroku-api'
将应用程序名称和API密钥添加到Heroku配置:

$ heroku config:add HEROKU_APP_NAME=myapp HEROKU_API_KEY=bp6ef3a9...
然后在
config/initializers/heroku.rb
中放入类似的内容:

unless (app_name = ENV["HEROKU_APP_NAME"]).nil?
  require 'heroku-api'

  heroku  = Heroku::API.new(:api_key => ENV["HEROKU_API_KEY"])
  release = heroku.get_releases(app_name).body.last

  ENV["HEROKU_RELEASE_NAME"] = release["name"]
end
最后:

puts ENV["HEROKU_RELEASE_NAME"]
=> v42

现在它完全自动化了。您可以忘记它,继续使用您的应用程序。

我正在使用Codeship,因此我计划将其添加到推送配置中:

heroku-config:add heroku_-RELEASE_-VERSION=$(heroku-releases | head-2 | awk'NR==2 | awk'{print$1}')


请注意,另一个类似的答案是无效的,因为它获取了一些较新的版本(它使用尾部而不是头部),并尝试将其设置为两个版本,而不是一个版本(即:
v100\n v101
)。

现在可以尝试Roberto在回答中提到的Heroku功能,而无需联系Heroku。它被调用,您可以通过

heroku labs:enable runtime-dyno-metadata -a <app name>
heroku实验室:启用运行时动态元数据-a
然后这些信息(在下一次部署时)作为环境变量提供:

~ $ env
HEROKU_APP_ID:                   <some-hash-appId>
HEROKU_APP_NAME:                 example-app
HEROKU_DYNO_ID:                  <some-hash-dynoId>
HEROKU_RELEASE_VERSION:          v42
HEROKU_SLUG_COMMIT:              <some-hash-slugCommit>
HEROKU_SLUG_DESCRIPTION:         Deploy 2c3a0b2
...
~$env
HEROKU_应用程序_ID:
HEROKU_应用程序名称:示例应用程序
HEROKU_DYNO_ID:
HEROKU发布版本:v42
HEROKU_SLUG_提交:
HEROKU_段塞描述:部署2c3a0b2
...

我们不必设置任何配置文件或其他文件。

在Node.js中使用JavaScript
fetch
(以及即将推出的async/await),您可以使用以下代码(无推钩!):

使用

function base64Encode(str) {
    return new Buffer(str, 'binary').toString('base64');
}
注意这需要

$ heroku config:set HEROKU_API_TOKEN=\`heroku auth:token`.

请参见。

以下@jassa答案-但使用更新的平台API

if (app_name = ENV["HEROKU_APP_NAME"]).present? and ENV['HEROKU_API_KEY'].present?
  require 'platform-api'
  heroku = PlatformAPI.connect(ENV['HEROKU_API_KEY'], default_headers: {'Range' => 'version ..; order=desc'})
  released_at_s = heroku.app.info(app_name)['released_at']
  released_at_d = Time.parse(released_at_s).strftime('%Y-%m-%d')
  release = heroku.release.list(app_name).first
  deploy_v = release['description']
  version = release['version']
  ENV['HEROKU_RELEASE_NAME'] = "#{version} (#{deploy_v}) #{released_at_d}"
end

没错,但我的意思是自动的:)
copy/paste
不是程序员的朋友,自动化才是。请参阅以实现自动化。现在有一种方法可以使用Heroku labs功能自动完成此操作,而无需编写任何自定义代码。查看如何实现自动化。为什么需要进行设置更改?请参阅我的答案,其中包含一个简单的全局解决方案。你应该把我的回答看作是被接受的,如果它对你有用,也不需要额外的编码工作。我的答案如下:你可以使用链接,每次部署后你都需要这样做。这会导致你的应用程序重新启动以应用更改的配置。不是一个show stopper,而是需要注意的事情。添加/更改release配置变量是否会增加release version()?如果是这样,那么rel将始终落后于一个版本,并且日期将是上一个版本的日期。@Erik可能是这样。我没有注意到。我可能会在heroku发布的
中将脚本修改为+1,并使用
$(日期)
。这就是说,因为这只是一个配置更改,而不是代码更改(希望不会更改任何代码路径),所以就运行的代码而言,可以认为该版本是正确的。这是一个非常优雅的答案,比公认的答案更好。我唯一要改变的是API键也应该是配置的一部分,而不是硬编码的。请记住,这会将您帐户的API密钥公开给所有合作者,因此最好为此添加一个特定的合作者。一旦我意识到这只在Heroku上运行应用程序时才起作用,这就非常有效了。。。哼!我只是通过导航栏上的ENV[“HEROKU_RELEASE_NAME”]来查看。谢谢这个解决方案非常有效,但只是一个警告。您必须手动更新HEROKU_API_密钥。如果更改Heroku帐户的密码,则需要更新Heroku_API_密钥配置变量。今天早上,你会在启动时的日志中看到一个“提供的凭据无效”。我相信这已经被弃用,取而代之的是platformAPI。有一个版本可以与新的platformAPI一起使用:
heroku=platformAPI.connect\u oauth(ENV[“heroku\u API\u KEY]”)
release=heroku.release.list(app\u name).last
ENV[“HEROKU_RELEASE_NAME”]=“v#{RELEASE['version']}”
这是我最薄的实现,谢谢!
$ heroku config:set HEROKU_API_TOKEN=\`heroku auth:token`.
if (app_name = ENV["HEROKU_APP_NAME"]).present? and ENV['HEROKU_API_KEY'].present?
  require 'platform-api'
  heroku = PlatformAPI.connect(ENV['HEROKU_API_KEY'], default_headers: {'Range' => 'version ..; order=desc'})
  released_at_s = heroku.app.info(app_name)['released_at']
  released_at_d = Time.parse(released_at_s).strftime('%Y-%m-%d')
  release = heroku.release.list(app_name).first
  deploy_v = release['description']
  version = release['version']
  ENV['HEROKU_RELEASE_NAME'] = "#{version} (#{deploy_v}) #{released_at_d}"
end