Comment puis-je spécifier une gem à extraire d’un repository github privé?

J’ai un repository privé sur Github que je veux utiliser. Je déploie mon application sur Heroku. Comment puis-je spécifier un référentiel privé comme source sur mon fichier gemfile? J’imagine que ce ne serait pas suffisant pour dire simplement

gem "mygem", :git=>"my github address" 

Selon la suggestion du support technique Heroku, la méthode la plus simple consiste à insérer le nom d’utilisateur et le mot de passe dans l’URL, comme dans Basic HTTP Auth, par exemple

 gem 'my_gem', :git => 'https://my_username:my_password@github.com/my_github_account/my_repo.git', :ref => 'revision_no' 

Cela a fonctionné pour nous. Ceci est encore un peu insatisfaisant car nous avons dû mettre un mot de passe dans le Gemfile. Nous avons résolu ce problème en ajoutant un nouveau compte utilisateur github et en ajoutant ce compte en tant que collaborateur du projet gem. Toujours pas de sécurité à toute épreuve, mais l’impact est plus étroit.

Les autres options dont je parle sont la configuration de votre propre serveur de gemme ou de votre fournisseur .

Mise à jour 16/05/2012: Une autre façon de contourner le mot de passe dans le Gemfile consiste à placer le mot de passe dans une variable d’environnement; sur Heroku, vous faites ceci avec heroku config:add VAR=value , puis dans le Gemfile vous utiliserez cette variable, par exemple:

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

C’est la norme sur Heroku pour éviter de mettre des mots de passe, des clés API et des informations d’identification dans le code. Pour le développement / test local, vous pouvez définir ces variables d’environnement. Ou, en supposant que votre machine de développement est configurée pour un access SSH à github, vous n’aurez pas besoin des informations d’identification pour le développement local (les informations d’identification SSH seront déjà appliquées). Donc, vous pourriez mettre en place une logique conditionnelle:

 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:password@" if they are set gem 'my_gem', :git => "https://#{private_repo_credentials}github.com/my_github_account.git", :ref => 'rev' 

Je n’ai pas testé cette dernière partie. S’il vous plaît fournir des commentaires.

La meilleure façon de déployer une gem tirée d’un repo privé est d’utiliser l’access OAuth de GitHub . Faire cela:

  1. Créez un utilisateur GitHub ayant access au repo en question (idéal pour les équipes – si vous souhaitez bien exposer vos jetons d’access personnels, vous pouvez simplement utiliser votre propre compte).

  2. Créez un jeton GitHub OAuth pour l’utilisateur. Il est très simple de faire cela sur l’API GitHub en utilisant simplement curl ; voir l’API OAuth pour plus d’informations.

  3. Ajoutez le jeton à l’URL git de votre Gemfile. Exemple:

 gem 'mygem', git: 'https://xxx123abc:x-oauth-basic@github.com/user_or_team/mygem.git' 

J’utilise actuellement cette méthode sur Heroku et cela fonctionne très bien. La beauté est que vous n’avez pas à exposer vos propres informations personnelles, et vous pouvez révoquer ou régénérer le jeton à tout moment si quelque chose est compromis.

J’ai trouvé que si j’ai access de mon terminal à github ( en téléchargeant une clé ssh dans github ), je peux simplement faire:

 gem 'my_gem', :git => 'git@github.com:my_user/my_repo.git', :ref => 'revision_no' 

sans polluer mon code avec mon identifiant ou mot de passe git

Si tout va bien en 2015, vous pouvez utiliser https://github.com/siassaj/heroku-buildpack-git-deploy-keys avec une clé de déploiement de github.

De cette façon, vous évitez de mettre le nom d’utilisateur et de passer dans Gemfile, qui se retrouvera en texte brut dans le fichier Gemfile.lock.

  • Créer une clé ssh
  • Assurez-vous que ces clés sous le répertoire ~/.ssh
  • Copiez le contenu de ~/.ssh/id_rsa.pub dans https://github.com/MY_COMPANY/MY_GEM/settings/keys
  • Dans votre Gemfile utilisez: gem 'mygem', github: 'MY_COMPANY/MY_GEM'
  • exécuter une bundle install

J’ai trouvé que lors de l’utilisation de l’approche env et des labos heroku: enable user_env_comstack alors il n’y a pas de problème avec Gemfile.lock