web-dev-qa-db-fra.com

comment accéder à plusieurs référentiels dans la construction CI?

Nous avons un projet qui est composé de plusieurs référentiels (non publics).

Pour construire l'ensemble du projet, le système de build doit avoir les fichiers de tous les référentiels (branches master).

Existe-t-il un moyen de configurer GitLab CI pour fournir les référentiels dont j'ai besoin?

Je suppose que je pourrais faire un git fetch ou similaire lors de la construction du CI, mais comment gérer l'authentification alors?

32
Udo G

Vous pouvez ajouter une clé de déploiement à tous les projets. Configurez ensuite la clé privée de la clé de déploiement sur le ou les coureurs. Utilisez les commandes git normales dans votre processus de génération pour cloner les référentiels sur le runner. Cela peut nécessiter un peu de configuration sur vos coureurs, mais cela devrait fonctionner.

Vous pouvez soit générer une paire de clés SSH et l'utiliser sur tous les coureurs, soit générer une paire de clés par coureur. Pour générer une paire de clés SSH, suivez la documentation clé SSH . La clé privée doit être placée dans l'utilisateur de "gitlab-runner" .ssh répertoire afin que la commande git puisse le présenter au moment du clonage. La clé publique doit être ajoutée au projet GitLab en tant que clé de déploiement. Ajoutez une clé de déploiement dans les paramètres du projet -> 'Déployer les clés'.

4
Drew Blessing

Si vous exécutez gitlab version 8.12 ou ultérieure, le modèle d'autorisations était retravaillé . Avec ce nouveau modèle d'autorisation vient la variable d'environnement CI CI_JOB_TOKEN. La version premium de GitLab utilise cette variable d'environnement pour les déclencheurs, mais vous pouvez l'utiliser pour cloner des dépôts.

dummy_stage:
  script:
    - git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.instance/group/project.git
77
microe14

Quelques solutions (je déteste ce mot!) Qui m'ont contourné:

  1. En utilisant git submodule, voir https://docs.gitlab.com/ce/ci/git_submodules.html

  2. Réutilisation $ CI_REPOSITORY_URL définie par Gitlab et disponible même à l'intérieur des conteneurs Docker enfants. Cette variable env contient déjà un nom d'utilisateur et un mot de passe, qui peuvent être utilisés pour un autre dépôt sur le même serveur. Voir l'extrait de . Gitlab-ci.yml :

 - BASE_URL = `echo $ CI_REPOSITORY_URL | sed "s; \/* $ CI_PROJECT_PATH. * ;;" `
 - REPO_URL =" $ BASE_URL/thirdparty/gtest.git "
 - REPO_DIR = thirdparty/gtest 
 - rm -fr $ REPO_DIR 
 - clone git $ REPO_URL $ REPO_DIR 
  1. Même en stockant cette URL avec le nom d'utilisateur\mot de passe dans le fichier ~/.git-credentials et en configurant git pour l'utiliser via credential.helper. Toutes les autres commandes "git clone" l'utiliseront.
 - echo Stockage des informations d'identification git à utiliser par les commandes "git clone" sans nom d'utilisateur et mot de passe ... 
 - GIT_CREDENTIALS_FILE = ~/.git-credentials 
 - BASE_URL = `echo $ CI_REPOSITORY_URL | sed "s; \/* $ CI_PROJECT_PATH. * ;;" `
 - echo $ BASE_URL> $ GIT_CREDENTIALS_FILE 
 - git config --global credential.helper store --file = $ GIT_CREDENTIALS_FILE 

TOUTEFOIS !

Ayant passé quelques années dans le domaine CI\CD, je ne pense pas que ce soit une bonne conception qui nécessite de lier des référentiels en tant que sources .

Oui, dans les outils CI classiques comme Jenkins ou TeamCity, vous pouvez créer un travail qui récupère plusieurs dépôts Git dans différents sous-répertoires.

Mais j'aime la manière GitLab CI de Pipeline As Code, où .gitlab-ci.yml contrôle la construction de ce repo même et vous n'avez même pas à penser à toute cette étape de pré-construction pour obtenir les sources. Une telle construction publierait alors des artefacts binaires et des projets en aval\repos peuvent les utiliser à la place de sources des dépendances. C'est aussi plus rapide.

Séparation des préoccupations.

Je n'ai pas de méthode officielle dans mon .gitlab-ci.yml pour utiliser les artefacts d'un autre projet. Mais il existe d'autres moyens comme les hooks, l'API Gitlab, bien que de telles solutions sur mesure nécessitent une maintenance.

Il existe un meilleur moyen - de publier\récupérer des artefacts vers\à partir du gestionnaire de packages externe largement adopté. Selon votre langue, il peut s'agir de Maven, NuGet, npm, jFrog Artifactory, Nexus, etc. Un autre avantage de cette méthode est que les développeurs peuvent suivre le même processus dans leurs builds locaux, ce qui n'est pas facile si les dépendances sont définies dans .gitlab -ci.yml

C'est un problème plus important pour le code natif (Cxx) principalement en raison de la compatibilité de l'interface binaire, mais des choses comme Conan.io, etc., rattrapent lentement leur retard.

9
Ivan