2012-01-09 7 views
23

Cada vez que empujo mi aplicación a heroku veo la líneaReflejando Heroku versión de empuje dentro de la aplicación

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

¿Hay una manera de hacer que el número de versión apear dentro de la aplicación para que otras personas puedan ver ese número?

+0

copiar y pegar :) – manojlds

+0

eso es cierto, pero me refería a automagicamente :) –

+1

'copiar/paste' no es amigo de un programador, la automatización es . Ver [mi respuesta] (http://stackoverflow.com/a/8793568/23056) para automatizarlo. – nicerobot

Respuesta

37

¿por qué quieres que depender de la ejecución de un comando después cada push? La respuesta aceptada es peor que configurar la configuración usted mismo.

lugar añadir a su Gemfile:

gem 'heroku-api' 

Añada su nombre y clave de API de aplicaciones a la configuración Heroku:

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

a continuación, poner algo como esto en 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 

Finalmente:

puts ENV["HEROKU_RELEASE_NAME"] 
=> v42 

Ahora es totalmente automático. Puedes olvidarte y continuar trabajando en tu aplicación.

+2

Esta es una respuesta muy elegante, mejor que la respuesta aceptada en mi humilde opinión. Lo único que cambiaría es que la clave API también debería ser parte de la configuración, en lugar de estar codificada. Tenga en cuenta que esto expone la clave API de su cuenta a todos los colaboradores, por lo que sería mejor agregar un colaborador específico para este fin. – mjtko

+0

de acuerdo^gracias por la observación – jassa

+0

Esto funcionó muy bien una vez que se me ocurrió que esto solo funciona cuando la aplicación se ejecuta en Heroku ... ¡duh! Acabo de pasar por ENV ["HEROKU_RELEASE_NAME"] en mi barra de navegación. ¡Gracias! – SteveO7

1

yo sepa sólo se puede obtener a través de la versión de la CLI:

heroku releases --app <YOUR_APP_NAME> 

usted puede hacer esto a través de la gema Heroku de usted aplicación, pero esto es probablemente más problemas que vale la pena.

7

Después de cada push, ejecución (asumiendo una cáscara bash):

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

continuación, puede simplemente acceder a la variable rel entorno de su aplicación.

Alternativamente, si desea presentar la fecha de la presión, lo que, en mi opinión, representa la información más significativa:

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

O, mi favorita, que contiene la fecha y la versión sin espacios en blanco:

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

gracias ¡eso es increíble! –

+3

y tendrá que hacer esto después de _every_ deploy –

+0

Esto funciona pero hace que su aplicación se reinicie para aplicar la configuración modificada. No es un show stopper, sino algo a tener en cuenta. –

4

Tuve el mismo problema y lo hice a través de un desplegable POST HTTP. Básicamente, la lógica es que creé una URL específica en mi aplicación y publico el nuevo valor para actualizar la variable de configuración.

lo hice en Python/Django, pero estoy seguro que la misma lógica se puede utilizar para otros idiomas, así:

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

Puede hacer archivo que hacer lo siguiente: a Ruby:

require 'heroku' 

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

Esto devuelve un documento JSON que contiene una tonelada de metadatos acerca de sus despliega incluir SHA, número de versión, etc.

0

estoy usando Codeship así que planea en sólo añadir esto a la presión config:

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

Tenga en cuenta que la otra respuesta semejante no es válido, ya que es agarrar algunas de las versiones posteriores (que utiliza la cola en lugar de cabeza) e intenta establecerlo en dos versiones en lugar de solo una (es decir, v100 \n v101).

10

Ahora es posible probar la función Heroku sobre la que Roberto escribió en su respuesta, sin contactar a Heroku. Se llama Heroku Labs: Dyno Metadata y se puede activar por

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

y luego la información está disponible (en el próximo despliegue) como variables de entorno:

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

No tenemos que configurar ningún archivo de configuración o más.

0

En Node.js uso de JavaScript fetch (y la próxima asíncrono/espera), puede hacerlo con el siguiente código (no ganchos empuje!):

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; 

usando

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

Tenga en cuenta que esto requiere

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

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

0

Siguiendo @jassa respuesta - pero utilizando el más reciente 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 
Cuestiones relacionadas