IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GIT Discussion :

Retrouver la branche source d'une branche


Sujet :

GIT

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    DevOps
    Inscrit en
    Janvier 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 7
    Par défaut Retrouver la branche source d'une branche
    Bonjour à tous,

    Question qui a déjà due être posée des millions de fois:
    Dans un pipeline Jenkins, j'ai besoin de retrouver la branche source d'une branche. Bien que la recherche peut être incertaine, quelle serait la meilleure solution d'après vous ?

    Merci d'avance,

    Sam

  2. #2
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Je ne comprends pas l'usage ça revient à se demander quelle est la branche d'intégration des développements. Seul un humain peut répondre à cette question, généralement le team lead.

    Le dev qui a créé la branche est également supposé savoir depuis laquelle il a branché. Au pire git branch --contains <commit> permet de lister les branches qui référencent ce commit. Donc il peut faire git branch --contains HEAD, git branch --contains HEAD~1, git branch --contains HEAD~2, etc ... La première commande ne devrait afficher que la branche courante, et au bout d'un moment il va tomber sur la branche source mais il pourrait tout à fait y en avoir d'autres notamment s'il y a plusieurs branches d'intégration. Donc difficile de scripter ça.

  3. #3
    Membre du Club
    Homme Profil pro
    DevOps
    Inscrit en
    Janvier 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 7
    Par défaut
    Salut,

    oui tu as raison, cela revient à retrouver la branche d'intégration. Et oui, le développeur connait aussi la branche source qu'il a choisi pour créer sa branche.
    Sauf que là, je suis dans un hook git... Pourquoi ? C'est assez simple. Notre logiciel est décomposé en 5 projets. Lorsqu'un développeur commence un développement, il doit créer les branches pour les 5 projets. Pour lui faciliter la vie, on souhaite automatiser la création des branches de la façon suivante:
    - le développeur créé la branche sur le projet principale, ce qui déclenche le hook 'post-receive'
    - dans ce hook, on recherche la branche source, puis on créé automatiquement les branches pour les autres projets.

    Une solution trouvée est la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    git show-branch -a 2>/dev/null | grep '\*.*\[.*\]' | grep -v `git rev-parse --abbrev-ref HEAD` | head -n1 | sed 's/.*\[\(.*\)\].*/\1/' | sed 's/[\^~].*//'
    Je passe l'explication dans les détails, mais cela revient à parser le résultat du git show-branch, de filtrer sur les lignes contenant "*" correspondant aux commits contenus dans la branche, d'éliminer les commits de la branche même puis d'extraire de la première ligne restante (correspondant du coup à la branche source ) le nom de la branche. Tordu, mais ça marche.

    Bref, c'est une solution, mais qui ne me satisfait qu'à moitié, car un développeur peut également créer une branche à partir d'un tag, et là ce script n'est plus valable.

    J'ai beau chercher dans tous les sens, je ne vois pas de solution fiable ä 100%. Rechercher le tag d'origine revient à rechercher le tag lié au commit d'origine de la branche (que l'on peut retrouver via un git rev-list), sauf que plusieurs tags peuvent exister pour le même commit, et là plus moyen d'automatiser les choses...

  4. #4
    Expert confirmé
    Avatar de Marco46
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2005
    Messages
    4 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2005
    Messages : 4 419
    Par défaut
    Donc si je comprends bien vous avez 5 dépôts avec 5 projets dont un qui est considéré comme le dépôt principal et ces 5 dépôts constituent votre solution.

    Lorsqu'un dev crée une feature branch sur le dépôt principal, vous avez besoin de retrouver la branche mère pour checkout cette branche sur les autres dépôts afin d'y créer les features branch automatiquement ?

    C'est quand même super bizarre comme fonctionnement, deux réflexions me viennent :
    - qu'est-ce qui vous garanti qu'un développement nécessite d'effectuer des modifications sur les 5 dépôts ?
    - compte tenu de vos contraintes, un monorepo ne serait-il pas beaucoup plus simple à gérer ?

    Quand une solution est complexe et tordue à mettre en oeuvre, c'est généralement que l'approche globale n'est pas adaptée et qu'il faut changer son fusil d'épaule. De ce que je comprends il vous faudrait surtout un monorepo pour l'ensemble de la solution.

  5. #5
    Membre du Club
    Homme Profil pro
    DevOps
    Inscrit en
    Janvier 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : DevOps
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2016
    Messages : 7
    Par défaut
    Salut,

    oui c'est bien ça, 5 dépôts différents, car les technos ne sont pas les mêmes:
    - Frontend en Javascript
    - Backend en ABL Progress (3 repos: notre applicatif, notre framework, le un framework externe)
    - Scripts de déploiement -> Ant + Groovy

    Le besoin d'avoir une branche pour chaque repo est simplement un besoin technique, notre pipeline sous Jenkins doit être capable de faire un checkout des 5 projets pour le builder. Pour cela il doit prendre les bonnes branches pour chacune des repos.
    Jusqu'à présent, le script du pipeline vérifiait pour chaque repo l'existance d'une branche du même nom que celle du projet principal, faisait un checkout de celle-ci lorsqu'elle existait, et faisait un checkout de develop sinon. Ceci a fonctionné correctement durant 2 ans.
    Sauf que maintenant, nous avons deux versions en parallele à gérer (l'actuelle qui est déployée chez nous clients mais qui, pour des raisons politiques, continue d'être updatée, et la version future). Du coup, il faudrait que le script puisse savoir si la branche a été créée de la branche develop de la version actuelle ou de la branche de la version future. Pour éviter de trop complexifier ce script, nous avons donc décider d'automatiser la création des branches côté développeur, ce qui déporte la probématique côté développeur mais simplifie grandement le script du pipeline.

    Mais bon, dans tous les cas, il s'avère très complexe de retrouver la source avec git, vue que git ne sauvegarde pas cette information (contrairement à svn). Il serait toujours possible d'annoter la création des branches ou des tags, mais ça devient du bricolage...

    Entre temps mon collègue a écrit un script permettant la création des branches, qui reçoit simplement en paramètre le nom de la branche source. On perd l'avantage des hooks et oblige à l'utilisation du script (la création d'une branche depuis un client git ne génèrera pas les branches automatiquement pour les autres repos), mais au moins c'est simple et fiable à 100%.

Discussions similaires

  1. retrouver le code source d'une appli java?
    Par david06600 dans le forum Sécurité
    Réponses: 2
    Dernier message: 01/08/2006, 12h25
  2. [Juridique] Comment réutiliser le code source d'une classe ?
    Par mathieu dans le forum Général Java
    Réponses: 8
    Dernier message: 17/05/2004, 14h40
  3. Source attachée à une classe
    Par Lyr7in3 dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 12/05/2004, 15h44
  4. [VB6] Source D'une erreur
    Par krest dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 16/07/2003, 18h33
  5. Recuperation du source d'une page - envoi de param
    Par ulysse66x dans le forum Web & réseau
    Réponses: 3
    Dernier message: 15/06/2003, 18h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo