Отражая версию Heroku в приложении - PullRequest
24 голосов
/ 09 января 2012

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

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

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

Ответы [ 9 ]

37 голосов
/ 12 марта 2013

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

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

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

17 голосов
/ 25 августа 2016

Теперь можно попробовать функцию Heroku, о которой Роберто написал в своем ответе, не связываясь с Heroku.Она называется Heroku Labs: метаданные Dyno , и вы можете включить ее с помощью

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

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

7 голосов
/ 09 января 2012

После каждые 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}')
4 голосов
/ 12 апреля 2012

У меня была такая же проблема, и я сделал это с помощью HTTP-перехвата POST. По сути, логика заключается в том, что я создал определенный 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
1 голос
/ 03 мая 2012

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

require 'heroku'

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

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

1 голос
/ 09 января 2012

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

heroku releases --app <YOUR_APP_NAME>

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

0 голосов
/ 19 июля 2017

После ответа @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
0 голосов
/ 14 декабря 2016

В Node.js с использованием JavaScript fetch (и предстоящей асинхронной / ожидаемой) вы можете сделать это с помощью следующего кода (без push-зацепок!):

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 / article / platform-api-reference # release-list .

0 голосов
/ 24 августа 2016

Я использую Codeship, поэтому я планирую просто добавить это в конфигурацию push:версии (он использует хвост вместо головы) и пытается установить две версии вместо одной (то есть: v100 \n v101).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...