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

问题描述 投票:24回答:9

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

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

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

git ruby-on-rails-3.1 heroku
9个回答
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

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


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

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


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}')

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

1
投票

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

heroku releases --app <YOUR_APP_NAME>

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


1
投票

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

require 'heroku'

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

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


0
投票

我正在使用Codeship,所以我计划将其添加到push配置中:

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

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


0
投票

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

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


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
© www.soinside.com 2019 - 2024. All rights reserved.