Est-il possible pour Jenkins de détecter et de créer automatiquement les balises nouvellement créées dans un repository git?

Ce serait bien pour notre serveur CI Jenkins de détecter, déployer et construire automatiquement les balises au fur et à mesure de leur création dans notre repository Github.

Est-ce possible?

Avec la configuration suivante, vous pouvez créer un travail en créant toutes les balises:

  1. Faites que le travail récupère les balises comme si elles étaient des twigs: Cliquez sur le bouton Avancé sous l’URL du référentiel et entrez les Refsec +refs/tags/*:refs/remotes/origin/tags/* refs +refs/tags/*:refs/remotes/origin/tags/*
  2. A-t-il construit toutes les balises “twigs” avec le spécificateur de twig */tags/*
  3. Activez l’interrogation SCM pour que le travail détecte les nouveaux tags.

Cette approche a un inconvénient: le travail va créer toutes les balises et pas seulement les balises nouvellement ajoutées. Ainsi, une fois le travail créé, il sera déclenché une fois pour chaque tag existant. Ainsi, vous souhaiterez probablement que le travail ne fasse rien au début, puis attendez que toutes les balises existantes aient été traitées, puis configurez uniquement les étapes de construction à effectuer pour chaque nouvelle balise.

Comme les balises ne changent pas dans git, le travail ne sera déclenché qu’une seule fois pour chaque nouvelle balise.

Pour surmonter l’inconvénient de la réponse de @oberlies, à savoir que toutes les balises seront construites, j’utilise plutôt une génération de déclencheur spéciale. La génération de déclencheur utilise le même référentiel git et la même twig que la version principale et les étapes de post-construction suivantes.

Build -> Execute shell:

 # Get the most recent release tag. PATTERN="release-tag-[0-9][0-9]-[0-9][0-9][0-9][0-9]" TAG=$(git log --tags=$PATTERN --no-walk --pretty="format:%d" | grep -m 1 -o $PATTERN) # Due to a Jenkins limitation (https://issues.jenkins-ci.org/browse/JENKINS-8952) # when passing environment variables we have to write the tag to a file and # inject it later again. mv release.properties release-old.properties || true echo "TAG = $TAG" > release.properties # Fail the build if the most recent release tag did not change. ! diff release.properties release-old.properties 

Build -> Injecter des variables d’environnement :

 Properties File Path: release.properties 

Actions post-construction ->: déclencheur paramétré sur d’autres projets

 Projects to build:  Trigger when build is: Stable Parameters: TAG=$TAG 

Enfin, dans votre version principale, cochez “Cette version est paramétrée” avec le paramètre de chaîne suivant

 Name: TAG Default Value:  

Et dans la section “Gestion du code source”, utilisez “$ TAG” dans le champ “Branches à construire”.

Vous pouvez installer un hook post-réception, qui vérifie si un tag a été validé, et crée un build dans jenkins.

Le crochet peut ressembler à ceci [*]:

 #!/usr/bin/env python import sys from subprocess import Popen, PIPE, check_call def call_git(command, args): return Popen(['git', command] + args, stdout=PIPE).communicate()[0] JENKINS = 'http://localhost:8002/jenkins' TOKEN = 'asdf8saffwedssdf' jobname = 'project-tag' def handle_ref(old, new, ref): print 'handle_ref(%s, %s, %s)' % (old, new, ref) if not ref.startswith('refs/tags/'): return url = '%s/job/%s/buildWithParameters?token=%s&branch=%s' % ( JENKINS, jobname, TOKEN, new) print "queueing jenkins job " + jobname + " for " + new check_call(["wget", "-O/dev/null", "--quiet", url]) if __name__ == '__main__': for line in sys.stdin: handle_ref(*line.split()) 

[*] note: il s’agit d’une conversion rapide à partir d’un script légèrement différent, il est donc probable qu’il y ait quelques petits bogues ici. C’est surtout pour montrer l’idée.

Côté jenkins, vous devez configurer un travail paramétré. Le seul paramètre est ‘twig’.

  1. Vérifiez que cette version est paramétrée et ajoutez le paramètre
  2. Dans ‘gestion du code source -> twigs pour construire’ mettre ‘$ branch’

Cela donne un moyen assez sécurisé et robuste de construire. Pour tester, exécutez une génération via l’interface Web, il vous demandera la valeur du paramètre.

Vous pouvez utiliser l’option “Git Publisher” qui fait partie du plug-in Git pour créer une balise après une génération / un déploiement réussi.