2017-02-07 11 views
2

Я пытаюсь получить построить длительность нашего сообщения, но он всегда возвращает 0.Дженкинс Pipeline currentBuild возвращает время продолжительности всегда 0

От чтения документации, пройдя через Слак источник плагина и читать другие ресурсы, я должен быть в состоянии сделать один из следующих:

def duration = currentBuild.duration 
def duration = currentBuild.durationString 
def duration = currentBuild.durationString() 
def duration = currentBuild.getDurationString() 

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

Структура трубопровода выглядит примерно так:

node { 
    try { 
     stage("Stage 1"){} 
     stage("Stage 2"){} 
    } catch (e) { 
     currentBuild.result = "FAILED" 
     throw e 
    } finally { 
     notifyBuild(currentBuild.result) 
    } 
} 

def notifyBuild(String buildStatus = 'STARTED') { 
    def duration = currentBuild.duration; 
} 

Мой вопрос:

  1. Почему я не получаю от продолжительности
  2. Есть ли способ в трубопроводе, чтобы указать " после сборки "шаг? Из того, что я прочитал попробовать выделяющийся должен работать таким образом

Мое временное решение заключается в использовании:

int jobDuration = (System.currentTimeMillis() - currentBuild.startTimeInMillis)/1000; 

Который работает отлично, но всегда дает время в секундах, и я думаюcurrentBuild.duration должно быть достаточно умна, чтобы дать различные единицы (?)

ответ

2

Update 2018-02-19, это было зафиксировано с 2.14 выпуска трубопроводной поддержки API плагинов, см this issue

Невозможно найти документацию о том, когда ожидается duration. Но, судя по from the implementation, кажется, что он установлен сразу после завершения выполнения/сборки. Я предполагаю, что он доступен для объекта currentBuild, поскольку это тот же объект, который используется для представления currentBuild.previousBuild, который может быть завершен.

Так, чтобы ответить на ваши вопросы:

  1. Продолжительность поле действует только после того, как сборка завершена.
  2. Нет, нет способа указать шаг «после сборки».

С учетом сказанного, я думаю, что ваш обходной путь является хорошим решением (может обернуть его в функции и поставить ее в GPL (Global Public Library).

Что касается окончательного бонусный вопрос I think the currentBuild.duration should be smart enough to give different units (?). Если вы ссылаетесь на красиво отформатированную строку, например Took 10min 5sec, currentBuild.duration не даст вам никакого хорошего форматирования, так как она просто возвращает длинное значение с количеством секунд, прошедших. Вместо этого вы можете позвонить hudson.Util#getTimeSpanString(long duration). :

import hudson.Util; 

... 

echo "Took ${Util.getTimeSpanString(System.currentTimeMillis() - currentBuild.startTimeInMillis)}" 

Это вернет красиво отформатированную строку с текущей продолжительностью сборки.

+0

Определение глобальной библиотеки сделало трюк и полезна для других вещей. Спасибо – Tom

+0

Да.глобальные библиотеки - это лучшая вещь, поскольку нарезанный хлеб или, может быть, Дженкинс - это, во всяком случае, GPL - отличная возможность ... –

+0

Это определенно уменьшит некоторые мои конвейеры - eq отправит слабые уведомления и т. д. Дженкинс замечательный, я просто хочу, чтобы там будет более и более четкая документация ... – Tom