web-dev-qa-db-fra.com

Comment réparer une erreur d'autorisation refusée (publickey) pour une mise à jour du sous-module git dans la build Github Travis CI?

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

$ git submodule init
Submodule 'build/html' ([email protected]: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 puis-je résoudre ce problème afin que la génération Travis CI passe et que je puisse toujours cliquer sur le sous-module dans le référentiel pour y accéder?

44
Quadroid

Cela peut (heureusement) être facilement résolu en modifiant le fichier .gitmodules à la volée sur Travis, afin 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/[email protected]:/https:\/\/github.com\//' .gitmodules
    - git submodule update --init --recursive

Merci à Michael Iedema pour son Gist dont j'ai dérivé cette solution.

Si vos sous-modules sont des référentiels privés, cela devrait fonctionner pour inclure les informations d'identification dans les URL https, je recommande de faire un jeton d'accès GitHub avec des autorisations restreintes à cet effet:

# Replace <user> and <token> with your GitHub username and access token respectively
- sed -i 's/[email protected]:/https:\/\/<user>:<token>@github.com\//' .gitmodules
72
aknuds1

Je recommanderais 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.

24
sarahhodne

Travis prend désormais en charge l'accès au sous-module à 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 pour les 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 que vous n'ayez pas à utiliser votre propre clé ssh.

13
emidander

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

Alternativement, vous pouvez simplement utiliser des URL relatives pour vos sous-modules git puisque vous projetez et vos sous-modules sont tous disponibles sur Github.

Git résout les URL relatives contre Origin.

Exemple:

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

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

Remplacé par des 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 suit:

$ 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 [email protected]:quadroid/clonejs.git
$ cd clonejs
$ git remote -v                                
Origin  [email protected]:quadroid/clonejs.git (fetch)
Origin  [email protected]:quadroid/clonejs.git (Push)

Avec des URL relatives, la séquence de sous-modules habituelle fonctionne indépendamment de l'origine:

$ git submodule init
$ git submodule update
6
maxschlepzig

Vous pouvez également 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
0
loudmouth