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

时间:2012-01-09 17:41:20

标签: git ruby-on-rails-3.1 heroku

每次我将我的应用程序推送到heroku时,我都会看到

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

有没有办法在应用中创建该版本号,以便其他人可以看到该号码?

9 个答案:

答案 0 :(得分:37)

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

而是添加到您的Gemfile:

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

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

答案 1 :(得分:17)

现在可以在没有联系Heroku的情况下尝试Roberto在他的回答中写的Heroku功能。它被称为Heroku Labs: Dyno Metadata,您可以通过

启用它
heroku labs:enable runtime-dyno-metadata -a <app name>

然后信息可用(在下次部署时)作为环境变量:

~ $ 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
...

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

答案 2 :(得分:7)

每个 push之后,运行(假设bash shell):

heroku config:add rel=$(heroku releases | tail -2 | awk '{print $1}')

然后,您只需从应用中访问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}')

答案 3 :(得分:4)

我遇到了同样的问题,并通过部署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

答案 4 :(得分:1)

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

heroku releases --app <YOUR_APP_NAME>

你可以通过你应用程序中的Heroku gem来做到这一点,但这可能比它的价值更麻烦。

答案 5 :(得分:1)

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

require 'heroku'

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

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

答案 6 :(得分:0)

我正在使用Codeship,所以我打算将其添加到push config:

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

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

答案 7 :(得分:0)

在Node.js中使用JavaScript fetch(以及即将发布的async / await),您可以使用以下代码执行此操作(无需推送钩子!):

const fetch = require('node-fetch');
const url = 'https://api.heroku.com/apps/myapp/releases';
const headers = {
    Accept:        'application/vnd.heroku+json; version=3',
    Authorization: 'Basic '+base64Encode(':'+process.env.HEROKU_API_TOKEN)
};
const response = await fetch(url, { headers });
const releases = await response.json();
const lastRelease = releases[releases.length-1];
const version = lastRelease.version;
const created = lastRelease.created_at;

使用

function base64Encode(str) {
    return new Buffer(str, 'binary').toString('base64');
}

请注意这需要

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

请参阅devcenter.heroku.com/articles/platform-api-reference#release-list

答案 8 :(得分:0)

关注@jassa - 但使用更新的PlatformAPI

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