Comment corriger une erreur de permission refusée (publickey) pour une mise à jour de sous-module git dans la version CI de Github Travis?

Je ne peux pas mettre à jour le sous-module git, avec l’erreur:

$ git submodule init Submodule 'build/html' (git@github.com:quadroid/clonejs.git) registered for path 'build/html' ... $ git submodule update Cloning into 'build/html'... Warning: Permanently added 'github.com,207.97.227.239' (RSA) to the list of known hosts. Permission denied (publickey). fatal: Could not read from remote repository. 

Mais quand je fais les mêmes tâches localement, tout va bien.

Comment est-ce que je corrige ceci pour que la construction de Travis CI passe et je peux toujours cliquer sur le sous-module dans le repo pour le diriger?

Cela peut (heureusement) être résolu facilement en modifiant le fichier .gitmodules à la volée sur Travis, de sorte que l’URL SSH soit remplacée par l’URL publique, avant d’initialiser les sous-modules. Pour ce faire, ajoutez ce qui suit à .travis.yml:

 # Handle git submodules yourself git: submodules: false # Use sed to replace the SSH URL with the public URL, then initialize submodules before_install: - sed -i 's/git@github.com:/https:\/\/github.com\//' .gitmodules - git submodule update --init --recursive 

Merci à Michael Iedema pour son idée à partir de laquelle j’ai tiré cette solution.

Si vos sous-modules sont des référentiels privés, vous devez inclure des informations d’identification dans les URL https, je vous recommande de créer un jeton d’access GitHub avec des permissions restreintes à cette fin:

 # Replace  and  with your GitHub username and access token respectively - sed -i 's/git@github.com:/https:\/\/:@github.com\//' .gitmodules 

Je recommande d’utiliser le schéma https pour les sous-modules, car cela vous permettra de tirer sur Travis et de pousser localement: https://github.com/quadroid/clonejs.git .

Travis prend désormais en charge l’access aux sous-modules à l’aide de ssh, qui est de loin la solution la plus simple. Il vous suffit d’associer votre clé ssh (ou la clé ssh d’un utilisateur CI dédié) au projet Github que vous construisez, comme décrit dans la documentation des dépendances privées .

$ travis sshkey --upload ~/.ssh/id_rsa -r myorg/main

Notez que Travis recommande de créer un utilisateur dédié afin de ne pas avoir à utiliser votre propre clé ssh.

Vous obtenez cette erreur car vous avez spécifié vos sous-modules via ssh-urls. Pour l’access ssh à partir de l’environnement travis-ci, vous devez configurer une clé .

Alternativement, vous pouvez simplement utiliser les URL relatives à vos sous-modules git depuis que vous projetez et que vos sous-modules sont tous disponibles sur Github.

Git résout les URL relatives à l’ ORIGIN .

Exemple:

En utilisant les 2 premières entrées de vos .gitmodules :

 [submodule "lib/es5-shim"] path = lib/es5-shim url = git@github.com:kriskowal/es5-shim.git [submodule "build/html"] path = build/html url = git@github.com:quadroid/clonejs.git 

Remplacé par les URL relatives:

 [submodule "lib/es5-shim"] path = lib/es5-shim url = ../../kriskowal/es5-shim.git [submodule "build/html"] path = build/html url = ../clonejs.git 

Ensuite, lors du clonage – disons – via https, l’origine est définie comme ceci:

 $ git clone https://github.com/quadroid/clonejs.git $ cd clonejs $ git remote -v origin https://github.com/quadroid/clonejs.git (fetch) origin https://github.com/quadroid/clonejs.git (push) 

Lors du clonage via ssh:

 $ git clone git@github.com:quadroid/clonejs.git $ cd clonejs $ git remote -v origin git@github.com:quadroid/clonejs.git (fetch) origin git@github.com:quadroid/clonejs.git (push) 

Avec les URL relatives, la séquence de sous-module habituelle fonctionne indépendamment de l’origine:

 $ git submodule init $ git submodule update 

Vous pouvez aussi manipuler directement votre fichier .gitmodules via git . (Inspiré par cette réponse ).

 git config --file=.gitmodules submodule.SUBMODULE_PATH.url https://github.com/ORG/REPO.git