2011-01-30 23 views

Respuesta

46

según la sugerencia de soporte técnico Heroku, la forma más sencilla de hacerlo es poniendo el nombre de usuario y una contraseña en la URL, como en el básico de autenticación HTTP, por ejemplo,

gem 'my_gem', :git => 'https://my_username:[email protected]/my_github_account/my_repo.git', :ref => 'revision_no' 

Esto funcionó para nosotros. Esto todavía es algo insatisfactorio, ya que tuvimos que poner una contraseña en el Gemfile. Nos ocupamos de esto agregando una nueva cuenta de usuario github y agregando esa cuenta como colaborador en el proyecto gem. Todavía no es una seguridad infalible, pero el impacto es más estrecho.

Otras opciones que he leído son set up your own gem server o vendor the gem.

Actualización 5/16/2012: Otra manera de moverse por poner la contraseña en el Gemfile es poner la contraseña en una variable de entorno; Heroku de hacer esto con heroku config:add VAR=value, y luego en el Gemfile tendrá que utilizar esta variable, por ejemplo .:

gem 'my_gem', 
    :git => "https://#{ENV['var_private_gem_username']}:#{ENV['var_private_gem_password']}@github.com/my_github_account.git", 
    :ref => 'rev' 

Este es el estándar en Heroku para evitar poner contraseñas, claves de la API y las credenciales en el código. Para el desarrollo/prueba local, puede establecer estas variables de entorno. O bien, suponiendo que su máquina de desarrollo está configurada para el acceso SSH a github, no necesitará las credenciales para el desarrollo local (las credenciales de SSH ya estarán en efecto). De modo que podría configurar alguna lógica condicional:

private_repo_credentials = %w(var_private_gem_username var_private_gem_password). 
    map { |var| ENV[var] }.compact.join(':') 
private_repo_credentials << '@' unless private_repo_credentials.empty? 
# private_repo_credentials will be "" if neither var is set 
# private_repo_credentials will be "username:[email protected]" if they are set 
gem 'my_gem', 
    :git => "https://#{private_repo_credentials}github.com/my_github_account.git", 
    :ref => 'rev' 

No he probado esta última parte. Por favor, brinde sus comentarios.

+5

Para que el enfoque ENV funcione, tendrá que habilitar un complemento de laboratorios: 'heroku labs: enable user_env_compile'. Lamentablemente, todavía hay problemas con la coincidencia de Gemfile.lock. –

+0

Gracias por los comentarios. –

+3

También podría considerar usar Gemfury https://devcenter.heroku.com/articles/gemfury – Schneems

102

La mejor forma que he encontrado para implementar una gema extraída de un repositorio privado es usar GitHub's OAuth access. Para ello:

  1. Crear un usuario GitHub con acceso a la cesión temporal de que se trate (en el mejor de los equipos - si estás bien exponer sus tokens de acceso personales, sólo tiene que utilizar su propia cuenta).

  2. Crea un token de GitHub OAuth para el usuario. Es muy simple hacer esto sobre la API de GitHub simplemente usando curl; ver the OAuth API para más.

  3. Agregue el token a la url git en su Gemfile. Ejemplo:

gem 'mygem', git: 'https://xxx123abc:[email protected]/user_or_team/mygem.git' 

Actualmente estoy usando este método en Heroku y funciona muy bien. La belleza es que no tiene que exponer su propia información personal, y puede revocar o regenerar el token en cualquier momento si algo se ve comprometido.

+3

Esto funcionó para mí. Para obtener más información sobre cómo crear el token de OAuth, visite: https://help.github.com/articles/creating-an-oauth-token-for-command-line-use – John

+12

No estoy seguro de por qué todo el mundo está votando la respuesta que le indica que ponga su contraseña en texto plano en el control de versión, luego la implemente en un sitio web de terceros en lugar de este. –

+2

Ahora puede crear tokens OAuth personales en el sitio GitHub: https://github.com/settings/tokens/new –

-3

Descubrí que cuando se utiliza el enfoque env y heroku labs: enable user_env_compile no hay ningún problema con Gemfile.encierro

+0

Ahora está en desuso – MikDiet

2

He descubierto que si tengo acceso a mi terminal a github (by uploading an ssh key to github), simplemente me puedo hacer:

gem 'my_gem', :git => '[email protected]:my_user/my_repo.git', :ref => 'revision_no' 

sin contaminar mi código con mi nombre de usuario o contraseña

+0

¿funcionaría esto al implementar en Heroku? –

+0

@KhoaNguyen No funcionará de la caja, ya que el servidor de Heroku intentaría acceder al repositorio de git directamente. Creo que es posible agregar la clave ssh de tu servidor Heroku a tu repositorio github, lo que permite este acceso - ** pero no estoy seguro de que sea posible ** – gardenofwine

Cuestiones relacionadas