2012-01-09 3 views
23

Za każdym razem, gdy wciskam aplikację Heroku widzę linięZastanawiając Heroku wersji Push w aplikacji

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

Czy istnieje sposób, aby to numer wersji apear w aplikacji, aby inni ludzie mogli zobaczyć ten numer?

+0

skopiować i wkleić :) – manojlds

+0

to prawda, ale mi chodziło :) –

+1

automagicznie 'kopiuj/paste' nie jest przyjacielem programisty, jest automatyzacja . Zobacz [moja odpowiedź] (http://stackoverflow.com/a/8793568/23056), aby zautomatyzować to. – nicerobot

Odpowiedz

37

Dlaczego chcesz polegać na prowadzeniu polecenie po co push? Przyjęta odpowiedź jest gorsza niż samodzielne ustawienie konfiguracji.

Zamiast dodawać do Gemfile:

gem 'heroku-api' 

Dodaj swoją nazwa aplikacji i API klucz do config Heroku:

$ heroku config:add HEROKU_APP_NAME=myapp HEROKU_API_KEY=bp6ef3a9... 

następnie umieścić coś takiego w 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 

Wreszcie:

puts ENV["HEROKU_RELEASE_NAME"] 
=> v42 

Teraz jest w pełni zautomatyzowany. Możesz o tym zapomnieć i kontynuować pracę nad swoją aplikacją.

+2

To bardzo elegancka odpowiedź, lepsza niż zaakceptowana odpowiedź IMHO. Mogę tylko zmienić to, że klucz API powinien być częścią konfiguracji, a nie zakodowany na stałe. Pamiętaj, że ujawnia klucz API dla Twojego konta wszystkim współpracownikom, więc może lepiej dodać do tego konkretnego współpracownika. – mjtko

+0

zgodził^dziękuję za obserwację – jassa

+0

To działało świetnie, gdy tylko przyszło mi do głowy, że działa to tylko wtedy, gdy aplikacja działa na Heroku ... duh! Właśnie przez ENV ["HEROKU_RELEASE_NAME"] na pasku nawigacji. Dzięki! – SteveO7

1

AFAIK można dostać tylko w wersji poprzez CLI:

heroku releases --app <YOUR_APP_NAME> 

Można to zrobić za pośrednictwem gem Heroku od Ciebie aplikacja, ale jest to prawdopodobnie więcej kłopotów, że warto.

7

Po każdypush, run (zakładając bash shell):

heroku config:add rel=$(heroku releases | tail -2 | awk '{print $1}') 

Można wtedy tylko dostęp do zmiennej środowiskowej rel z aplikacji.

Alternatywnie, jeśli chcesz przedstawić datę Push, który, IMO, reprezentuje bardziej znaczące informacje:

heroku config:add rel=$(heroku releases | tail -2 | awk '{print $5,$6,$7}') 

Or, mój ulubiony, który zawiera datę i wersję bez spacji:

heroku config:add rel=$(heroku releases | tail -2 | awk '{print $5"t"$6$7"."$1}') 
+0

dziękuję, to jest niesamowite! –

+3

i musisz to zrobić po _every_ wdrożyć –

+0

Działa to, ale powoduje ponowne uruchomienie aplikacji, aby zastosować zmienioną konfigurację. To nie jest korek, ale coś, o czym trzeba pamiętać. –

4

Miałem ten sam problem i zrobiłem to poprzez wdrożenie haka POST HTTP. Zasadniczo logika polega na tym, że utworzyłem określony adres URL w mojej aplikacji i publikuję nową wartość, aby zaktualizować zmienną konfiguracyjną.

Zrobiłem to w Python/Django, ale jestem pewien, że ta sama logika może być wykorzystywane do innych języków, a także:

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

Można dokonać Ruby plik wykonać następujące czynności:

require 'heroku' 

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

ta zwraca dokument JSON, który zawiera mnóstwo metadanych o swoich wdraża należą SHA, numer wersji itp

0

Używam Codeship więc mam zamiar po prostu dodając to do konfiguracji Push:

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

Należy zauważyć, że inne podobne odpowiedź jest nieprawidłowa, ponieważ jest chwytając niektórych późniejszych wersjach (używa ogona zamiast głowy) i próbuje ustawić dwie wersje zamiast jednej (np. v100 \n v101).

10

Teraz można wypróbować funkcję Heroku, o której pisał Roberto w swojej odpowiedzi, bez kontaktu z Heroku. To się nazywa Heroku Labs: Dyno Metadata i można ją włączyć przez

heroku labs:enable runtime-dyno-metadata -a <app name> 

a następnie informacje te są dostępne (na następnej deploy) jako zmienne środowiskowe:

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

Nie musimy skonfigurować dowolny plik konfiguracyjny lub jeszcze.

0

W node.js użyciu JavaScript fetch (i przyszły asynchroniczny/czekają), można to zrobić za pomocą następującego kodu (bez haczyków 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; 

użyciu

function base64Encode(str) { 
    return new Buffer(str, 'binary').toString('base64'); 
} 

Uwaga: Wymaga to uzyskania

$ heroku config:set HEROKU_API_TOKEN=\`heroku auth:token`. 

Zobacz devcenter.heroku.com/articles/platform-api-reference#release-list.

0

Po @jassa odpowiedź - ale przy użyciu nowszych 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