2016-06-14 1 views
0

J'ai lu How can I set the job timeout using the Jenkins DSL. Cela définit le délai d'attente pour un travail. Je veux le définir pour tous les travaux et avec des paramètres légèrement différents: 150%, moyenne sur 10 tâches, avec un maximum de 30 minutes.Comment puis-je définir le délai d'attente pour tous les travaux à l'aide du Jenkins DSL

Selon le relevant job-dsl-plugin documentation j'utiliser cette syntaxe:

job('example-3') { 
    wrappers { 
     timeout { 
      elastic(150, 10, 30) 
      failBuild() 
      writeDescription('Build failed due to timeout after {0} minutes') 
     } 
    } 
} 

J'ai testé dans http://job-dsl.herokuapp.com/ et c'est la partie XML pertinente:

<buildWrappers> 
    <hudson.plugins.build__timeout.BuildTimeoutWrapper> 
     <strategy class='hudson.plugins.build_timeout.impl.ElasticTimeOutStrategy'> 
      <timeoutPercentage>150</timeoutPercentage> 
      <numberOfBuilds>10</numberOfBuilds> 
      <timeoutMinutesElasticDefault>30</timeoutMinutesElasticDefault> 
     </strategy> 
     <operationList> 
      <hudson.plugins.build__timeout.operations.FailOperation></hudson.plugins.build__timeout.operations.FailOperation> 
      <hudson.plugins.build__timeout.operations.WriteDescriptionOperation> 
       <description>Build failed due to timeout after {0} minutes</description> 
      </hudson.plugins.build__timeout.operations.WriteDescriptionOperation> 
     </operationList> 
    </hudson.plugins.build__timeout.BuildTimeoutWrapper> 
</buildWrappers> 

J'ai vérifié avec un travail que je modifié manuellement avant, et le XML est correct. Donc, je sais que la syntaxe DSL Jenkins jusqu'à ici est correcte.


Maintenant je veux l'appliquer à tous les travaux. D'abord j'ai essayé de lister tous les noms de travail:

import jenkins.model.* 

jenkins.model.Jenkins.instance.items.findAll().each { 
    println("Job: " + it.name) 
} 

Cela fonctionne aussi, tous les noms de travail sont imprimés sur la console.


Maintenant, je veux tout brancher ensemble. Ceci est le code complet j'utilise:

import jenkins.model.* 

jenkins.model.Jenkins.instance.items.findAll().each { 
    job(it.name) { 
    wrappers { 
     timeout { 
     elastic(150, 10, 30) 
     failBuild() 
     writeDescription('Build failed due to timeout after {0} minutes') 
     } 
    } 
    } 
} 

Quand je pousse ce code et Jenkins exécute le travail des semences DSL, je reçois cette erreur:

ERROR: Type of item "jobname" does not match existing type, item type can not be changed 

ce que je fais mal ici?

Répondre

1

Le plug-in Job-DSL ne peut être utilisé que pour la maintenance des travaux créés auparavant par ce plug-in. Vous essayez de modifier la configuration des tâches qui ont été créées d'une autre manière - cela ne fonctionnera pas.

Pour masse modification des emplois existants (comme, dans votre cas, en ajoutant le délai d'attente) de la façon la plus simple est de changer directement la spécification XML du travail,

  • soit en modifiant le fichier config.xml sur le disque, ou
  • en utilisant la REST API ou CLI

xmlstarlet est un outil puissant pour effectuer ces tâches directement au niveau du shell.

Alternativement, il est possible d'effectuer la modification via un script Groovy à partir de la "Script Console" - mais pour cela vous avez besoin de comprendre le fonctionnement interne de Jenkins et les structures de données.

+0

Merci. Je n'ai trouvé aucune documentation indiquant que le plugin Job-DSL ne peut conserver que les jobs créés par ce plugin. Franchement, cela limite sévèrement sa facilité d'utilisation pour moi. Merci d'avoir suggéré xmlstarlet, je l'ai utilisé dans le passé. Ou peut-être que je vais juste appliquer de la magie grep & sed. –