2016-06-14 7 views
0

Я прочитал How can I set the job timeout using the Jenkins DSL. Это задает тайм-аут для одной работы. Я хочу установить его для всех заданий и с небольшими настройками: 150%, усредненный более 10 заданий, максимум 30 минут.Как установить тайм-аут задания для всех заданий с помощью Jenkins DSL

Согласно relevant job-dsl-plugin documentation я должен использовать этот синтаксис:

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

я тестировал в http://job-dsl.herokuapp.com/ и это соответствующий XML часть:

<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> 

Я проверил с работой я редактировал вручную раньше, и XML правильный. Поэтому я знаю, что синтаксис Jenkins DSL до сих пор верен.


Теперь я хочу применить это ко всем работам. Сначала я попытался перечислить все названия:

import jenkins.model.* 

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

Это тоже работает, все имена заданий печатаются на консоль.


Теперь я хочу подключить все это вместе. Это полный код я использую:

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') 
     } 
    } 
    } 
} 

Когда я нажимаю этот код и Дженкинс работает семенную работу DSL, я получаю эту ошибку:

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

Что я делаю неправильно здесь?

ответ

1

Плагин Job-DSL может использоваться только для поддержки заданий, которые были созданы этим плагином раньше. Вы пытаетесь изменить конфигурацию заданий, которые были созданы каким-то другим способом - это не сработает.

Для массового изменения существующих рабочих мест (как, в вашем случае, добавив таймаут) самый простой способ изменить спецификации XML-задания непосредственно,

  • либо путем изменения config.xml файла на диске, или
  • с использованием REST или CLI API

xmlstarlet является мощным инструментом для выполнения таких задач, непосредственно на уровне оболочки.

В качестве альтернативы можно выполнить изменение с помощью скрипта Groovy из «Консоли сценария», но для этого вам нужно некоторое понимание внутренних процессов и структур данных Дженкинса.

+0

спасибо. Я не нашел никакой документации, в которой говорилось, что плагин Job-DSL может поддерживать только рабочие места, созданные этим плагином. Честно говоря, это серьезно ограничивает его юзабилити для меня. Спасибо за предложение xmlstarlet, я использовал его в прошлом. Или, может быть, я просто применил магию grep & sed. –