Як позначити збірку нестабільною в Jenkins під час запуску сценаріїв оболонки


93

У проекті, над яким я працюю, ми використовуємо сценарії оболонки для виконання різних завдань. Деякі з них є скриптами sh / bash, на яких запущено rsync, а деякі - PHP-скриптами. Один із PHP-скриптів запускає деякі тести інтеграції, які виводяться в JUnit XML, звіти про охоплення коду тощо.

Дженкінс може позначити завдання як успішні / невдалі на основі статусу виходу . У PHP сценарій виходить з 1, якщо виявив, що тести не вдалися під час запуску. Інші сценарії оболонки запускають команди і використовують коди виходу з них, щоб позначити збірку як невдалу.

// :: End of PHP script:
// If any tests have failed, fail the build
if ($build_error) exit(1);

У термінології Дженкінса нестабільна збірка визначається як:

Збірка нестабільна, якщо вона була успішно побудована, і один або кілька видавців повідомляють про неї нестабільною. Наприклад, якщо видавець JUnit налаштовано, а тест не вдався, то збірка буде позначена як нестабільна.

Як я можу змусити Дженкінса позначити збірку як нестабільну, а не лише як успішну / невдалу під час запуску сценаріїв оболонки?


Я achived це працює diffrent кроків завдання і використання Дженкінс плагінів stackoverflow.com/questions/25442343 / ...
fantastory

Відповіді:


58

Використовуйте плагін Text-finder .

Замість того, щоб вийти зі статусом 1 (що не вдасться побудувати), виконайте:

if ($build_error) print("TESTS FAILED!");

Потім у діях після збірки увімкніть функцію пошуку тексту, встановіть регулярний вираз відповідно до повідомлення, яке ви надрукували ( TESTS FAILED!), і встановіть прапорець "Нестабільно, якщо знайдено" під цим записом.


2
Дивіться відповідь нижче для варіанту без установки плагіна, так як Дженкінс версії 2.26: stackoverflow.com/a/49676269/1347649
JSoet

63

Сучасні версії Jenkins (з 2.26, жовтень 2016 р.) Вирішили це: це лише вдосконалений варіант для кроку побудови оболонки Execute!

код виходу для збірки -

Ви можете просто вибрати і встановити довільне значення виходу; якщо він збігається, збірка буде нестабільною. Просто виберіть значення, яке навряд чи буде запущене реальним процесом у вашій збірці.


Мені подобається цей параметр, оскільки він не вимагає встановлення додаткових плагінів
mattherman,

2
Оскільки це впроваджено в останній Дженкінс - це має бути прийнятою відповіддю
smoke_lp

3
"Сучасні версії Jenkins" означають Jenkins 2.26 або новіші версії. Див. Issues.jenkins-ci.org/browse/JENKINS-23786 .
Синій

5
Чи можна вказати це за допомогою коду при використанні команди shstep в a Jenkinsfile? Де в графічному інтерфейсі знаходиться параметр? Я не можу знайти це.
bluenote10,

1
Мені довелося натиснути кнопку "Додатково ..." під кроком побудови, щоб викрити це. Не дуже корисно приховувати жодну (і не особливо вдосконалену) опцію за зведенням "натисніть тут, щоб зробити щось", але це так.
триплі

57

Це можна зробити без друку магічних рядків та використання TextFinder. Ось трохи інформації про це.

В основному вам потрібен файл .jar із http: // yourserver.com / cli, доступний у сценаріях оболонки, тоді ви можете використовувати таку команду, щоб позначити збірку нестабільною:

java -jar jenkins-cli.jar set-build-result unstable

Щоб позначити збірку нестійкою на помилку, ви можете використовувати:

failing_cmd cmd_args || java -jar jenkins-cli.jar set-build-result unstable

Проблема в тому, що jenkins-cli.jar повинен бути доступний із сценарію оболонки. Ви можете або ввести його у простий доступ, або завантажити через сценарій оболонки завдання:

wget ${JENKINS_URL}jnlpJars/jenkins-cli.jar

2
Мені дуже подобається це рішення, я застосував для цього клас рубіну для зручного повторного використання у своїх рейк-файлах. :)
Шир,

3
+1 - це краще рішення, ніж прийнята відповідь, оскільки програма пошуку тексту може шукати лише один рядок для кожного завдання, тому ви можете встановити лише статус побудови для одного з двох значень.
gareth_bowles

4
Цікаве рішення. Але якщо ваш Дженкінс вимагає автентифікації, вам потрібно буде налаштувати автентифікацію за відкритим ключем у його конфігурації, або будь-яка команда jenkins-cli не вдасться виконати AccessDeniedException.
Tom De Leu

2
Це не спрацює, якщо ви використовуєте ведений пристрій, який не має веб-доступу до ведучого. Наприклад, якщо підлеглий Дженкінс не може створити з'єднання HTTP або HTTPS назад із сервером.
Steve HHH

3
Я хотів скористатися цим рішенням, але set-build-resultв Windows jenkins-cli.
DrLime2k10

28

Вам слід використовувати Jenkinsfile для обгортання сценарію збірки і просто позначити поточну збірку як НЕСТАБІЛЬНУ за допомогою currentBuild.result = "UNSTABLE".

   етап {
      status = / * ваша команда збірки переходить сюди * /
      якщо (статус === "ПОЗНАЧИТИ, ЯК НЕСТАЙКИЙ") {
        currentBuild.result = "НЕСТАБІЛЬНИЙ"
      }
   }

3
Чому ця відповідь не має більше голосів? Щось із цим не так (крім використання "чарівного" рядка UNSTABLE)? Це здається більш прямим, ніж інші відповіді.
Кевін

2
Питання було про вільні робочі місця, тоді як ця відповідь стосується робочих місць у трубопроводах. Відповідь трубопроводу не стосується фрістайлу
Марк Уейт

Як це взагалі працює? Я отримую помилку: Expected one of "steps", "stages", or "parallel" for stageколи я намагаюся встановити currentBuild.result безпосередньо всередині сцени.
dokaspar

11

Ви також повинні вміти користуватися groovy і робити те, що робив текстовий пошук

позначення збірки як нестабільної за допомогою groovy плагіна після збірки

if(manager.logContains("Could not login to FTP server")) {
    manager.addWarningBadge("FTP Login Failure")
    manager.createSummary("warning.gif").appendText("<h1>Failed to login to remote FTP Server!</h1>", false, false, false, "red")
    manager.buildUnstable()
}

Також див. Плагін Groovy Postbuild


6

У сценарії мого завдання я маю такі твердження (це завдання працює лише на майстрі Дженкінса):

# This is the condition test I use to set the build status as UNSTABLE
if [ ${PERCENTAGE} -gt 80 -a ${PERCENTAGE} -lt 90 ]; then
  echo WARNING: disc usage percentage above 80%

  # Download the Jenkins CLI JAR:
  curl -o jenkins-cli.jar ${JENKINS_URL}/jnlpJars/jenkins-cli.jar

  # Set build status to unstable
  java -jar jenkins-cli.jar -s ${JENKINS_URL}/ set-build-result unstable

fi

Ви можете побачити це та набагато більше інформації про встановлення статусів збірки у вікі Jenkins: https://wiki.jenkins-ci.org/display/JENKINS/Jenkins+CLI


4
  1. Налаштуйте збірку PHP для створення звіту про запобіжну роботу xml

    <phpunit bootstrap="tests/bootstrap.php" colors="true" >
       <logging>
           <log type="junit" target="build/junit.xml" 
               logIncompleteSkipped="false" title="Test Results"/>
       </logging>
    
       ....
    
     </phpunit>
    
  2. Завершіть сценарій побудови зі статусом 0

    ...
    exit 0;
    
  3. Додайте дію після збірки Опублікувати звіт про результати тестування JUnit для XML звіту про тестування. Цей плагін змінить стабільну збірку на нестабільну, якщо тест не вдався.

    **/build/junit.xml
    
  4. Додайте плагін Jenkins Text Finder із скануванням вихідних даних консолі та невстановленими параметрами. Цей плагін не вдався повністю побудувати фатальну помилку.

    PHP Fatal error:
    

3

Я вважаю, що найбільш гнучкий спосіб зробити це - читаючи файл у плагіні groovy post build. введіть тут опис зображення

import hudson.FilePath
import java.io.InputStream

def build = Thread.currentThread().executable

String unstable = null
if(build.workspace.isRemote()) {
    channel = build.workspace.channel;
    fp = new FilePath(channel, build.workspace.toString() + "/build.properties")
    InputStream is = fp.read()
    unstable = is.text.trim()
} else {
    fp = new FilePath(new File(build.workspace.toString() + "/build.properties"))
    InputStream is = fp.read()
    unstable = is.text.trim()
}

manager.listener.logger.println("Build status file: " + unstable)
if (unstable.equalsIgnoreCase('true')) {
    manager.listener.logger.println('setting build to unstable')
    manager.buildUnstable()
}

Якщо вміст файлу є "істинним", для збірки буде встановлено нестабільність. Це буде працювати на локальному майстрі та на всіх підлеглих, на яких ви виконуєте роботу, а також на будь-яких сценаріях, які можуть записувати на диск.


Я припускаю, що це дійсно говорить "якщо у робочій області є файл з ім'ям build.properties" позначити як нестабільний. це так? Я новачок у Groovy. Не могли б ви ще трохи розбити це пояснення?
uchuugaka

@uchuugaka, так, якщо є файл і він має такий вміст. Ім'я та вміст файлу є довільними. Використовуйте все, що відповідає вашому випадку.
jeremyjjbrown

Дякую! дуже корисний. Groovy Postbuild досить непрямий, і Groovy висмоктує таку величезну кількість речей з Java і додає більше ... це новий трюк для мене.
uchuugaka

@uchuugakaka Я не думаю, що це проблема з groovy :)
jeremyjjbrown

Зовсім не проблема. Просто виклик, на який можна схилитися!
uchuugaka

2

TextFinder хороший лише в тому випадку, якщо статус завдання не було змінено з УСПІХУ на ПОМИЛЕНИЙ або ПРЕКРАЩЕНИЙ. Для таких випадків використовуйте грувий скрипт на кроці PostBuild:

errpattern = ~/TEXT-TO-LOOK-FOR-IN-JENKINS-BUILD-OUTPUT.*/;
manager.build.logFile.eachLine{ line ->
    errmatcher=errpattern.matcher(line)
    if (errmatcher.find()) {
        manager.build.@result = hudson.model.Result.NEW-STATUS-TO-SET
    }
 }

Детальніше див. У дописі, який я про це писав: http://www.tikalk.com/devops/JenkinsJobStatusChange/


2

Дублюючи мою відповідь з звідси, бо я витратив якийсь час на її пошук:

Тепер це можливо в нових версіях Jenkins, ви можете зробити щось подібне:

#!/usr/bin/env groovy

properties([
  parameters([string(name: 'foo', defaultValue: 'bar', description: 'Fails job if not bar (unstable if bar)')]),
])


stage('Stage 1') {
  node('parent'){
    def ret = sh(
      returnStatus: true, // This is the key bit!
      script: '''if [ "$foo" = bar ]; then exit 2; else exit 1; fi'''
    )
    // ret can be any number/range, does not have to be 2.
    if (ret == 2) {
      currentBuild.result = 'UNSTABLE'
    } else if (ret != 0) {
      currentBuild.result = 'FAILURE'
      // If you do not manually error the status will be set to "failed", but the
      // pipeline will still run the next stage.
      error("Stage 1 failed with exit code ${ret}")
    }
  }
}

Генератор синтаксису конвеєра показує це на вкладці розширеного:

Приклад синтаксису конвеєра


2

Я думав, що опублікую ще одну відповідь для людей, які можуть шукати щось подібне.

У нашій роботі збірки ми маємо випадки, коли ми хотіли б, щоб збірка продовжувалася, але була позначена як нестабільна. Для нас це стосується номерів версій.

Отже, я хотів встановити умову збірки та встановити збірку нестабільною, якщо ця умова виконана.

Я використовував варіант умовного кроку (одиночний) як крок побудови.

Потім я використав сценарій "Виконати систему Groovy" як крок збірки, який запускався б, коли ця умова виконана.

Я використав команду Groovy Command і встановив сценарій наступним чином

import hudson.model.*

def build = Thread.currentThread().executable
build.@result = hudson.model.Result.UNSTABLE

return

Здається, це працює досить добре.

Я тут натрапив на рішення

http://tech.akom.net/archives/112-Marking-Jenkins-build-UNSTABLE-from-environment-inject-groovy-script.html


1

Як легшу альтернативу існуючим відповідям, ви можете встановити результат побудови за допомогою простого HTTP POST для доступу до консолі сценарію Groovy REST API :

    curl -X POST \
     --silent \
     --user "$YOUR_CREDENTIALS" \
     --data-urlencode "script=Jenkins.instance.getItemByFullName( '$JOB_NAME' ).getBuildByNumber( $BUILD_NUMBER ).setResult( hudson.model.Result.UNSTABLE )" $JENKINS_URL/scriptText

Переваги:

  • не потрібно завантажувати та запускати величезний файл jar
  • відсутні ключі для встановлення та читання деяких глобальних станів (текст консолі, файли в робочій області)
  • не потрібні плагіни (крім Groovy)
  • немає необхідності налаштовувати додатковий крок збірки, який є зайвим у випадках PASSED або FAILURE.

Для цього рішення ваше середовище повинно відповідати таким умовам:

  • API Дженкінса REST можна отримати з підлеглого
  • Ведений повинен мати доступ до облікових даних, що дозволяє отримати доступ до REST API сценарію Jenkins Groovy.

0

Один із простих способів встановити збірку як нестабільну - це ваш блок "виконати оболонку", запустіть exit 13


-3

Ви можете просто зателефонувати "вихід 1", і збірка тоді не вдасться і не продовжиться. Я завершив, роблячи пропускну функцію make, щоб обробляти це для мене, і викликаю safemake замість make для побудови:

function safemake {
  make "$@"
  if [ "$?" -ne 0 ]; then
    echo "ERROR: BUILD FAILED"
    exit 1
  else
    echo "BUILD SUCCEEDED"
  fi
}

11
вихід 1, наскільки мені відомо, лише збірка зведе. Я не хочу, щоб збірка провалилася, я хочу, щоб вона була позначена як нестабільна.
HNygard

1
Див. Також stackoverflow.com/questions/36313216/… - просте рішення простоif make "$@"; then echo "BUILD SUCCEEDED"; else rc=$?; echo "BUILD FAILED"; exit $rc; fi
tripleee
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.