在应用程序中反映Heroku推送版本
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在应用程序中反映Heroku推送版本相关的知识,希望对你有一定的参考价值。
每次我将我的应用程序推送到heroku时,我都会看到该行
-----> Launching... done, v43
有没有办法在应用程序中创建该版本号,以便其他人可以看到该号码?
为什么要在每次推送后依赖于运行命令?接受的答案比自己设置配置更糟糕。
而是添加到您的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
现在它完全自动化了。您可以忘掉它并继续使用您的应用程序。
现在可以在没有联系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
...
我们不必设置任何配置文件或其他。
在每个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}')
我有同样的问题,并通过部署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
AFAIK您只能通过CLI获取版本:
heroku releases --app <YOUR_APP_NAME>
你可以通过你的应用程序中的Heroku gem来做到这一点,但这可能是更值得的麻烦。
您可以创建一个Ruby文件来执行以下操作:
require 'heroku'
heroku = Heroku::Client.new('username','password')
puts heroku.releases('appname')
这将返回一个JSON文档,其中包含大量有关部署的元数据,包括SHA,版本号等。
我正在使用Codeship,所以我计划将其添加到push配置中:
heroku config:add HEROKU_RELEASE_VERSION=$(heroku releases | head -2 | awk 'NR==2' | awk '{print $1}')
请注意,其他类似的答案是无效的,因为它抓住了一些较新的版本(它使用tail而不是head),并尝试将其设置为两个版本而不是一个版本(即:v100
v101
)。
在使用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。
关注@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
以上是关于在应用程序中反映Heroku推送版本的主要内容,如果未能解决你的问题,请参考以下文章
Error-Bundler 找不到 gem“bundle”的兼容版本:在 Heroku 上推送项目时