2012-06-11 12 views
7

Tengo una rama de desarrollo alojada en Heroku y tenemos un par de personas que usan esta rama para buscar errores, sería bueno mostrar la Hash SHA-1 de la confirmación esa es la última versión desplegada en Heroku para que sepamos qué errores pertenecen a cuál cometer.Consola heroku muestra el último hash sha de la implementación de git

Pero no puedo encontrar ninguna manera de encontrar esta información. nada en la variable ENV en la consola heroku run. Aunque "heroku releases" muestra una lista de información de implementación, incluidos los primeros pocos caracteres del hash SHA-1, eso me lleva a pensar que Heroku debe almacenarlo en algún lugar, pero no puedo encontrar dónde. ¿Alguien sabe?

Me doy cuenta de que realmente no he dejado la pregunta tan clara como debería: quise encontrar el hash SHA-1 dentro de Rails on Heroku. Como puedo hacer algo como esto:

<h1><%= ENV['REV']</h1> 

Gracias!

+0

tengo que preguntar ¿por qué? Usted dice 'tenemos un par de personas que usan esta rama para buscar errores'. No estoy tratando de trollar, pero me pregunto por qué no ramificaría el error en dev, lo cargaría para que los demás lo mirasen y luego se fusionarían una vez. aprobado "o cualquier otra razón que tengas para que puedan ver una rama específica en heroku y no en sus propias máquinas de desarrollo. – pjammer

+0

no hay problema en absoluto, no creo que sea trolling: tal vez mi método no esté respaldado por el pensamiento óptimo, pero si prueban la aplicación solo en su máquina local, simplemente no puedo dormir bien pensando que lo hará trabaja exactamente de la misma manera en Heroku. –

+0

, pero para eso es un entorno de ensayo ¿no? ¿Cuántos chicos tienes en el código? Quiero decir, si hay un error, un tipo se bifurca del maestro, lo arregla, actualiza la puesta en escena. Usted lo aprueba Luego se fusiona en maestro y empuja hacia la producción. Todo lo que te permite dormir un poco. – pjammer

Respuesta

10

Treat Heroku igual que cualquier otro repositorio git remoto - se puede utilizar git ls-remote:

git ls-remote heroku

(heroku siendo aquí el nombre remoto)

ACTUALIZACIÓN:

Desde el OP realmente está buscando adquirir el SHA en el env Ruby, una posible forma sería usar un custom buildpack.

Para empezar, vaya a Heroku's Ruby Buildpack y bifurque para que pueda hacer sus propias variaciones. Ahora clone su tenedor y eche un vistazo al lib/language_pack/ruby.rb. Añadir un nuevo método, algo así como:

def get_SHA 
    #get SHA 
    #save SHA to ENV, ala: ENV['SHA'] = retrieved_sha 
end 

Cómo ir sobre cómo obtener el SHA depende de usted. Se podría ejecutar un comando git y utilizar lo que se volvió:

git log -1 --format="%H"

O usted podría utilizar @ consejo de avaynshtok y utilizar la gema Heroku utilizar el método releases.

Luego, una vez que tenga el SHA, configúrelo como una var. ENV.

A continuación, encontrar el método compile en ruby.rb y añada el método get_sha al final de la misma:

def compile 
    Dir.chdir(build_path) 
    install_ruby 
    setup_language_pack_environment 
    allow_git do 
     install_language_pack_gems 
     build_bundler 
     create_database_yml 
     install_binaries 
     run_assets_precompile_rake_task 
     get_sha #your additional method 
    end 
end 

empujar sus cambios de nuevo hasta GitHub, y ahora la cabeza a la línea de comandos. Usted tendrá que añadir una nueva configuración var para su aplicación Heroku:

heroku config:add [email protected]:<your GitHub username>/heroku-buildpack-ruby.git

Tenga en cuenta que tendrá que asegurarse de que ha <your GitHub username> reemplazar con ... bueno, su nombre de usuario GitHub, por lo que están apuntando a su repositorio bifurcado.

Por último, ejecute un último comando que permite a un Heroku labs feature que permite el acceso babosa compilador para el usuario vars:

heroku labs:enable user_env_compile

Ahora usted debe estar todo listo. Entonces, ¿qué pasa exactamente ahora? Bueno, cuando presionas a Heroku, Heroku recibirá los cambios, y luego verás que tienes una url de buildpack personalizada. Por lo tanto, buscará su buildpack personalizado desde GitHub y luego lo usará para crear el slug. Eso significa que una vez que se ejecuta a través de todos los comandos de compilación predeterminados, terminará con su método get_sha, que debe establecer ENV var SHA en el SHA apropiado. Ahora deberías tener acceso a esa var ENV desde dentro de Ruby, para hacer con lo que quieras.

+0

Lo siento por mi pregunta poco clara. Debo encontrar esta información dentro de Rails –

+0

Ah, bueno, eso cambia las cosas un poco. No creo que haya ninguna funcionalidad incorporada de Heroku para esto, pero si estás en Cedar, entonces podrías teclear el buildpack de Ruby/Rails y establecer un ENV por ti mismo. – redhotvengeance

+0

Ya veo. eso está muy mal, realmente estaba esperando que hubieran almacenado el SHA. Quiero decir, es recuperado del comando "heroku releases", dice que lo tienen * en algún lugar * ... –

3

Usted puede obtener información sobre el uso de liberar la gema Heroku: https://github.com/heroku/heroku

c = Heroku::Client.new <LOGIN>, <PASSWORD> 
c.releases(<APPNAME>).last['commit'] 

Alternativamente, se puede autenticar usando su clave de API:

c = Heroku::Client.new '', <API_KEY> 

La desventaja es que se necesita para almacenar una combinación de inicio de sesión/contraseña (o clave de API) en algún lugar (ya sea en su aplicación o env de Heroku).

También puede utilizar desplegar ganchos para obtener esta información: https://devcenter.heroku.com/articles/deploy-hooks

+0

Tanto los ganchos como el cliente se ven prometedores, voy con el buildpack, ya que parece mucho menos arduo de construir de lo que pensaba, y parece tener la variable ENV evita tener que llamar al cliente de Heroku cada vez que quiere ver el SHA (que pretendo poner en cada página como un sello). Aunque el gancho de implementación eliminará esto al almacenarlo en alguna tabla de base de datos. Entonces, si el buildpack no funciona, tendré que recurrir a esto. Gracias Avaynshtok –

1

Terminé usando el Heroku platform API gem para esto. Es un gran largo aliento, pero se memoized, por lo que sólo tendrá que hacer esto una vez por implementar y ahorra jugar un poco con buildpacks personalizados (complicados) y desplegar ganchos (inseguro):

def current_sha 
    @current_sha ||= begin 
    heroku = PlatformAPI.connect_oauth(ENV['HEROKU_TOKEN']) 
    slug_id = heroku.release.list(ENV['HEROKU_APP']).last["slug"]["id"] 
    heroku.slug.info(ENV['HEROKU_APP'], slug_id)["commit"] 
    end 
end 
+0

Esa es una gran sugerencia de hecho. Encontré que los ganchos de implementación de HTTP de Heroku son ocasionalmente escasos. –

+0

Esto no me está dando la confirmación correcta. Devuelve un breve resumen, pero no estoy seguro de qué se trata y no se actualiza con las llamadas repetidas. ¿Dónde se define el "último" método para la lista de publicación? – justingordon

+0

¡El problema es que esto solo funciona si tienes menos de 200 commit de git! https://discussion.heroku.com/t/can-a-custom-buildpack-put-the-current-git-commit-sha-into-apps-env/932. ¡Después de 200, obtienes el mismo lanzamiento cada vez! Debe ser de alguna manera pedir el último lanzamiento de manera más efectiva. – justingordon

Cuestiones relacionadas