2017-10-11 3 views
0

J'essaie actuellement de fusionner notre branche principale dans de nouvelles branches de publication pour voir si la version fonctionne bien (pour tester, je fusionne les branches 'master' et 'infra'). Je fais cela avec un script pipeline dans Jenkins. Cependant, je reçois des conflits de fusion dans tous les fichiers fusionnés. Ainsi, par exemple si le fichier foo/bar.txt a été changé dans la branche infra le résultat dans mon repo locale ressemble à ceci:Fusionner des branches via le pipeline Jenkins

$ git merge master 
Auto-merging foo/bar.txt 
Merge made by the 'recursive' strategy. 
... 

En utilisant le script ci-dessous qui est censé faire la même chose que je reçois la résultat suivant:

ERROR: Branch not suitable for integration as it does not merge cleanly: Command "git merge --ff c98425e0c22d1ad35749c5eca03ca44652e22c95" returned status code 1: 
stdout: Auto-merging foo/bar.txt 
CONFLICT (add/add): Merge conflict in foo/bar.txt 
Automatic merge failed; fix conflicts and then commit the result. 

J'ai essayé pas mal de réglages différents, mais n'a pas été en mesure de faire fusionner Jenkins branches automatiquement. Voici la partie qui vérifie la mise en pension et devrait fusionner que je créé à l'aide du générateur d'extrait:

checkout changelog: true, poll: true, scm: [$class: 'GitSCM', branches: [[name: '*/infra']], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'LocalBranch', localBranch: 'infra'], [$class: 'PreBuildMerge', options: [fastForwardMode: 'FF', mergeRemote: 'origin', mergeStrategy: 'MergeCommand.Strategy', mergeTarget: 'master']]], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '<id>', name: 'origin', refspec: '+refs/heads/master:refs/remotes/origin/master', url: '<url to repo>']]] 

Edit: J'utilise une solution de contournement en ce moment en consultant le repo, puis en exécutant la fusion via la commande shell:

checkout poll: false, scm: [$class: 'GitSCM', branches: [[name: "${buildGitRevision}"]], doGenerateSubmoduleConfigurations: false, extensions: [[$class: 'WipeWorkspace']], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '<id>', url: '<url to repo>']]] 
[...] 
sh "git merge origin/master" 
+1

Neat idée de faire des fusions de test. Quels sont les types de conflits que vous avez? S'agit-il d'une chose Auto CRLF, ou y a-t-il eu des correctifs importants sur la «release» qui n'ont pas été rétroportés dans «master»? Changement d'indentation à l'échelle du projet? Je vais écrire une réponse basée sur l'état actuel de la question. – msanford

Répondre

0

S'il y aura des conflits résultant d'une fusion, il est pratiquement impossible pour vous de les fusionner dans un processus sans surveillance . Manifestement, s'il y a des conflits, la branche n'est pas prête à fusionner.

De plus, vous ne voudriez pas résoudre les conflits de fusion via un processus sans surveillance: comment savoir quelle version choisir? Oui, vous pouvez forcer git à choisir l'une ou l'autre branche avec git merge master -X theirs ou git merge master -X ours, mais cela nécessite un problème de workflow.

+0

Pour autant que je comprenne git il ne devrait pas y avoir de conflit d'abord si un fichier n'a pas été modifié dans les deux branches, mais c'est le problème que je traite ici. Fusionner les branches de test sur mon ordinateur portable fonctionnait parfaitement bien alors que Jenkins avait des conflits dans tous les fichiers qui ont été modifiés dans l'une des branches, même si l'autre branche n'a pas touché le fichier .. – Julian