From 63cc328047d8f7009ee09a4e8203aaa3969cf89c Mon Sep 17 00:00:00 2001 From: Anthony Lamping <lamping.ap@gmail.com> Date: Thu, 4 Oct 2018 12:17:40 -0400 Subject: [PATCH] jenkins: archive ekf log processing output on failure --- .ci/Jenkinsfile-SITL_tests | 85 ++++++++++++++++++++++---------------- 1 file changed, 49 insertions(+), 36 deletions(-) diff --git a/.ci/Jenkinsfile-SITL_tests b/.ci/Jenkinsfile-SITL_tests index dd987aa4b8..a56ca80ea2 100644 --- a/.ci/Jenkinsfile-SITL_tests +++ b/.ci/Jenkinsfile-SITL_tests @@ -77,7 +77,7 @@ pipeline { } } - } + } // stage Build stage('ROS Tests') { steps { @@ -138,7 +138,7 @@ pipeline { parallel test_nodes } // script } // steps - } // ROS Tests + } // stage ROS Tests stage('Coverage') { parallel { @@ -191,6 +191,7 @@ pipeline { } // stage Coverage } //stages + environment { ASAN_OPTIONS = 'detect_stack_use_after_return=1:check_initialization_order=1' UBSAN_OPTIONS = 'print_stacktrace=1' @@ -198,6 +199,7 @@ pipeline { CI = true CTEST_OUTPUT_ON_FAILURE = 1 } + options { buildDiscarder(logRotator(numToKeepStr: '10', artifactDaysToKeepStr: '30')) timeout(time: 60, unit: 'MINUTES') @@ -210,56 +212,67 @@ def createTestNode(Map test_def) { cleanWs() docker.image("px4io/px4-dev-ros-kinetic:2018-09-11").inside('-e HOME=${WORKSPACE} --cap-add SYS_PTRACE') { stage(test_def.name) { + def test_ok = true + sh('export') - try { - sh('export') + if (env.PX4_CMAKE_BUILD_TYPE == 'Coverage') { + checkout(scm) + unstash 'build_sitl_coverage' + } - if (env.PX4_CMAKE_BUILD_TYPE == 'Coverage') { - checkout(scm) - unstash 'build_sitl_coverage' - } + unstash('px4_sitl_package') + sh('tar -xjpvf build/posix_sitl_default/px4-posix_sitl_default*.bz2') - unstash('px4_sitl_package') - sh('tar -xjpvf build/posix_sitl_default/px4-posix_sitl_default*.bz2') + // run test + try { sh('px4-posix_sitl_default*/px4/test/rostest_px4_run.sh ' + test_def.test + ' mission:=' + test_def.mission + ' vehicle:=' + test_def.vehicle) } catch (exc) { // save all test artifacts for debugging archiveArtifacts(allowEmptyArchive: false, artifacts: '.ros/**/*.ulg, .ros/**/rosunit-*.xml, .ros/**/rostest-*.log') - throw (exc) - - } finally { - - if (env.PX4_CMAKE_BUILD_TYPE == 'Coverage') { - withCredentials([string(credentialsId: 'FIRMWARE_CODECOV_TOKEN', variable: 'CODECOV_TOKEN')]) { - sh 'curl -s https://codecov.io/bash | bash -s - -F sitl_mission_${STAGE_NAME}' + test_ok = false + } - // upload log to flight review (https://logs.px4.io/) with python code coverage - sh('coverage run -p px4-posix_sitl_default*/px4/Tools/upload_log.py -q --description "${JOB_NAME}: ${STAGE_NAME}" --feedback "${JOB_NAME} ${CHANGE_TITLE} ${CHANGE_URL}" --source CI .ros/log/*/*.ulg') + // log analysis + if (env.PX4_CMAKE_BUILD_TYPE == 'Coverage') { + withCredentials([string(credentialsId: 'FIRMWARE_CODECOV_TOKEN', variable: 'CODECOV_TOKEN')]) { + sh 'curl -s https://codecov.io/bash | bash -s - -F sitl_mission_${STAGE_NAME}' - // process log data (with python code coverage) + // process log data (with python code coverage) + try { sh('coverage run -p px4-posix_sitl_default*/px4/Tools/ecl_ekf/process_logdata_ekf.py .ros/log/*/*.ulg') - - // upload python code coverage to codecov.io - sh 'curl -s https://codecov.io/bash | bash -s - -X gcov -F sitl_python_${STAGE_NAME}' + } catch (exc) { + // save log analysis artifacts for debugging + archiveArtifacts(allowEmptyArchive: false, artifacts: '.ros/**/*.pdf, .ros/**/*.csv') + test_ok = false } - } - // log analysis (non code coverage) - if (env.PX4_CMAKE_BUILD_TYPE != 'Coverage') { - // upload log to flight review (https://logs.px4.io/) - sh('px4-posix_sitl_default*/px4/Tools/upload_log.py -q --description "${JOB_NAME}: ${STAGE_NAME}" --feedback "${JOB_NAME} ${CHANGE_TITLE} ${CHANGE_URL}" --source CI .ros/log/*/*.ulg') + // upload log to flight review (https://logs.px4.io/) with python code coverage + sh('coverage run -p px4-posix_sitl_default*/px4/Tools/upload_log.py -q --description "${JOB_NAME}: ${STAGE_NAME}" --feedback "${JOB_NAME} ${CHANGE_TITLE} ${CHANGE_URL}" --source CI .ros/log/*/*.ulg') + // upload python code coverage to codecov.io + sh 'curl -s https://codecov.io/bash | bash -s - -X gcov -F sitl_python_${STAGE_NAME}' + } + } else { // non code coverage + // process ekf log data + try { sh('px4-posix_sitl_default*/px4/Tools/ecl_ekf/process_logdata_ekf.py .ros/log/*/*.ulg') + } catch (exc) { + // save log analysis artifacts for debugging + archiveArtifacts(allowEmptyArchive: false, artifacts: '.ros/**/*.pdf, .ros/**/*.csv') + test_ok = false } - // save test artifacts for debugging - archiveArtifacts(allowEmptyArchive: false, artifacts: '.ros/**/*.pdf, .ros/**/*.csv') + // upload log to flight review (https://logs.px4.io/) + sh('px4-posix_sitl_default*/px4/Tools/upload_log.py -q --description "${JOB_NAME}: ${STAGE_NAME}" --feedback "${JOB_NAME} ${CHANGE_TITLE} ${CHANGE_URL}" --source CI .ros/log/*/*.ulg') } - } - } - cleanWs() - } - } -} + if (!test_ok) { + error('ROS Test failed') + } + } // stage + cleanWs() + } // docker.image + } // node + } // return +} // createTestNode -- GitLab