Сбой конвейера Jenkins, если шаг нестабилен

В настоящее время мой конвейер терпит неудачу (красный), когда Maven-задание неустойчиво (желтый).

node {
    stage 'Unit/SQL-Tests'
    parallel (
       phase1: { build 'Unit-Tests' }, // maven
       phase2: { build 'SQL-Tests' } // shell
    )
    stage 'Integration-Tests'
    build 'Integration-Tests' // maven
}

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

как я могу изменить задания / конвейер/Дженкинс, чтобы (1) шаг конвейера был нестабильным вместо failed и (2) состояние конвейера было нестабильным вместо failed.

Я пробовал добавлять MAVEN_OPTS параметр -Dmaven.test.failure.ignore=true, но это не решит проблему. Я не уверен как обернуть build 'Unit-Test' в некоторую логику, которая может поймать и обработать результат.

добавление под-трубопровода с эта логика не делает трюк, так как нет возможности проверить из subversion (эта опция доступна в обычном задании maven). Я бы не хотел использовать CommandLine checkout, если это возможно.

2 ответов


какой бы шаг не был нестабильным или неудачным, конечный результат сборки в вашем скрипте будет неудачным.

вы можете добавить propagate в false по умолчанию, чтобы избежать сбоя потока.

def result = build job: 'test', propagate: false

в конце потока вы можете вынести вердикт окончательный результат на основе того, что вы получили от переменной "результат".

currentBuild.result='UNSTABLE'

вот подробный пример Как установить текущий результат сборки в Трубопровод

Br,

Тим


уроки:

  • Дженкинс будет постоянно обновлять трубопровод в соответствии с currentBuild.result значение, которое может быть либо SUCCESS, UNSTABLE или FAILURE (источник).
  • результат build job: <JOBNAME> может храниться в переменной. Состояние сборки находится в variable.result.
  • build job: <JOBNAME>, propagate: false предотвратит всю сборку от сбоя сразу.
  • currentBuild.result может только ухудшиться. Если это значение было ранее FAILED и получает новый статус SUCCESS через currentBuild.result = 'SUCCESS' он будет оставаться FAILED

это то, что я, наконец, использовать:

node {
    def result  // define the variable once in the beginning
    stage 'Unit/SQL-Tests'
    parallel (
       phase1: { result = build job: 'Unit', propagate: false }, // might be UNSTABLE
       phase2: { build 'SQL-Tests' }
    )
    currentBuild.result = result.result  // update the build status. jenkins will update the pipeline's current status accordingly
    stage 'Install SQL'
    build 'InstallSQL'
    stage 'Deploy/Integration-Tests'
    parallel (
       phase1: { build 'Deploy' },
       phase2: { result = build job: 'Integration-Tests', propagate: false }
    )
    currentBuild.result = result.result // should the Unit-Test be FAILED and Integration-Test SUCCESS, then the currentBuild.result will stay FAILED (it can only get worse)
    stage 'Code Analysis'
    build 'Analysis'
}