web-dev-qa-db-fra.com

Obtenir le statut de construction dans un script post-génération

Je voudrais avoir un hook post-build ou similaire, afin que je puisse avoir le même résultat que e. g. le plugin IRC, mais donnez-le à un script. J'ai pu obtenir toutes les informations, à l'exception du statut de construction réel. Cela ne fonctionne tout simplement pas, pas plus en tant que "script post-build", "tâche post-build", "déclencheur paramétré" etc.

C'est possible avec certaines solutions de contournement très laides, mais je voulais demander, au cas où quelqu'un aurait une meilleure option ... à moins d'écrire mon propre plugin.

13
smlgbl

Utilisez le script Groovy en post-construction via Groovy Post-Build plugin . Vous pouvez ensuite accéder aux composants internes de Jenkins via API Java Jenkins . Le plugin fournit au script la variable manager qui peut être utilisée pour accéder à des parties importantes de l'API (voir la section Usage dans la documentation du plugin).

Par exemple, voici comment vous pouvez exécuter un script Python externe simple sous Windows et générer son résultat (ainsi que le résultat de la construction) pour créer la console:

def command =  """cmd /c python -c "for i in range(1,5): print i" """
manager.listener.logger.println command.execute().text

def result = manager.build.result
manager.listener.logger.println "And the result is: ${result}"
8
malenkiy_scot

Cela fonctionne comme indiqué avec le plugin Groovy Post-Build, mais sans aucune citation supplémentaire dans la chaîne exécutée. Il a donc fallu que je mette la fonctionnalité réelle dans un script Shell, qui appelle à curl, ce qui oblige à citer les paramètres POST.

def result = manager.build.result
def build_number = manager.build.number
def env = manager.build.getEnvironment(manager.listener)
def build_url = env['BUILD_URL']
def build_branch = env['SVN_BRANCH']
def short_branch = ( build_branch =~ /branches\//).replaceFirst("")
def Host = env['NODE_NAME']
def svn_rev = env['SVN_REVISION']
def job_name = manager.build.project.getName()


"/usr/local/bin/skypeStagingNotify.sh Deployed ${short_branch} on ${Host} - ${result} - ${build_url}".execute()
8
smlgbl

Solution vraiment facile, peut-être pas trop élégante, mais ça marche!

1: Catch tout le résultat de la construction que vous voulez capturer (dans ce cas, SUCCESS).

2: Injecter une variable env valorisée avec le statut du travail

 Step 1

3: Faites la même chose pour tout type d’autre statut (dans ce cas, j’arrête d’avorter à instable)

 enter image description here

4: Après, vous pourrez utiliser la valeur pour tout ce que vous voulez faire. Dans ce cas, je la passe à un script ANT! (Ou vous pouvez le charger directement depuis ANT en tant que variable d'environnement ...)

 enter image description here

J'espère que ça peut aider!

3
ivoruJavaBoy

Pour cela, j’aime beaucoup l’étape Conditional Build Step plugin. C'est très flexible et vous pouvez choisir les actions à prendre en fonction de l'échec ou du succès de la construction. Par exemple, voici un cas où j'utilise une étape de construction conditionnelle pour envoyer une notification en cas d'échec de la construction:

 enter image description here

Vous pouvez également utiliser l’étape de construction conditionnelle pour définir une variable d’environnement ou écrire dans un fichier journal que vous utiliserez dans les étapes suivantes "exécuter Shell". Ainsi, par exemple, vous pouvez créer une construction en trois étapes: une étape pour compiler le code/exécuter des tests, une autre pour définir une variable d’environnement STATUS="failed", puis une troisième étape qui envoie un courrier électronique du type The build finished with a status: ${STATUS}

3
Matt Korostoff

Essayez Post Build Build plugin ...

Il vous permet de spécifier des conditions en fonction de la sortie du journal ...

1
ATOzTOA

Solution de base (s'il vous plaît ne riez pas)

#!/bin/bash
STATUS='Not set'
if [ ! -z $UPSTREAM_BUILD_DIR ];then
  ISFAIL=$(ls -l /var/lib/jenkins/jobs/$UPSTREAM_BUILD_DIR/builds | grep "lastFailedBuild\|lastUnsuccessfulBuild" | grep $UPSTREAM_BUILD_NR)
  ISSUCCESS=$(ls -l /var/lib/jenkins/jobs/$UPSTREAM_BUILD_DIR/builds | grep "lastSuccessfulBuild\|lastStableBuild" | grep $UPSTREAM_BUILD_NR)
  if [ ! -z "$ISFAIL" ];then
     echo $ISFAIL
     STATUS='FAIL'
  Elif [ ! -z "$ISSUCCESS" ]
  then
     STATUS='SUCCESS'
  fi
fi
echo $STATUS

où 

$ UPSTREAM_BUILD_DIR = $ JOB_NAME 

$ UPSTREAM_BUILD_NR = $ BUILD_NUMBER

passé de la construction en amont

Bien sûr, "/ var/lib/jenkins/jobs /" dépend de votre installation de jenkins

0
fearis