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

ttp71kqs  于 9个月前  发布在  其他
关注(0)|答案(9)|浏览(60)

每次我把我的应用程序推到heroku我看到的线

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

有没有一种方法可以让这个版本号在应用程序中显示出来,这样其他人就可以看到这个版本号?

xnifntxz

xnifntxz1#

为什么要依赖于在 * 每次 * 推送后运行命令?公认的答案比自己设置配置更糟糕。
添加到您的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
  • 现在 * 它是完全自动化的。你可以忘记它,继续开发你的应用程序。
uhry853o

uhry853o2#

现在可以尝试Roberto在回答中提到的Heroku功能,而无需联系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
...

注意:通过Heroku Labs添加的功能是实验性的,可能会发生变化。
我们不需要设置任何配置文件或其他。

lpwwtiir

lpwwtiir3#

everypush之后,运行(假设是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}')
j8ag8udp

j8ag8udp4#

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

g52tjvyc5#

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

heroku releases --app <YOUR_APP_NAME>

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

ygya80vv

ygya80vv6#

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

require 'heroku'

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

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

tyg4sfes

tyg4sfes7#

我正在使用Codeship,所以我计划将其添加到推送配置中:
heroku config:add HEROKU_RELEASE_VERSION=$(heroku releases | head -2 | awk 'NR==2' | awk '{print $1}')
请注意,另一个类似的答案是无效的,因为它是抓住一些后来的版本(它使用尾部而不是头部),并试图将其设置为两个版本,而不是一个(即:v100 \n v101)。

zphenhs4

zphenhs48#

在Node.js中使用JavaScript fetch(以及即将推出的javascript/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。

a64a0gku

a64a0gku9#

遵循@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

相关问题