Jenkins отправляет задачу сборки, если статус изменился с «неудачно» на «успешно» (исправлено)

В свободном задании Jenkins (в более старой версии 1.6x, без поддержки конвейерных заданий 2.x) я хотел бы запустить команду оболочки (curl -XPOST ...) в качестве шага после сборки, если статус сборки восстановился (!) с FAILED до SUCCESS .

Однако все плагины для определения статуса сборки, о которых я знаю, могут что-то делать только в том случае, если текущий статус сборки IS FAILED или SUCCESS, но не принимают во внимание, восстановился ли он по сравнению с последней сборкой.

Есть ли способ добиться этого, например. используя плагин Groovy Post build и несколько строк скрипта?


person Dirk    schedule 16.02.2018    source источник


Ответы (2)


Я обнаружил, что что-то вроде этого — хороший путь. Вы можете создать интересную логику, и переменная currentBuild имеет достойную документацию здесь: Документ переменной currentBuild

    script {
       if ( ( currentBuild.resultIsBetterOrEqualTo("SUCCESS") && currentBuild.previousBuild.resultIsWorseOrEqualTo("UNSTABLE") ) || currentBuild.resultIsWorseOrEqualTo("UNSTABLE")) {
         echo "If current build is good, and last build is bad, or current build is bad"
       }
    }
person user2312718    schedule 22.10.2020

Тем временем я нашел способ добиться этого. Это не обязательно красиво, и я все еще ценю альтернативные решения :)

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

Затем создайте шаг пост-сборки «Выполнить набор скриптов», установите шаг для выполнения на Build step и выберите Execute shell, для меня это выглядит так: Шаг пост-сборки Jenkins

Там я запускаю следующие строки сценария оболочки, которые используют REST API моего сервера Jenkins в сочетании с однострочным Python (вы также можете использовать jq или что-то еще для этого), чтобы определить статус текущей сборки, а также последняя завершенная сборка:

statusOfCurrentBuild=$(curl --silent "${BUILD_URL}api/json" | python -c "import sys, json; print json.load(sys.stdin)['result']")
statusOfLastBuild=$(curl --silent "${JOB_URL}/lastCompletedBuild/api/json" | python -c "import sys, json; print json.load(sys.stdin)['result']")

if [ "${statusOfCurrentBuild}" == "SUCCESS" ] && [ "${statusOfLastBuild}" == "FAILURE" ]
then
    echo "Build was fixed"
    # do something interesting here
fi

В зависимости от ваших настроек Jenkins для использования REST API может потребоваться аутентификация.

person Dirk    schedule 16.02.2018