Comment puis-je faire Jenkins CI avec Git déclencheur sur les poussées à maîtriser?


205

J'essaie de configurer Jenkins-ci pour un projet utilisant GitHub. J'ai déjà configuré Jenkins avec les plugins appropriés. Je veux que Jenkins exécute des scripts de build uniquement chaque fois que quelqu'un sur le projet pousse à maîtriser. Jusqu'à présent, j'ai pu le configurer pour qu'une génération soit déclenchée à chaque fois que quelqu'un pousse n'importe où, mais c'est trop large. Je l'ai fait avec des hooks de service post-réception sur Git.

J'ai lu le wiki Jenkins et quelques tutoriels, mais ce détail particulier manque ... est-ce quelque chose à voir avec l'interrogation peut-être? Ou faut-il travailler du côté de Git, pour que Git ne déclenche Jenkins que lorsqu'il masterest modifié?


3
L'auteur original de Jenkins, Kohsuke Kawaguchi, décrit comment faire une notification push à partir du référentiel en utilisant le plugin Git Plugin Git 1.1.14. Voir kohsuke.org/2011/12/01/…
GeraldScott

Réponses:


190

Comme déjà noté par gezzed dans son commentaire, en attendant il y a une bonne solution (décrite dans Polling must die: déclencher les builds Jenkins à partir d'un hook Git ):

  • Définissez le déclencheur de génération du travail Jenkins sur Poll SCM , mais ne spécifiez pas de planification.

  • Créer un déclencheur post-réception GitHub pour notifier l'URL

    http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>?token=<get token from git to build remotely>
    
  • Cela déclenchera toutes les générations qui interrogent le référentiel Git spécifié.

  • Cependant, l'interrogation vérifie réellement si quelque chose a été poussé vers la branche utilisée.

Cela fonctionne parfaitement.


1
Cela a très bien fonctionné pour moi aussi, vous pouvez utiliser la même approche avec une installation locale gitorious: cweiske.de/tagebuch/gitorious-post-receive-hook-2.htm
Justin Smith

4
Fonctionne également avec le crochet POST de Bitbucket (pas Jenkins). Pour spécifier les informations d'authentification, vous pouvez utiliser l' utilisateur: password@my.ci.server/git/notifyCommit? Url = ... comme URL.
loevborg

Peut-il être configuré pour que jenkins ne crée que les bibliothèques / projets affectés par la dernière poussée vers le référentiel? Vous ne reconstruisez pas toute la branche?
Croolman

Pouvez-vous clarifier cette partie? "Créer un déclencheur post-réception github pour notifier l'URL"
dewwwald

Je suppose que github doit pouvoir atteindre votre instance Jenkins, ce qui signifie qu'il doit être accessible au public. Est-il possible de faire fonctionner cela avec un serveur Jenkins qui n'est pas public?
A. Murray

33

À partir de la version 0.5, le plugin GitHub pour Jenkins peut déclencher une génération lorsqu'un changement est poussé vers GitHub .


23
@asveikau - La question d'origine concernait github.
docwhat

Ce n'est pas une bonne solution car elle déclenche la génération quelle que soit la branche qui a été poussée.
Shannon

En fait, il semble qu'il obéit au spécificateur de branche dans les paramètres du plugin git si vous activez "Poll SCM" (pas de planification nécessaire).
Shannon

1
Bien que cela puisse être vrai, cela déclenche toujours la génération de manière incorrecte quand aucun espace de travail n'existe ("L'espace de travail est hors ligne. Planification d'une nouvelle génération pour obtenir un espace de travail. (Nonexisting_workspace) Terminé. A pris 0 ms Les modifications ont été trouvées"). Voir aussi issues.jenkins-ci.org/browse/JENKINS-18079
Shannon

Le plugin GitHub répertorie le plugin Git en tant que dépendance . Le wiki dit "lors de la création d'un travail, spécifiez l'URL sous" Projet Github "et sélectionnez Git spécifiez l'URL sous" Gestion du code source ". Il dit" Ce déclencheur ne lance que l'algo de sondage interne du plugin Git pour chaque événement entrant contre le référentiel correspondant. "I penser cela signifie qu'il fait à peu près le SMC sondage comme dans la réponse acceptée, mais il a des options pour configurer le webhook automatiquement et quelques autres fonctionnalités.
dosentmatter

9

Au lieu de déclencher des builds à distance, modifiez la configuration de votre projet Jenkins pour déclencher des builds par interrogation.

Jenkins peut interroger sur la base d'un interne fixe ou par une URL. Ce dernier est ce que vous voulez ignorer les builds s'il n'y a pas de changements pour cette branche. Les détails exacts sont dans la documentation . Essentiellement, il vous suffit de cocher l'option "Poll SCM", de laisser la section de planification vide et de définir une URL distante pour frapper JENKINS_URL / job / name / polling.

Un problème si vous avez un environnement Jenkins sécurisé est différent /build, l' /pollingURL nécessite une authentification. Les instructions ici ont des détails. Par exemple, j'ai un hook GitHub Post-Receive username:apiToken@JENKIS_URL/job/name/polling.


8

Pour GitLab , procédez comme suit:

  1. Accédez aux paramètres de votre projet → Web hooks
  2. Saisissez l'URL "Build Now" de votre projet Jenkins comme URL d'événement Push:

    http://server.com/jenkins/job/project_name/build?delay=0sec par exemple

  3. Cliquez Add Web Hookpuistest hook

Ensuite, chaque fois que vous vous engagez dans le référentiel, le hook Web est déclenché et une génération est créée. Assurez-vous de définir votre espace de travail Jenkins pour delete workspace before each buildobtenir une nouvelle copie du nouveau code.


2
comment résolvez-vous le problème sur la question concernant la construction au moment même où la poussée sur la branche principale?
Custodio

4

Pas lié à Git, mais ci-dessous, j'aiderai en détail la configuration du travail Jenkins avec Mercurial. Cela peut aider d'autres personnes ayant un problème similaire.

  1. Installer le plugin de déclenchement d'URL
  2. Accédez à la page de configuration du travail et sélectionnez l' Poll SCMoption. Définissez la valeur sur* * * * *
  3. Cochez l'option: [URLTrigger] - Poll with a URL. Vous pouvez maintenant sélectionner certaines options comme le changement de date de modification, le contenu de l'URL, etc.
  4. Dans les options, sélectionnez Modifier le contenu de l'URL, sélectionnez la première option - Monitor change of content
  5. Enregistrez les modifications.

Maintenant, déclenchez des modifications dans le référentiel Mercurial par des tests de vérification.

Vérifiez que le travail Jenkins s'exécute désormais en détectant les modifications SCM. Lorsque la construction est exécutée en raison de modifications de Mercurial, vous verrez alors du texte Started by an SCM change. Sinon, l'utilisateur qui l'a démarré manuellement.


3

J'espère que cela aide: Comment déclencher une build Jenkins sur Git commit

Il s'agit simplement d'utiliser curl pour déclencher un travail Jenkins en utilisant les hooks Git fournis par Git.

La commande curl http://localhost:8080/job/someJob/build?delay=0secpeut exécuter un travail Jenkins, où someJobest le nom du travail Jenkins.

Recherchez le dossier "hooks" dans votre dossier caché .git. Renommez le fichier "post-commit.sample" en "post-commit". Ouvrez-le avec le Bloc-notes, supprimez la ligne ": Rien" et collez-y la commande ci-dessus.

C'est tout. Chaque fois que vous effectuez un commit, Git déclenchera les commandes post-commit définies dans le fichier.


J'ai été confondu ici avec votre commentaire au début parce que je pensais que je devais changer le "job" dans l'url ci-dessus en un nom de job. J'étais aussi confus parce que lorsque j'ai appuyé sur "Nouvel élément" dans Jenkins, j'ai mis en place un "Projet" pas un travail, donc quand vous avez référencé "someJob" ci-dessus, je ne savais pas que c'était le nom de mon projet. J'ai finalement trouvé l'URL dont j'avais besoin: localhost: 8078 / job / codecept% 20tests / build où "codecept% 20tests" était le nom de mon projet. Merci pour votre solution
Paul Preibisch

1
Merci Paul. J'ai mis à jour le billet de blog avec une note supplémentaire, mentionnant votre solution. Le "% 20" sera particulièrement utile aux autres.
Nav

3

Intégration continue avec Jenkins, après que le code est poussé vers le référentiel à partir de la commande Git / GUI:

  1. Créez un travail dans Jenkins avec uniquement le nom du travail et sélectionnez le type de projet freestyle. Cliquez OK. La page suivante n'ajoute rien - il suffit de cliquer Save.
  2. Accédez au référentiel Git local où vous avez le code source et accédez au .git/hooksdossier.
  3. Le hooksdossier contient les quelques fichiers. Vérifiez le "post-commit". S'il n'est pas présent, créez un fichier, "post-commit" sans extension de fichier:

    C:\work\test\\.git\hooks\post-commit
    
  4. Editez le fichier "post-commit" avec la commande ci-dessous. Assurez-vous qu'il est présent dans votre dossier de hooks de code source local.

    curl -u userName:apiToken -X POST http://localhost:8080/jenkins/job/jobName/build?token=apiToken
    

    Exemple:

    curl -u admin:f1c55b3a07bb2b69b9dd549e96898384 -X POST http://localhost:8080/jenkins/job/Gitcommittest/build?token=f1c55b3a07bb2b69b9dd549e96898384
    

    5.

    userName: Nom d'utilisateur Jenkins

    jobName: Nom du travail de la build

    apiToken: Pour obtenir votre token API, accédez à votre page utilisateur Jenkins (en haut à droite de l'interface). Il est disponible dans le menu "Configurer" à gauche de la page: "Afficher le token API"

  5. Apportez des modifications dans votre code source et validez le code dans le référentiel.

  6. Votre travail http://localhost:8080/jenkins/job/Gitcommittest/devrait être de construire.


3

Vous devez spécifier la branche. Par défaut, il écoute tout. Voir le billet de blog Hudson: plugins Git et Maven .


J'ai récemment configuré Jenkins au travail pour extraire les modifications de git sur une branche spécifiée. Fonctionne bien. +1
Greg K

J'ai également défini ce paramètre. Ce que je remarque, c'est que Jenkins est informé de chaque poussée vers github et y réagit, mais n'exécute les étapes de construction que si le maître de branche a changé. Nous obtenons donc une tonne de faux rapports de construction qui disent "Aucun changement". Observez-vous également ce comportement?
Ziggy

La question initiale est de savoir comment résoudre le déclencheur large et inutile (se déclenchant lorsque quelqu'un pousse sur une branche) configuré dans votre réponse. Si vous avez 5 tâches jenkin avec la même configuration, sauf que la première branche d'écoute de la tâche principale, la seconde la branche devel, la troisième la branche FeatureX et ainsi de suite, lorsque vous poussez uniquement vers la branche FeatureX, toutes les tâches jenkins seront déclenchées ce qui conduira à surcharge de travail avec des builds très lents.
geoom

2

Plugin générique de déclenchement Webhook peut être configuré avec des filtres pour y parvenir.

Lorsqu'il est configuré avec

  • Une variable nommée refet expression$.ref .
  • Un filtre avec du texte $refet une expression de filtre comme ^refs/heads/master$.

Ensuite, ce travail se déclenchera pour chaque poussée vers master . Pas de sondage.

Vous voulez probablement plus de valeurs du webhook pour effectuer réellement la construction. Ajoutez simplement plus de variables, avec JSONPath, pour choisir ce dont vous avez besoin.

Il existe des cas d'utilisation ici: https://github.com/jenkinsci/generic-webhook-trigger-plugin/tree/master/src/test/resources/org/jenkinsci/plugins/gwt/bdd


Qu'est-ce que "achi" ?
Peter Mortensen

C'est / était une faute d'orthographe.
Tomas Bjerre

comment saisir le $ GITCOMMIT dans Jenkins, il semble toujours être nul avec un webhook. Impossible de renvoyer le statut pour dire succès ou échec.
user3520245

1

Dans mon organisation actuelle, nous ne le faisons pas en master mais le faisons à la fois sur le développement et la version / branches (nous utilisons Git Flow), afin de générer des builds de snapshots.

Comme nous utilisons un pipeline multi-branches, nous le faisons dans le fichier Jenkins avec la syntaxe when {} ...

stage {
    when { 
        expression { 
            branch 'develop'
        }
    }
}

Ceci est détaillé dans cet article de blog: https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/#longer-pipeline


1

Les réponses ci-dessus sont correctes mais je m'adresse à elles qui sont novices ici pour leur simplicité

en particulier pour définir le déclencheur de génération pour le pipeline:

Considérez que vous avez deux branches Github: 1.master, 2.dev et Jenkinsfile (où le script de pipeline est écrit) et d'autres fichiers sont disponibles sur chaque branche

Configurer un nouveau projet de pipeline (pour la branche dev)

## 1.Intégration de code avec git-plugin et approche basée sur cron Le plugin git préalable doit être installé et configuré avec votre nom et votre adresse e-mail

  1. Section générale.Cochez la case - 'Ce projet est paramétré' et ajoutez Nom-SBRANCH Valeur par défaut-'refs / remotes / origin / dev '
  2. Build triggers section "Check checkbox - 'Poll SCM' and schedule as per need for check commits eg '* / 1 * * * *' to check every minute
  3. Section de définition de pipeline Sélectionnez - Script de pipeline à partir de SCM -> sélectionnez git -> URL addRepository -> ajoutez des informations d'identification git -> choisissez avancé -> ajoutez Nom - origine, RefSpec- '+ refs / heads / dev: refs / remotes / origin / dev '(dev est la branche github) -> Branches à construire - $ {SBRANCH} (Nom du paramètre de la référence 1er point) -> Chemin du script—> Jenkinsfile -> Décochez Lightweightcheckout
  4. Appliquer—> enregistrer

## 2.Intégration de code: approche github-plugin et webhook Prérequis Le plugin Github doit être installé et le serveur Github doit être configuré, la connexion doit être testée si vous ne pensez pas à suivre la configuration

Configurer le plugin Github avec un compte sur Jenkins

Section GitHub Ajouter un serveur Github s'il n'est pas présent URL de l'API: https://api.github.com Informations d'identification: ajouter du texte secret (cliquez sur le bouton Ajouter: sélectionnez le type de texte secret) avec une valeur Jeton d'accès personnel (Générez-le à partir de vos comptes Github -> paramètres -> paramètre développeur—> jeton d'accès personnel—> ajouter un jeton—> vérifier les étendues—> copier le jeton) Tester la connexion—> Vérifier s'il est connecté à votre compte Github ou non Cochez la case avec la section Gérer les crochets à l'avance, sélectionnez simplement identifiant précédent pour «secret partagé»

Ajoutez le webhook s'il n'est pas ajouté à votre référentiel par

  1. Accédez au paramètre Github Repository -> ajouter un webhook -> ajouter une URL
    http: // Public_IP: Jenkins_PORT / github-webhook /
  2. Ou si vous n'avez pas Public_IP, utilisez ngrok . Installez, authentifiez-vous, obtenez l'adresse IP publique à partir de la commande ./ngrok http 80 (utilisez votre jenkins_port) puis ajoutez webhook -> ajoutez l'URL http: // Ngrok_IP / github-webhook /
  3. Testez-le en fournissant une charge utile à partir de la page du webhook et vérifiez si vous obtenez le statut 200 ou non.

Si vous avez le plugin Github Pull requests, configurez-le également avec l'URL Jenkins publiée.

  1. Section générale.Cochez la case - 'Projet Github' ajoutez l'URL du projet - (lien github se terminant par '.git /')
  2. Section générale.Cochez la case - 'Ce projet est paramétré' et ajoutez Nom-SBRANCH Valeur par défaut-'refs / remotes / origin / dev '
  3. Build triggers.section.Check checkbox - 'GitHub hook trigger for GITScm polling'
  4. Section de définition du pipeline: sélectionnez - Script de pipeline depuis SCM—> sélectionnez git—> URL addRepository—> ajoutez les informations d'identification git—> choisissez avancé -> ajoutez Nom- origine, RefSpec- '+ refs / heads / dev: refs / remotes / origin / dev '(dev est la branche github) -> Branches à construire - $ {SBRANCH} (nom du paramètre à partir du point de référence 1.) -> Chemin du script—> Jenkinsfile—> Uncheck Lightweightcheckout
  5. Appliquer—> enregistrer


0

Ma solution pour un serveur git local: accédez à votre répertoire de raccordement du serveur git local, ignorez le fichier update.sample existant et créez un nouveau fichier nommé littéralement "mise à jour", tel que:

gituser@me:~/project.git/hooks$ pwd
/home/gituser/project.git/hooks
gituser@me:~/project.git/hooks$ cat update
#!/bin/sh
echo "XXX from  update file"
curl -u admin:11f778f9f2c4d1e237d60f479974e3dae9 -X POST http://localhost:8080/job/job4_pullsrc_buildcontainer/build?token=11f778f9f2c4d1e237d60f479974e3dae9

exit 0
gituser@me:~/project.git/hooks$ 

L'instruction echo sera affichée sous votre résultat git push, le jeton peut être extrait de la configuration de votre travail jenkins, parcourez-le pour le trouver. Si le fichier "update" n'est pas appelé, essayez d'autres fichiers du même nom sans l'extension "sample".

C'est tout ce dont vous avez besoin

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.