Каждый раз, когда я нажимаю свое приложение на героку, я вижу строку
-----> Launching... done, v43
Есть ли способ, чтобы номер версии появился в приложении, чтобы другие люди могли видеть это число?
Каждый раз, когда я нажимаю свое приложение на героку, я вижу строку
-----> Launching... done, v43
Есть ли способ, чтобы номер версии появился в приложении, чтобы другие люди могли видеть это число?
Почему вы хотите зависеть от запуска команды после каждого нажатия? Принятый ответ хуже, чем настройка конфигурации.
Вместо этого добавьте в свой Gemfile:
gem 'heroku-api'
Добавьте свое имя приложения и ключ API в конфигурацию Heroku:
$ heroku config:add HEROKU_APP_NAME=myapp HEROKU_API_KEY=bp6ef3a9...
Затем config/initializers/heroku.rb
что-то вроде этого в 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 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
):
heroku config:add rel=$(heroku releases | tail -2 | awk '{print $1}')
Затем вы можете просто получить доступ к переменной среды rel
из вашего приложения.
В качестве альтернативы, если вы хотите представить дату push, который, 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}')
У меня была та же проблема, и я сделал это с помощью разворачивания HTTP 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 из вашего приложения, но это, вероятно, больше проблем, что стоит.
Вы можете сделать файл 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}')
Обратите внимание, что другой аналогичный ответ недопустим, поскольку он захватывает некоторые из более поздних версий (он использует хвост вместо головы), и он пытается установить его в две версии вместо одного (то есть: v100 \n v101
).
В Node.js с использованием JavaScript fetch
(и предстоящий async/await) вы можете сделать это со следующим кодом (без push hooks!):
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 - но используя более новую платформу PlatformI
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