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

Intégration Continue Discussion :

Lancer et attendre la fin d'un build par code [Hudson]


Sujet :

Intégration Continue

  1. #1
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    Par défaut Lancer et attendre la fin d'un build par code
    Bonjour,

    Je cherche à faire un bout de code qui lance un job et qui attende qu'il soit fini.

    Pour le lancement, il y a de nombreux exemples sur le web à base de requête GET sur l'url qui va bien, mais pour l'attente, je n'ai rien trouvé.

    On peut récupérer l'état du build dans "job/numéro de build/api/xml" (Build en cours, réussi, échoué...).

    Mais comment déterminer le numéro de build que l'on a lancé par code ?

    Essayer de faire des déductions en regardant le numéro du dernier build à un moment ou a un autre me paraît hasardeux...

    Des idées ?
    Merci d'avance.

    (L'objectif final est de lancer automatiquement plusieurs dizaines de jobs paramétrisés qui dépendent les uns des autres. Cela me semble trop compliqué par plugin même si le couple Join Plugin + Parameterized Trigger Plugin fonctionnait.)

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 350
    Points : 794
    Points
    794
    Par défaut
    Déclencher un job Hudson par commande en ligne avec un wget ou un curl par exemple est très simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    curl http://server/hudson/job/MYJOB/build --user "user:password"
    Il est possible de récupérer via API, le dernier build et le prochain numéro de build
    Par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    http://server/hudson/job/MYJOB/api/xml
    donne le flux suivant:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    <lastBuild>
    <number>861</number>
    <url>
    http://server/hudson/job/MYJOB/861/
    </url>
    </lastBuild>
    <lastCompletedBuild>
    <number>861</number>
    <url>
    http://server/hudson/job/MYJOB/861/
    </url>
    </lastCompletedBuild>
    <lastStableBuild>
    <number>861</number>
    <url>
    http://server/hudson/job/MYJOB/861/
    </url>
    </lastStableBuild>
    <lastSuccessfulBuild>
    <number>861</number>
    <url>
    http://server/hudson/job/MYJOB/861/
    </url>
    </lastSuccessfulBuild>
    <nextBuildNumber>862</nextBuildNumber>
    Nous avons dans la section lastBuild, le dernier numéro de build et nous avons une section <nextBuildNumber> donnant le prochaine numéro de build.

    Pour ton besoin: je suggère d'invoquer un build et de scrupter le résultat du flux XML produit par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    http://server/hudson/job/MYJOB/lastBuild/api/xml
    Tu as dans ce flux une section <building> à true quand c'est pas fini et à false quand c'est fini

    Ton programme va donc intéroger régulièrement ce contenu et s'arréter quand la valeur de cette section est false.

    Mais delà de ta demande: quelle est réellement ton besoin?
    En effet, il est usuellement déconseillé de mettre en place un système de gestion de dépendances au niveau Hudson (pour ma part, j'évite d'utiliser donc les plugins Build Parameterized et Join).
    C'est au niveau de ton outil de build de diriger les dépendances.

  3. #3
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    Par défaut
    Merci, J'ai effectivement mis en place cette méthode et ça semble bien fonctionner en pratique.

    Concernant ma problématique, il s'agit de construire une très grosse appli écrite en différent langages (Portables ou non), avec différents outils de construction (Makefile, maven, génération de Makefiles en perl...). Le tout sur plus de 10 plateformes. Entre les builds et les tests, on devrait approcher 12 heures, malgré la parallélisation des jobs. Donc je me vois mal faire un seul job.

    Pourquoi ne pas avoir fait des modules ? Bin d'une part déjà c'est bien diviser en modules (> 400...) et d'un autre point de vue, notre usine à gaz n'est en fait qu'un module de l'application qui nous embarque.

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 350
    Points : 794
    Points
    794
    Par défaut
    Je ne t'ai jamais dit de faire uniquement un seul Job Hudson mais j'ai juste alerté sur la mauvaise pratique de laisser Hudson la responsabilité de gérer les dépendances de build. Il n'a pas été conçu pour cela et il est très limité pour ce besoin.

    A la place, il faut mettre en place une approche par librairie réutilisable et de déclenchement par événements.

  5. #5
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    Par défaut
    Qu'entends tu par déclenchement par évènement ?

    Comment gérer le cas "lorsque plusieurs jobs sont terminés, lancer 2 autres jobs simultanément." avec cette approche évènementielle ?

    Merci d'avance pour les éclaircissements.

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    350
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 350
    Points : 794
    Points
    794
    Par défaut
    Un job Hudson représente un processus d'intégration.
    Il est possible d'enchaîner deux jobs ou même dans ton cas de vouloir enchaîner deux jobs, s'exécutant simultanément en parallèle de manière indépendante l'un de l'autre.
    Mais au-delà de cette possibilité, cela doit être limité et réservé dans des situations particulières comme par exemple un processus d'intégration rapide suivant d'un processus plus complet.
    Le premier processus contiendra l'ensemble des étapes obligatoires pour par exemple la construction et mise a disposition des logiciels, avec un critère de rapidité pour donner le plus rapidement un feedback aux équipes de développement.
    Le second processus contient tous les restes des étapes (dit étapes optionnelles) avec des étapes qui pourront prendre plus de temps de par leurs natures

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 25
    Points : 18
    Points
    18
    Par défaut Script qui interprete l'output d'un build
    Salut à tous !

    Je suis en train de réfléchir sur un problème similaire.
    J'aimerais pouvoir lancer un build sur Hudson par URL à partir d'une commande depuis le terminal et avoir un message me disant si le build a échoué ou pas
    Je n'y connais rien dans les scripts bash donc est-ce que vous pouvez m'orienter pour faire qqch comme le suggérait gboissinot pour attendre que le build soit terminé et suivant son statut me dire si c'est OK ou pas...

    Merci beaucoup

  8. #8
    Membre éclairé Avatar de rt15
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2005
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 262
    Points : 665
    Points
    665
    Par défaut
    Salut,

    Personnellement, j'ai fait un bout de code en java. L'ensemble est assez fourni au final (Gestion des builds déjà lancés avant l'utilisation du programme, fichier de config décrivant la succession de builds à lancer...).

    J'ai préféré le java simplement car je savais que je n'aurais pas de problèmes pour traiter le xml avec ce langage (xml des différents /xml/api).

    [troll]Et aussi pour la puissance du java, même si le java, c'est de la merde.[/troll]

    De ce que j'en sais, le bash n'est pas idéal pour le xml. Une petite regex bien sentie doit cependant suffire. Côté requêtes, comme indiqué par gboissinot, wget ou curl feraient amplement l'affaire.

    Je te donnerais volontiers mon java (Rien de sorcier en fait), mais bon comme c'est du code pour le boulot, je ne penses pas que ce serait très judicieux.

    Je pourrais cependant poster ici un bout de code java qui ne fait que lancer un build, attendre sa fin et récupérer son status si tu peux attendre une semaine (Je suis en vacance !)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Merci beaucoup pour ta réponse

    Ben en fait je comptais faire ça en bash sans parser le xml mais juste en vérifiant la page "console" du build en cours et en faisant qqch comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl -s "http://HUDSONSERVER/job/MYJOB/IDBUILD/console" | grep 'Finished:'
    avec "Finished:" qui est la dernière ligne de la console et qui indique le statut...

    Bref je sais pas trop en fait

    Non c'est vraiment gentil mais ne t'embête pas, je vais me débrouiller... Profite bien de tes vacances

    Un grand merci en tout cas !

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Ah ben c'est bon, je pense avoir trouvé...
    Bon ya peut-être plus simple pour récupérer le numéro du build (variable ID) mais bon, ça semble bien marcher comme ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #!/bin/sh
    
    ### VARIABLES ###
    JOBNAME=CURRENT_RELEASE
    HUDSON="http://serveurhudson:8080"
    RELEASE=1031
    SILENT="-q"
    ID=$(wget -O - $SILENT  "$HUDSON/job/$JOBNAME/buildWithParameters?RELEASE=$RELEASE" | grep -s "          #"  | cut -d "#" -f 2)
    RES1=$(wget -O - $SILENT "$HUDSON/job/$JOBNAME/$ID/console" | grep "BUILD SUCCESSFUL" )
    RES2=$(wget -O - $SILENT "$HUDSON/job/$JOBNAME/$ID/console" | grep "BUILD FAILED" )
    #################
    
    echo -n "Waiting"       # Message d'attente
    
    while  [ -z "$RES2" ] && [ -z "$RES1" ] ;
    do
            sleep 2
            echo -n "."
            RES1=$(wget -O - $SILENT "$HUDSON/job/$JOBNAME/$ID/console" | grep "BUILD SUCCESSFUL" )
            RES2=$(wget -O - $SILENT "$HUDSON/job/$JOBNAME/$ID/console" | grep "BUILD FAILED" )
    done
    
    if [ -z "$RES2" ]; then
            echo " $RES1"                           # Si build successful
    else
            echo " $RES2: $HUDSON/job/$JOBNAME/$ID" # Si build failed
    fi

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 08/06/2007, 15h36
  2. Réponses: 4
    Dernier message: 24/01/2007, 00h48
  3. [Système] Lancer un script sans attendre sa fin ?
    Par parisien dans le forum Langage
    Réponses: 9
    Dernier message: 03/11/2005, 22h09
  4. [Système] Lancer un executable sans attendre la fin
    Par raptor70 dans le forum Langage
    Réponses: 1
    Dernier message: 27/10/2005, 14h25
  5. [Dos] Lancer une commande dos sans attendre la fin
    Par MrEddy dans le forum Windows
    Réponses: 4
    Dernier message: 09/06/2005, 17h38

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