2013-07-28 1 views
6

J'ai créé une tâche Gradle spécifique qui ne devrait être appelée que dans le système de construction Jenkins. Je dois faire en sorte que cette tâche dépende d'une autre qui devrait marquer la HEAD de la branche master après une compilation réussie du projet.Comment valider/pousser un tag Git avec Gradle?

Je n'ai aucune idée de comment je peux commettre/pousser/ajouter des étiquettes à une branche spécifique dans le référentiel distant en utilisant Gradle. Quel est le moyen le plus facile d'y parvenir?

Toute aide est vraiment apprécié ...

+0

L'utilisation d'Exec? http://www.gradle.org/docs/current/dsl/org.gradle.api.tasks.Exec.html –

+1

[gradle-git plugin] (https://github.com/ajoberstar/gradle-git) bien. –

+0

@JBNizet Hum, peut-être ... Je vais devoir me pencher là-dessus. –

Répondre

3

Vous pouvez utiliser Exec comme indiqué dans le commentaire ci-dessus ou utilisez JGit pour pousser balise. Créez un plugin/classe dans java et utilisez-le gradle

+0

Les deux solutions sont sympa mais j'ai fini par utiliser celle-ci ... Impossible de faire fonctionner SSH avec le plugin gradle-git et ça marche en appelant la ligne de commande. Je n'ai plus de temps à perdre et j'en ai besoin. –

13

Voici comment vous pouvez implémenter votre scénario avec le Gradle Git plugin. La clé est de regarder le Javadocs fourni du plugin.

buildscript { 
    repositories { 
     mavenCentral() 
    } 

    dependencies { 
     classpath 'org.ajoberstar:gradle-git:0.6.1' 
    } 
} 

import org.ajoberstar.gradle.git.tasks.GitTag 
import org.ajoberstar.gradle.git.tasks.GitPush 

ext.yourTag = "REL-${project.version.toString()}" 

task createTag(type: GitTag) { 
    repoPath = rootDir 
    tagName = yourTag 
    message = "Application release ${project.version.toString()}" 
} 

task pushTag(type: GitPush, dependsOn: createTag) { 
    namesOrSpecs = [yourTag] 
} 
+0

Cela semble être la voie à suivre et ça marche jusqu'à un certain point ... Je n'arrive pas à m'authentifier et à pousser sur le serveur. On me demande un mot de passe (pas de nom d'utilisateur) alors j'essaie d'utiliser la phrase secrète pour ma clé SSH mais ça ne fonctionne pas. Toute aide pour que l'authentification SSH fonctionne? –

+0

Utilisez-vous GitHub? Si oui, avez-vous enregistré votre clé SSH avec votre compte sur la page? Je vérifierais avec [la section FAQ de GitHub] (https://help.github.com/categories/56/articles). Si cela ne vous aide pas, j'envoie un email rapide à l'auteur du plugin. Il est très utile et réactif. –

+0

Non, ne pas utiliser GitHub pour cela? C'est une installation interne de GitLab. Ma clé SSH fonctionne avec mon client Git, uniquement avec ce plugin. –

2

I love this:

private void createReleaseTag() { 
    def tagName = "release/${project.version}" 
    ("git tag $tagName").execute() 
    ("git push --tags").execute() 
} 

EDIT: Une version plus étendue

private void createReleaseTag() { 
    def tagName = "release/${version}" 
    try { 
     runCommands("git", "tag", "-d", tagName) 
    } catch (Exception e) { 
     println(e.message) 
    } 
    runCommands("git", "status") 
    runCommands("git", "tag", tagName) 
} 

private String runCommands(String... commands) { 
    def process = new ProcessBuilder(commands).redirectErrorStream(true).start() 
    process.waitFor() 
    def result = '' 
    process.inputStream.eachLine { result += it + '\n' } 
    def errorResult = process.exitValue() == 0 
    if (!errorResult) { 
     throw new IllegalStateException(result) 
    } 
    return result 
} 

Vous pouvez gérer l'exception.

+0

comment géreriez-vous l'erreur quand une étiquette existe déjà ou ne peut pas être poussée? – kemuri

+0

@kemuri J'ai modifié ma réponse. Vous pouvez maintenant gérer les exceptions. –

+0

génial, je vais essayer – kemuri