Отражение версии Heroku в приложении

Каждый раз, когда я нажимаю свое приложение на героку, я вижу строку

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

Есть ли способ, чтобы номер версии появился в приложении, чтобы другие люди могли видеть это число?

Ответ 1

Почему вы хотите зависеть от запуска команды после каждого нажатия? Принятый ответ хуже, чем настройка конфигурации.

Вместо этого добавьте в свой 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

Теперь он полностью автоматизирован. Вы можете забыть об этом и продолжить работу над своим приложением.

Ответ 2

Теперь можно попробовать функцию Героку, о которой Роберто писал в своем ответе, не обращаясь к Героку. Он называется 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
...

Нам не нужно настраивать какой-либо файл конфигурации или еще.

Ответ 3

После каждого 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}')

Ответ 4

У меня была та же проблема, и я сделал это с помощью разворачивания 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

Ответ 5

AFAIK вы можете получить версию только через CLI:

heroku releases --app <YOUR_APP_NAME>

Вы можете сделать это через драгоценный камень Heroku из вашего приложения, но это, вероятно, больше проблем, что стоит.

Ответ 6

Вы можете сделать файл Ruby следующим образом:

require 'heroku'

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

Это возвращает документ JSON, содержащий тонну метаданных о ваших развертываниях, включая SHA, номер версии и т.д.

Ответ 7

Я использую Codeship, поэтому планирую просто добавить это в push-конфигурацию:

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

Обратите внимание, что другой аналогичный ответ недопустим, поскольку он захватывает некоторые из более поздних версий (он использует хвост вместо головы), и он пытается установить его в две версии вместо одного (то есть: v100 \n v101).

Ответ 8

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

Ответ 9

После ответа @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