每次我将我的应用程序推送到heroku时,我都会看到
行-----> Launching... done, v43
有没有办法在应用中创建该版本号,以便其他人可以看到该号码?
答案 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