Obtention de GitLab CI pour cloner des dépôts privés
J'ai mis en place GitLab & GitLab CI pour héberger et tester certaines de mes prises en pension privées. Pour mes modules composer sous ce système, J'ai mis en place Satis pour résoudre mes paquets privés.
Évidemment, ces paquets ont besoin d'une clé ssh pour les cloner, et j'ai ce travail dans le terminal - je peux courir compositeur installer et obtenir ces paquets, tant que j'ai la clé ajoutée avec ssh-add
dans la coquille.
cependant, lors de l'exécution de mes tests dans GitLab CI, si un projet a l'une de ces dépendances les tests ne seront pas terminés car mon instance GitLab a besoin d'authentification pour obtenir les Dep (évidemment), et le test échoue en disant Host key verification failed
.
ma question Est de savoir comment configurer cela pour que lorsque le coureur exécute le test, il puisse s'authentifier en gitlab sans mot de passe? J'ai essayé de mettre une clé SSH sans mot de passe dans mes coureurs ~/.ssh
dossier, Cependant le build n'ajoutera même pas la clé, " eval ssh-agent -s
" suivi de ssh-add semble échouer en disant que l'agent n'est pas exécuter...
7 réponses
je poste ceci comme réponse puisque d'autres N'étaient pas complètement clairs et/ou détaillés IMHO
à partir de GitLab 8.12+, en supposant que le repo submodule est dans le même serveur que celui qui le demande, vous pouvez maintenant:
configurer le repo avec submodules comme d'habitude (
git submodule add git@somewhere:folder/mysubmodule.git
)Modifier
.gitmodules
le fichier comme suit[submodule "mysubmodule"] path = mysubmodule url = ../../group/mysubmodule.git
où"../../groupe/mysubmodule.git est un chemin relatif à partir de votre référentiel pour le sous-module.
Ajoutez les lignes suivantes
gitlab-ci.yml
variables: GIT_SUBMODULE_STRATEGY: recursive
pour demander au coureur de récupérer tous les sous-modules avant la construction.
avertissement: si votre coureur semble ignorer le GIT_SUBMODULE_STRATEGY
directive, vous devriez probablement envisager mise à jour.
voici un howto complet:
Conception Générale
- générer une paire de clés SSH
- ajouter le privé comme variable d'environnement sécurisé de votre projet
- faire le secteur privé à la disposition de vos scripts de test sur GitLab-CI
- ajouter la clé publique comme clé de déploiement sur chacune de vos dépendances privées
Génération d'une paire de public et de privé de clés SSH
générer un paire de clés SSH publiques et privées sans phrase de passe:
ssh-keygen -b 4096 -C "<name of your project>" -N "" -f /tmp/name_of_your_project.key
ajouter la touche SSH privée à votre projet
vous devez ajouter la clé comme variable d'environnement sécurisé à votre projet comme suivantes:
- parcourir
https://<gitlab_host>/<group>/<project_name>/variables
- cliquez sur "Ajouter une variable"
- remplir le champ de texte
Key
SSH_PRIVATE_KEY
- remplir le champ de texte
Value
avec le secteur privé clé SSH lui-même - cliquez sur "Enregistrer les changements"
Exposition le privé clé SSH pour vos scripts de test
afin de rendre votre clé privée disponible pour vos scripts de test, vous devez ajouter
la suite de votre .gitlab-ci.yml
fichier:
before_script:
# install ssh-agent
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
# run ssh-agent
- eval $(ssh-agent -s)
# add ssh key stored in SSH_PRIVATE_KEY variable to the agent store
- ssh-add <(echo "$SSH_PRIVATE_KEY")
# disable host key checking (NOTE: makes you susceptible to man-in-the-middle attacks)
# WARNING: use only in docker container, if you use it with shell you will overwrite your user's ssh config
- mkdir -p ~/.ssh
- echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
Extrait de Code vient de GitLab documentation
ajouter la clé SSH publique comme clé de déploiement à toutes vos dépendances privées
vous devez enregistrer la clé publique SSH comme clé de déploiement de tous vos privé les dépendances de la manière suivante:
- parcourir
https://<gitlab_host>/<group>/<dependency_name>/deploy_keys
- cliquez sur "Nouveau déployer touche"
- remplir le champ de texte
Title
avec le nom de votre projet - remplir le champ de texte
Key
avec la clé SSH publique elle-même - cliquez sur"Créer une clé de déploiement"
corrigé ceci en ajoutant la clé à known-hosts avec ssh-keyscan -H 'localgitlab.co.uk' >> ~gitlab_ci_runner/.ssh/known_hosts
si vous ne voulez pas tripoter avec les touches ssh ou les sous-modules, vous pouvez outrepasser la mise à jour dans la configuration de git pour vous authentifier avec le jeton job à la place (dans gitlab-ci.yml
):
before_script:
- git config --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.example.com/group/repo.git".insteadOf git@gitlab.example.com:group/repo.git
j'ai utilisé déployer des jetons pour résoudre ce problème, car configurer des clés SSH pour un coureur de test semble un peu long.
git clone http://<username>:<deploy_token>@gitlab.example.com/tanuki/awesome_project.git
les tokens deploy sont par projet et ne sont lus que.
j'ai eu un scénario où j'ai dû utiliser ma clé ssh dans 3 différents scripts, j'ai donc mis la clé ssh de choses dans un seul script shell appelé en premier, avant les 3 autres scripts. Cela a fini par ne pas fonctionner, je pense en raison de la ssh-agent
ne pas persister entre les scripts shell, ou quelque chose à cet effet. J'ai fini par sortir la clé privée dans la zone!--3 -- > fichier, qui va certainement persister à d'autres script.
.gitlab-ci.yml
script:
- ci/init_ssh.sh
- git push # or whatever you need ssh for
ci/init_ssh.sh
# only run in docker:
[[ ! -e /.dockerenv ]] && exit 0
mkdir -p ~/.ssh
echo "$GITLAB_RUNNER_SSH_KEY" > ~/.ssh/id_rsa
chmod 400 ~/.ssh/id_rsa
echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > /.ssh/config
Il fonctionne comme un charme!
Semble qu'il y ait enfin un solution raisonnable.
.submodules etgit submodule update --init
simplement