From 95c55e90edcc21ddc06fe7d9dc49690e18b4a555 Mon Sep 17 00:00:00 2001 From: Olivier Date: Mon, 24 Nov 2025 13:46:20 +0100 Subject: [PATCH] Update CI pipeline (#1584) --- .ci/arduino.groovy | 376 +++++++++--------- .ci/butler.groovy | 34 +- .ci/linux.groovy | 6 +- .ci/pipeline.groovy | 149 ++++--- .../new_rfm69_driver/new_rfm69_driver.ino | 0 .../sketches/rf24_driver/rf24_driver.ino | 27 ++ .../sketches/rfm95_driver/rfm95_driver.ino | 29 ++ .../Arduino/sketches/serial_gw/serial_gw.ino | 27 ++ ...t_soft_signing_whitelisting_full_debug.ino | 0 .../soft_signing_whitelisting_full_debug.ino | 0 ...ard_signing_no_whitelisting_full_debug.ino | 0 .../hard_signing_whitelisting_full_debug.ino | 0 ...gning_whitelisting_full_debug_nodelock.ino | 0 ...gning_whitelisting_full_debug_rf24_rsa.ino | 0 ...ning_whitelisting_full_debug_rfm69_rsa.ino | 0 ...ning_whitelisting_full_debug_rfm95_rsa.ino | 0 .../ota_firmware_update_rf24.ino | 0 .../pjon_transport/pjon_transport.ino | 0 ...t_hard_signing_whitelisting_full_debug.ino | 0 ...oft_signing_no_whitelisting_full_debug.ino | 0 20 files changed, 399 insertions(+), 249 deletions(-) rename tests/{ => fast}/Arduino/sketches/new_rfm69_driver/new_rfm69_driver.ino (100%) create mode 100644 tests/fast/Arduino/sketches/rf24_driver/rf24_driver.ino create mode 100644 tests/fast/Arduino/sketches/rfm95_driver/rfm95_driver.ino create mode 100644 tests/fast/Arduino/sketches/serial_gw/serial_gw.ino rename tests/{ => fast}/Arduino/sketches/serial_gw_no_transport_soft_signing_whitelisting_full_debug/serial_gw_no_transport_soft_signing_whitelisting_full_debug.ino (100%) rename tests/{ => fast}/Arduino/sketches/soft_signing_whitelisting_full_debug/soft_signing_whitelisting_full_debug.ino (100%) rename tests/{ => nightly}/Arduino/sketches/hard_signing_no_whitelisting_full_debug/hard_signing_no_whitelisting_full_debug.ino (100%) rename tests/{ => nightly}/Arduino/sketches/hard_signing_whitelisting_full_debug/hard_signing_whitelisting_full_debug.ino (100%) rename tests/{ => nightly}/Arduino/sketches/hard_signing_whitelisting_full_debug_nodelock/hard_signing_whitelisting_full_debug_nodelock.ino (100%) rename tests/{ => nightly}/Arduino/sketches/hard_signing_whitelisting_full_debug_rf24_rsa/hard_signing_whitelisting_full_debug_rf24_rsa.ino (100%) rename tests/{ => nightly}/Arduino/sketches/hard_signing_whitelisting_full_debug_rfm69_rsa/hard_signing_whitelisting_full_debug_rfm69_rsa.ino (100%) rename tests/{ => nightly}/Arduino/sketches/hard_signing_whitelisting_full_debug_rfm95_rsa/hard_signing_whitelisting_full_debug_rfm95_rsa.ino (100%) rename tests/{ => nightly}/Arduino/sketches/ota_firmware_update_rf24/ota_firmware_update_rf24.ino (100%) rename tests/{ => nightly}/Arduino/sketches/pjon_transport/pjon_transport.ino (100%) rename tests/{ => nightly}/Arduino/sketches/serial_gw_no_transport_hard_signing_whitelisting_full_debug/serial_gw_no_transport_hard_signing_whitelisting_full_debug.ino (100%) rename tests/{ => nightly}/Arduino/sketches/soft_signing_no_whitelisting_full_debug/soft_signing_no_whitelisting_full_debug.ino (100%) diff --git a/.ci/arduino.groovy b/.ci/arduino.groovy index 74207822..8a670037 100644 --- a/.ci/arduino.groovy +++ b/.ci/arduino.groovy @@ -1,64 +1,82 @@ #!groovy + def buildArduino(config, String buildFlags, String sketch, String key) { - def root = '/opt/arduino-1.8.19/' - def build_path = 'build' - def build_path_cmd = ' -build-path '+build_path+' ' - if (config.nightly_arduino_ide) - { - root = '/opt/arduino-nightly/' - // patch for nightly arduino-builder - } - def jenkins_root = '/var/lib/jenkins/' - def builder = root+'arduino-builder' - def standard_args = ' -warnings=all' //-verbose=true - def builder_specifics = ' -hardware '+root+'hardware -tools '+root+'hardware/tools/avr -tools '+ - root+'tools-builder -built-in-libraries '+root+'libraries' - def jenkins_packages = jenkins_root+'.arduino15/packages' - def site_specifics = ' -hardware '+jenkins_packages+' -tools '+jenkins_packages - def repo_specifics = ' -hardware hardware -libraries . ' - def build_cmd = builder+standard_args+builder_specifics+site_specifics+repo_specifics+build_path_cmd+buildFlags - sh """#!/bin/bash - printf "\\e[1m\\e[32mBuilding \\e[34m${sketch} \\e[0musing \\e[1m\\e[36m${build_cmd}\\e[0m\\n" - if [ -d ${build_path} ]; then rm -r ${build_path}; fi - mkdir ${build_path} - ${build_cmd} ${sketch} 2>> compiler_${key}.log""" + def cli = config.arduino_cli ?: 'arduino-cli' + + // Per-key build dir (so different boards don’t step on each other) + def build_path = "build/${key}" + def build_path_cmd = "--build-path ${build_path}" + + // Optional parallel jobs (defaults to 4 if nothing is set) + def jobs = config.arduino_jobs ?: '4' + def jobsOpt = jobs ? "--jobs ${jobs}" : "" + + // If the board-specific flags already contain --warnings, don't add another one + def hasWarnings = (buildFlags =~ /--warnings\b/).find() + def warningsOpt = hasWarnings ? '' : '--warnings all' + + def libOpt = "" + if (config.library_root) { + libOpt = "--library \"${config.library_root}\"" + } + + def build_cmd = "${cli} compile ${buildFlags} ${build_path_cmd} ${warningsOpt} ${libOpt} ${jobsOpt}" + + sh """#!/bin/bash + set -e + + printf "\\e[1m\\e[32mBuilding \\e[34m${sketch} \\e[0musing \\e[1m\\e[36m${build_cmd}\\e[0m\\n" + + mkdir -p "${build_path}" + + ${build_cmd} "${sketch}" 2>> compiler_${key}.log + """ } def parseWarnings(String key) { - warnings canResolveRelativePaths: false, canRunOnFailed: true, categoriesPattern: '', - defaultEncoding: '', - excludePattern: '''.*/EEPROM\\.h,.*/Dns\\.cpp,.*/socket\\.cpp,.*/util\\.h,.*/Servo\\.cpp, - .*/Adafruit_NeoPixel\\.cpp,.*/UIPEthernet.*,.*/SoftwareSerial\\.cpp,.*/PJON/.*, - .*/pins_arduino\\.h,.*/Stream\\.cpp,.*/USBCore\\.cpp,.*/libraries/Wire/.*, - .*/hardware/avr.*,.*/hardware/STM32F1.*,.*/hardware/esp8266.*,.*/hardware/esp32.*, - .*/libraries/SD/.*,.*/libraries/Ethernet/.*''', + def logFile = "compiler_${key}.log" - healthy: '', includePattern: '', messagesPattern: '', - parserConfigurations: [[parserName: 'Arduino/AVR', pattern: 'compiler_'+key+'.log']], - unHealthy: '', unstableNewAll: '0', unstableTotalAll: '0' - sh """#!/bin/bash - echo "Compiler warnings/errors:" - printf "\\e[101m" - cat compiler_${key}.log - printf "\\e[0m" - rm compiler_${key}.log""" + warnings canResolveRelativePaths: false, canRunOnFailed: true, categoriesPattern: '', + defaultEncoding: '', + excludePattern: '''.*/EEPROM\\.h,.*/Dns\\.cpp,.*/socket\\.cpp,.*/util\\.h,.*/Servo\\.cpp, + .*/Adafruit_NeoPixel\\.cpp,.*/UIPEthernet.*,.*/SoftwareSerial\\.cpp,.*/PJON/.*, + .*/pins_arduino\\.h,.*/Stream\\.cpp,.*/USBCore\\.cpp,.*/hardware/.*,.*/libraries/.*''', + healthy: '', includePattern: '', messagesPattern: '', + parserConfigurations: [[parserName: 'Arduino/AVR', pattern: logFile]], + unHealthy: '', unstableNewAll: '0', unstableTotalAll: '0' + + sh """#!/bin/bash + echo "Compiler warnings/errors:" + printf "\\e[101m" + if [ -f "${logFile}" ]; then + cat "${logFile}" + rm "${logFile}" + else + echo "Log file ${logFile} not found (build may have failed before compilation)." + fi + printf "\\e[0m" + """ } +// --------------------------- +// Board-specific wrappers +// --------------------------- + def buildMySensorsMicro(config, sketches, String key) { - def fqbn = '-fqbn=MySensors:avr:MysensorsMicro:cpu=1Mhz' + def fqbn = '--fqbn MySensors:avr:MysensorsMicro:cpu=1Mhz' config.pr.setBuildStatus(config, 'PENDING', 'Toll gate (MySensorsMicro - '+key+')', 'Building...', '${BUILD_URL}flowGraphTable/') try { - for (sketch = 0; sketch < sketches.size(); sketch++) { - if (sketches[sketch].path != config.library_root+'examples/GatewayESP8266/GatewayESP8266.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266MQTTClient/GatewayESP8266MQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266SecureMQTTClient/GatewayESP8266SecureMQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266OTA/GatewayESP8266OTA.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayGSMMQTTClient/GatewayGSMMQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32/GatewayESP32.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32OTA/GatewayESP32OTA.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32MQTTClient/GatewayESP32MQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/SensebenderGatewaySerial/SensebenderGatewaySerial.ino') { - buildArduino(config, fqbn, sketches[sketch].path, key+'_MySensorsMicro') + sketches.each { sketch -> + if (sketch.path != config.library_root+'examples/GatewayESP8266/GatewayESP8266.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266MQTTClient/GatewayESP8266MQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266SecureMQTTClient/GatewayESP8266SecureMQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266OTA/GatewayESP8266OTA.ino' && + sketch.path != config.library_root+'examples/GatewayGSMMQTTClient/GatewayGSMMQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP32/GatewayESP32.ino' && + sketch.path != config.library_root+'examples/GatewayESP32OTA/GatewayESP32OTA.ino' && + sketch.path != config.library_root+'examples/GatewayESP32MQTTClient/GatewayESP32MQTTClient.ino' && + sketch.path != config.library_root+'examples/SensebenderGatewaySerial/SensebenderGatewaySerial.ino') { + buildArduino(config, fqbn, sketch.path, key+'_MySensorsMicro') } } } catch (ex) { @@ -81,22 +99,22 @@ def buildMySensorsMicro(config, sketches, String key) { } def buildMySensorsGw(config, sketches, String key) { - def fqbn = '-fqbn MySensors:samd:mysensors_gw_native' + def fqbn = '--fqbn MySensors:samd:mysensors_gw_native' config.pr.setBuildStatus(config, 'PENDING', 'Toll gate (MySensorsGW - '+key+')', 'Building...', '${BUILD_URL}flowGraphTable/') try { - for (sketch = 0; sketch < sketches.size(); sketch++) { - if (sketches[sketch].path != config.library_root+'examples/BatteryPoweredSensor/BatteryPoweredSensor.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266/GatewayESP8266.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266MQTTClient/GatewayESP8266MQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266SecureMQTTClient/GatewayESP8266SecureMQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266OTA/GatewayESP8266OTA.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayGSMMQTTClient/GatewayGSMMQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32/GatewayESP32.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32OTA/GatewayESP32OTA.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32MQTTClient/GatewayESP32MQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewaySerialRS485/GatewaySerialRS485.ino' && - sketches[sketch].path != config.library_root+'examples/MotionSensorRS485/MotionSensorRS485.ino') { - buildArduino(config, fqbn, sketches[sketch].path, key+'_MySensorsGW') + sketches.each { sketch -> + if (sketch.path != config.library_root+'examples/BatteryPoweredSensor/BatteryPoweredSensor.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266/GatewayESP8266.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266MQTTClient/GatewayESP8266MQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266SecureMQTTClient/GatewayESP8266SecureMQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266OTA/GatewayESP8266OTA.ino' && + sketch.path != config.library_root+'examples/GatewayGSMMQTTClient/GatewayGSMMQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP32/GatewayESP32.ino' && + sketch.path != config.library_root+'examples/GatewayESP32OTA/GatewayESP32OTA.ino' && + sketch.path != config.library_root+'examples/GatewayESP32MQTTClient/GatewayESP32MQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewaySerialRS485/GatewaySerialRS485.ino' && + sketch.path != config.library_root+'examples/MotionSensorRS485/MotionSensorRS485.ino') { + buildArduino(config, fqbn, sketch.path, key+'_MySensorsGW') } } } catch (ex) { @@ -119,19 +137,19 @@ def buildMySensorsGw(config, sketches, String key) { } def buildArduinoUno(config, sketches, String key) { - def fqbn = '-fqbn arduino:avr:uno' + def fqbn = '--fqbn arduino:avr:uno' config.pr.setBuildStatus(config, 'PENDING', 'Toll gate (Arduino Uno - '+key+')', 'Building...', '${BUILD_URL}flowGraphTable/') try { - for (sketch = 0; sketch < sketches.size(); sketch++) { - if (sketches[sketch].path != config.library_root+'examples/GatewayESP8266/GatewayESP8266.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266MQTTClient/GatewayESP8266MQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266SecureMQTTClient/GatewayESP8266SecureMQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266OTA/GatewayESP8266OTA.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32/GatewayESP32.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32OTA/GatewayESP32OTA.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32MQTTClient/GatewayESP32MQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/SensebenderGatewaySerial/SensebenderGatewaySerial.ino') { - buildArduino(config, fqbn, sketches[sketch].path, key+'_ArduinoUno') + sketches.each { sketch -> + if (sketch.path != config.library_root+'examples/GatewayESP8266/GatewayESP8266.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266MQTTClient/GatewayESP8266MQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266SecureMQTTClient/GatewayESP8266SecureMQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266OTA/GatewayESP8266OTA.ino' && + sketch.path != config.library_root+'examples/GatewayESP32/GatewayESP32.ino' && + sketch.path != config.library_root+'examples/GatewayESP32OTA/GatewayESP32OTA.ino' && + sketch.path != config.library_root+'examples/GatewayESP32MQTTClient/GatewayESP32MQTTClient.ino' && + sketch.path != config.library_root+'examples/SensebenderGatewaySerial/SensebenderGatewaySerial.ino') { + buildArduino(config, fqbn, sketch.path, key+'_ArduinoUno') } } } catch (ex) { @@ -154,19 +172,19 @@ def buildArduinoUno(config, sketches, String key) { } def buildArduinoMega(config, sketches, String key) { - def fqbn = '-fqbn arduino:avr:mega:cpu=atmega2560' + def fqbn = '--fqbn arduino:avr:mega:cpu=atmega2560' config.pr.setBuildStatus(config, 'PENDING', 'Toll gate (Arduino Mega - '+key+')', 'Building...', '${BUILD_URL}flowGraphTable/') try { - for (sketch = 0; sketch < sketches.size(); sketch++) { - if (sketches[sketch].path != config.library_root+'examples/GatewayESP8266/GatewayESP8266.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266MQTTClient/GatewayESP8266MQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266SecureMQTTClient/GatewayESP8266SecureMQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266OTA/GatewayESP8266OTA.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32/GatewayESP32.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32OTA/GatewayESP32OTA.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32MQTTClient/GatewayESP32MQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/SensebenderGatewaySerial/SensebenderGatewaySerial.ino') { - buildArduino(config, fqbn, sketches[sketch].path, key+'_ArduinoMega') + sketches.each { sketch -> + if (sketch.path != config.library_root+'examples/GatewayESP8266/GatewayESP8266.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266MQTTClient/GatewayESP8266MQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266SecureMQTTClient/GatewayESP8266SecureMQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266OTA/GatewayESP8266OTA.ino' && + sketch.path != config.library_root+'examples/GatewayESP32/GatewayESP32.ino' && + sketch.path != config.library_root+'examples/GatewayESP32OTA/GatewayESP32OTA.ino' && + sketch.path != config.library_root+'examples/GatewayESP32MQTTClient/GatewayESP32MQTTClient.ino' && + sketch.path != config.library_root+'examples/SensebenderGatewaySerial/SensebenderGatewaySerial.ino') { + buildArduino(config, fqbn, sketch.path, key+'_ArduinoMega') } } } catch (ex) { @@ -177,7 +195,8 @@ def buildArduinoMega(config, sketches, String key) { parseWarnings(key+'_ArduinoMega') } if (currentBuild.currentResult == 'UNSTABLE') { - config.pr.setBuildStatus(config, config, 'ERROR', 'Toll gate (Arduino Mega - '+key+')', 'Warnings found', '${BUILD_URL}warnings2Result/new') + // fixed: removed duplicate config argument + config.pr.setBuildStatus(config, 'ERROR', 'Toll gate (Arduino Mega - '+key+')', 'Warnings found', '${BUILD_URL}warnings2Result/new') if (config.is_pull_request) { error 'Terminated due to warnings found' } @@ -189,19 +208,19 @@ def buildArduinoMega(config, sketches, String key) { } def buildSTM32F1(config, sketches, String key) { - def fqbn = '-fqbn STMicroelectronics:stm32:GenF1:pnum=BLUEPILL_F103C8,upload_method=swdMethod,xserial=generic,usb=none,xusb=FS,opt=osstd,dbg=none,rtlib=nano' + def fqbn = '--fqbn STMicroelectronics:stm32:GenF1:pnum=BLUEPILL_F103C8,upload_method=swdMethod,xserial=generic,usb=none,xusb=FS,opt=osstd,dbg=none,rtlib=nano' config.pr.setBuildStatus(config, 'PENDING', 'Toll gate (STM32F1 - '+key+')', 'Building...', '${BUILD_URL}flowGraphTable/') try { - for (sketch = 0; sketch < sketches.size(); sketch++) { - if (sketches[sketch].path != config.library_root+'examples/GatewayESP8266/GatewayESP8266.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266MQTTClient/GatewayESP8266MQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266SecureMQTTClient/GatewayESP8266SecureMQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266OTA/GatewayESP8266OTA.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32/GatewayESP32.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32OTA/GatewayESP32OTA.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32MQTTClient/GatewayESP32MQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/SensebenderGatewaySerial/SensebenderGatewaySerial.ino') { - buildArduino(config, fqbn, sketches[sketch].path, key+'_STM32F1') + sketches.each { sketch -> + if (sketch.path != config.library_root+'examples/GatewayESP8266/GatewayESP8266.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266MQTTClient/GatewayESP8266MQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266SecureMQTTClient/GatewayESP8266SecureMQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266OTA/GatewayESP8266OTA.ino' && + sketch.path != config.library_root+'examples/GatewayESP32/GatewayESP32.ino' && + sketch.path != config.library_root+'examples/GatewayESP32OTA/GatewayESP32OTA.ino' && + sketch.path != config.library_root+'examples/GatewayESP32MQTTClient/GatewayESP32MQTTClient.ino' && + sketch.path != config.library_root+'examples/SensebenderGatewaySerial/SensebenderGatewaySerial.ino') { + buildArduino(config, fqbn, sketch.path, key+'_STM32F1') } } } catch (ex) { @@ -224,19 +243,19 @@ def buildSTM32F1(config, sketches, String key) { } def buildSTM32F4(config, sketches, String key) { - def fqbn = '-fqbn STMicroelectronics:stm32:GenF4:pnum=BLACKPILL_F411CE,upload_method=swdMethod,xserial=generic,usb=none,xusb=FS,opt=osstd,dbg=none,rtlib=nano' + def fqbn = '--fqbn STMicroelectronics:stm32:GenF4:pnum=BLACKPILL_F411CE,upload_method=swdMethod,xserial=generic,usb=none,xusb=FS,opt=osstd,dbg=none,rtlib=nano' config.pr.setBuildStatus(config, 'PENDING', 'Toll gate (STM32F4 - '+key+')', 'Building...', '${BUILD_URL}flowGraphTable/') try { - for (sketch = 0; sketch < sketches.size(); sketch++) { - if (sketches[sketch].path != config.library_root+'examples/GatewayESP8266/GatewayESP8266.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266MQTTClient/GatewayESP8266MQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266SecureMQTTClient/GatewayESP8266SecureMQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266OTA/GatewayESP8266OTA.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32/GatewayESP32.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32OTA/GatewayESP32OTA.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32MQTTClient/GatewayESP32MQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/SensebenderGatewaySerial/SensebenderGatewaySerial.ino') { - buildArduino(config, fqbn, sketches[sketch].path, key+'_STM32F4') + sketches.each { sketch -> + if (sketch.path != config.library_root+'examples/GatewayESP8266/GatewayESP8266.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266MQTTClient/GatewayESP8266MQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266SecureMQTTClient/GatewayESP8266SecureMQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266OTA/GatewayESP8266OTA.ino' && + sketch.path != config.library_root+'examples/GatewayESP32/GatewayESP32.ino' && + sketch.path != config.library_root+'examples/GatewayESP32OTA/GatewayESP32OTA.ino' && + sketch.path != config.library_root+'examples/GatewayESP32MQTTClient/GatewayESP32MQTTClient.ino' && + sketch.path != config.library_root+'examples/SensebenderGatewaySerial/SensebenderGatewaySerial.ino') { + buildArduino(config, fqbn, sketch.path, key+'_STM32F4') } } } catch (ex) { @@ -259,24 +278,24 @@ def buildSTM32F4(config, sketches, String key) { } def buildESP8266(config, sketches, String key) { - def fqbn = '-fqbn=esp8266:esp8266:generic:xtal=80,vt=flash,exception=disabled,ResetMethod=ck,CrystalFreq=26,FlashFreq=40,FlashMode=dout,eesz=512K,led=2,ip=lm2f,dbg=Disabled,lvl=None____,wipe=none,baud=115200' + def fqbn = '--fqbn esp8266:esp8266:generic:xtal=80,vt=flash,exception=disabled,ResetMethod=ck,CrystalFreq=26,FlashFreq=40,FlashMode=dout,eesz=512K,led=2,ip=lm2f,dbg=Disabled,lvl=None____,wipe=none,baud=115200' config.pr.setBuildStatus(config, 'PENDING', 'Toll gate (ESP8266 - '+key+')', 'Building...', '${BUILD_URL}flowGraphTable/') try { - for (sketch = 0; sketch < sketches.size(); sketch++) { - if (sketches[sketch].path != config.library_root+'examples/BatteryPoweredSensor/BatteryPoweredSensor.ino' && - sketches[sketch].path != config.library_root+'examples/CO2Sensor/CO2Sensor.ino' && - sketches[sketch].path != config.library_root+'examples/DustSensorDSM/DustSensorDSM.ino' && - sketches[sketch].path != config.library_root+'examples/GatewaySerialRS485/GatewaySerialRS485.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayW5100/GatewayW5100.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayW5100MQTTClient/GatewayW5100MQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayGSMMQTTClient/GatewayGSMMQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32/GatewayESP32.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32OTA/GatewayESP32OTA.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32MQTTClient/GatewayESP32MQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/MotionSensorRS485/MotionSensorRS485.ino' && - sketches[sketch].path != config.library_root+'examples/SensebenderGatewaySerial/SensebenderGatewaySerial.ino' && - sketches[sketch].path != config.library_root+'examples/SoilMoistSensor/SoilMoistSensor.ino') { - buildArduino(config, fqbn, sketches[sketch].path, key+'_ESP8266') + sketches.each { sketch -> + if (sketch.path != config.library_root+'examples/BatteryPoweredSensor/BatteryPoweredSensor.ino' && + sketch.path != config.library_root+'examples/CO2Sensor/CO2Sensor.ino' && + sketch.path != config.library_root+'examples/DustSensorDSM/DustSensorDSM.ino' && + sketch.path != config.library_root+'examples/GatewaySerialRS485/GatewaySerialRS485.ino' && + sketch.path != config.library_root+'examples/GatewayW5100/GatewayW5100.ino' && + sketch.path != config.library_root+'examples/GatewayW5100MQTTClient/GatewayW5100MQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayGSMMQTTClient/GatewayGSMMQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP32/GatewayESP32.ino' && + sketch.path != config.library_root+'examples/GatewayESP32OTA/GatewayESP32OTA.ino' && + sketch.path != config.library_root+'examples/GatewayESP32MQTTClient/GatewayESP32MQTTClient.ino' && + sketch.path != config.library_root+'examples/MotionSensorRS485/MotionSensorRS485.ino' && + sketch.path != config.library_root+'examples/SensebenderGatewaySerial/SensebenderGatewaySerial.ino' && + sketch.path != config.library_root+'examples/SoilMoistSensor/SoilMoistSensor.ino') { + buildArduino(config, fqbn, sketch.path, key+'_ESP8266') } } } catch (ex) { @@ -299,33 +318,34 @@ def buildESP8266(config, sketches, String key) { } def buildESP32(config, sketches, String key) { - def fqbn = '-fqbn esp32:esp32:esp32:PartitionScheme=default,FlashMode=qio,FlashFreq=80,FlashSize=4M,UploadSpeed=921600,DebugLevel=none -warnings=default' + // Note: override global --warnings with "default" for ESP32 + def fqbn = '--fqbn esp32:esp32:esp32:PartitionScheme=default,FlashMode=qio,FlashFreq=80,FlashSize=4M,UploadSpeed=921600,DebugLevel=none --warnings default' config.pr.setBuildStatus(config, 'PENDING', 'Toll gate (ESP32 - '+key+')', 'Building...', '${BUILD_URL}flowGraphTable/') try { - for (sketch = 0; sketch < sketches.size(); sketch++) { - if (sketches[sketch].path != config.library_root+'examples/BatteryPoweredSensor/BatteryPoweredSensor.ino' && - sketches[sketch].path != config.library_root+'examples/BinarySwitchSleepSensor/BinarySwitchSleepSensor.ino' && - sketches[sketch].path != config.library_root+'examples/CO2Sensor/CO2Sensor.ino' && - sketches[sketch].path != config.library_root+'examples/DustSensor/DustSensor.ino' && - sketches[sketch].path != config.library_root+'examples/DustSensorDSM/DustSensorDSM.ino' && - sketches[sketch].path != config.library_root+'examples/EnergyMeterPulseSensor/EnergyMeterPulseSensor.ino' && - sketches[sketch].path != config.library_root+'examples/LightSensor/LightSensor.ino' && - sketches[sketch].path != config.library_root+'examples/LogOTANode/LogOTANode.ino' && - sketches[sketch].path != config.library_root+'examples/MotionSensor/MotionSensor.ino' && - sketches[sketch].path != config.library_root+'examples/MotionSensorRS485/MotionSensorRS485.ino' && - sketches[sketch].path != config.library_root+'examples/PassiveNode/PassiveNode.ino' && - sketches[sketch].path != config.library_root+'examples/GatewaySerialRS485/GatewaySerialRS485.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayW5100/GatewayW5100.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayW5100MQTTClient/GatewayW5100MQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayGSMMQTTClient/GatewayGSMMQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266/GatewayESP8266.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266MQTTClient/GatewayESP8266MQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266SecureMQTTClient/GatewayESP8266SecureMQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266OTA/GatewayESP8266OTA.ino' && - sketches[sketch].path != config.library_root+'examples/SensebenderGatewaySerial/SensebenderGatewaySerial.ino' && - sketches[sketch].path != config.library_root+'examples/MotionSensorRS485/MotionSensorRS485.ino' && - sketches[sketch].path != config.library_root+'examples/SoilMoistSensor/SoilMoistSensor.ino') { - buildArduino(config, fqbn, sketches[sketch].path, key+'_ESP32') + sketches.each { sketch -> + if (sketch.path != config.library_root+'examples/BatteryPoweredSensor/BatteryPoweredSensor.ino' && + sketch.path != config.library_root+'examples/BinarySwitchSleepSensor/BinarySwitchSleepSensor.ino' && + sketch.path != config.library_root+'examples/CO2Sensor/CO2Sensor.ino' && + sketch.path != config.library_root+'examples/DustSensor/DustSensor.ino' && + sketch.path != config.library_root+'examples/DustSensorDSM/DustSensorDSM.ino' && + sketch.path != config.library_root+'examples/EnergyMeterPulseSensor/EnergyMeterPulseSensor.ino' && + sketch.path != config.library_root+'examples/LightSensor/LightSensor.ino' && + sketch.path != config.library_root+'examples/LogOTANode/LogOTANode.ino' && + sketch.path != config.library_root+'examples/MotionSensor/MotionSensor.ino' && + sketch.path != config.library_root+'examples/MotionSensorRS485/MotionSensorRS485.ino' && + sketch.path != config.library_root+'examples/PassiveNode/PassiveNode.ino' && + sketch.path != config.library_root+'examples/GatewaySerialRS485/GatewaySerialRS485.ino' && + sketch.path != config.library_root+'examples/GatewayW5100/GatewayW5100.ino' && + sketch.path != config.library_root+'examples/GatewayW5100MQTTClient/GatewayW5100MQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayGSMMQTTClient/GatewayGSMMQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266/GatewayESP8266.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266MQTTClient/GatewayESP8266MQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266SecureMQTTClient/GatewayESP8266SecureMQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266OTA/GatewayESP8266OTA.ino' && + sketch.path != config.library_root+'examples/SensebenderGatewaySerial/SensebenderGatewaySerial.ino' && + sketch.path != config.library_root+'examples/MotionSensorRS485/MotionSensorRS485.ino' && + sketch.path != config.library_root+'examples/SoilMoistSensor/SoilMoistSensor.ino') { + buildArduino(config, fqbn, sketch.path, key+'_ESP32') } } } catch (ex) { @@ -345,53 +365,53 @@ def buildESP32(config, sketches, String key) { } else { config.pr.setBuildStatus(config, 'SUCCESS', 'Toll gate (ESP32 - '+key+')', 'Pass', '') } -} +} -def buildnRF5(config, sketches, String key) { - def fqbn = '-fqbn sandeepmistry:nRF5:Generic_nRF52832:softdevice=none,lfclk=lfxo' +def buildnRF52(config, sketches, String key) { + def fqbn = '--fqbn sandeepmistry:nRF5:Generic_nRF52832:softdevice=none,lfclk=lfxo' config.pr.setBuildStatus(config, 'PENDING', 'Toll gate (nRF5 - '+key+')', 'Building...', '${BUILD_URL}flowGraphTable/') try { - for (sketch = 0; sketch < sketches.size(); sketch++) { - if (sketches[sketch].path != config.library_root+'examples/BatteryPoweredSensor/BatteryPoweredSensor.ino' && - sketches[sketch].path != config.library_root+'examples/CO2Sensor/CO2Sensor.ino' && - sketches[sketch].path != config.library_root+'examples/DustSensorDSM/DustSensorDSM.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266/GatewayESP8266.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266MQTTClient/GatewayESP8266MQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266SecureMQTTClient/GatewayESP8266SecureMQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayGSMMQTTClient/GatewayGSMMQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP8266OTA/GatewayESP8266OTA.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32/GatewayESP32.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32OTA/GatewayESP32OTA.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayESP32MQTTClient/GatewayESP32MQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/GatewaySerialRS485/GatewaySerialRS485.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayW5100/GatewayW5100.ino' && - sketches[sketch].path != config.library_root+'examples/GatewayW5100MQTTClient/GatewayW5100MQTTClient.ino' && - sketches[sketch].path != config.library_root+'examples/MotionSensorRS485/MotionSensorRS485.ino' && - sketches[sketch].path != config.library_root+'examples/SensebenderGatewaySerial/SensebenderGatewaySerial.ino') { - buildArduino(config, fqbn, sketches[sketch].path, key+'_nRF5') + sketches.each { sketch -> + if (sketch.path != config.library_root+'examples/BatteryPoweredSensor/BatteryPoweredSensor.ino' && + sketch.path != config.library_root+'examples/CO2Sensor/CO2Sensor.ino' && + sketch.path != config.library_root+'examples/DustSensorDSM/DustSensorDSM.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266/GatewayESP8266.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266MQTTClient/GatewayESP8266MQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266SecureMQTTClient/GatewayESP8266SecureMQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayGSMMQTTClient/GatewayGSMMQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewayESP8266OTA/GatewayESP8266OTA.ino' && + sketch.path != config.library_root+'examples/GatewayESP32/GatewayESP32.ino' && + sketch.path != config.library_root+'examples/GatewayESP32OTA/GatewayESP32OTA.ino' && + sketch.path != config.library_root+'examples/GatewayESP32MQTTClient/GatewayESP32MQTTClient.ino' && + sketch.path != config.library_root+'examples/GatewaySerialRS485/GatewaySerialRS485.ino' && + sketch.path != config.library_root+'examples/GatewayW5100/GatewayW5100.ino' && + sketch.path != config.library_root+'examples/GatewayW5100MQTTClient/GatewayW5100MQTTClient.ino' && + sketch.path != config.library_root+'examples/MotionSensorRS485/MotionSensorRS485.ino' && + sketch.path != config.library_root+'examples/SensebenderGatewaySerial/SensebenderGatewaySerial.ino') { + buildArduino(config, fqbn, sketch.path, key+'_nRF52') } } } catch (ex) { echo "Build failed with: "+ ex.toString() - config.pr.setBuildStatus(config, 'FAILURE', 'Toll gate (nRF5 - '+key+')', 'Build error', '${BUILD_URL}') + config.pr.setBuildStatus(config, 'FAILURE', 'Toll gate (nRF52 - '+key+')', 'Build error', '${BUILD_URL}') throw ex } finally { - parseWarnings(key+'_nRF5') + parseWarnings(key+'_nRF52') } if (currentBuild.currentResult == 'UNSTABLE') { - config.pr.setBuildStatus(config, 'ERROR', 'Toll gate (nRF5 - '+key+')', 'Warnings found', '${BUILD_URL}warnings2Result/new') + config.pr.setBuildStatus(config, 'ERROR', 'Toll gate (nRF52 - '+key+')', 'Warnings found', '${BUILD_URL}warnings2Result/new') if (config.is_pull_request) { error 'Terminated due to warnings found' } } else if (currentBuild.currentResult == 'FAILURE') { - config.pr.setBuildStatus(config, 'FAILURE', 'Toll gate (nRF5 - '+key+')', 'Build error', '${BUILD_URL}') + config.pr.setBuildStatus(config, 'FAILURE', 'Toll gate (nRF52 - '+key+')', 'Build error', '${BUILD_URL}') } else { - config.pr.setBuildStatus(config, 'SUCCESS', 'Toll gate (nRF5 - '+key+')', 'Pass', '') + config.pr.setBuildStatus(config, 'SUCCESS', 'Toll gate (nRF52 - '+key+')', 'Pass', '') } } def buildnRF52832(config, sketches, String key) { - def fqbn = '-fqbn=MySensors:nRF5:MyBoard_nRF52832:bootcode=none,lfclk=lfxo,reset=notenable' + def fqbn = '--fqbn MySensors:nRF5:MyBoard_nRF52832:bootcode=none,lfclk=lfxo,reset=notenable' config.pr.setBuildStatus(config, 'PENDING', 'Toll gate (nRF52832 - '+key+')', 'Building...', '${BUILD_URL}flowGraphTable/') try { buildArduino(config, fqbn, 'hardware/MySensors/nRF5/libraries/MyBoardNRF5/examples/MyBoardNRF5/MyBoardNRF5.ino', key+'_nRF52832') @@ -415,7 +435,7 @@ def buildnRF52832(config, sketches, String key) { } def buildnRF51822(config, sketches, String key) { - def fqbn = '-fqbn=MySensors:nRF5:MyBoard_nRF51822:chip=xxaa,bootcode=none,lfclk=lfxo' + def fqbn = '--fqbn MySensors:nRF5:MyBoard_nRF51822:chip=xxaa,bootcode=none,lfclk=lfxo' config.pr.setBuildStatus(config, 'PENDING', 'Toll gate (nRF51822 - '+key+')', 'Building...', '${BUILD_URL}flowGraphTable/') try { buildArduino(config, fqbn, 'hardware/MySensors/nRF5/libraries/MyBoardNRF5/examples/MyBoardNRF5/MyBoardNRF5.ino', key+'_nRF51822') diff --git a/.ci/butler.groovy b/.ci/butler.groovy index c4ed9c60..aa3e394f 100644 --- a/.ci/butler.groovy +++ b/.ci/butler.groovy @@ -16,13 +16,13 @@ def call(config) { dir(config.repository_root) { step([$class: 'GitChangelogRecorder', config: [configFile: 'git-changelog-settings.json', createFileTemplateContent: ''' -# Changelog -{{#commits}} -### {{{messageTitle}}} -{{{messageBody}}} -[{{hash}}](https://github.com/mysensors/MySensors/commit/{{hash}}) by {{authorName}} at *{{commitTime}}* -{{/commits}} -''', + # Changelog + {{#commits}} + ### {{{messageTitle}}} + {{{messageBody}}} + [{{hash}}](https://github.com/mysensors/MySensors/commit/{{hash}}) by {{authorName}} at *{{commitTime}}* + {{/commits}} + ''', createFileTemplateFile: '', createFileUseTemplateContent: true, createFileUseTemplateFile: false, customIssues: [[link: '', name: '', pattern: '', title: ''], [link: '', name: '', pattern: '', title: '']], dateFormat: 'YYYY-MM-dd HH:mm:ss', @@ -54,10 +54,10 @@ def call(config) { dir(config.repository_root) { step([$class: 'GitChangelogRecorder', config: [configFile: 'git-changelog-settings.json', createFileTemplateContent: ''' -{{#commits}} -{{{messageTitle}}} -{{/commits}} -''', + {{#commits}} + {{{messageTitle}}} + {{/commits}} + ''', createFileTemplateFile: '', createFileUseTemplateContent: true, createFileUseTemplateFile: false, customIssues: [[link: '', name: '', pattern: '', title: ''], [link: '', name: '', pattern: '', title: '']], dateFormat: 'YYYY-MM-dd HH:mm:ss', @@ -81,12 +81,12 @@ def call(config) { ]) step([$class: 'GitChangelogRecorder', config: [configFile: 'git-changelog-settings.json', createFileTemplateContent: ''' -{{#commits}} -{{#messageBodyItems}} -{{.}} -{{/messageBodyItems}} -{{/commits}} -''', + {{#commits}} + {{#messageBodyItems}} + {{.}} + {{/messageBodyItems}} + {{/commits}} + ''', createFileTemplateFile: '', createFileUseTemplateContent: true, createFileUseTemplateFile: false, customIssues: [[link: '', name: '', pattern: '', title: ''], [link: '', name: '', pattern: '', title: '']], dateFormat: 'YYYY-MM-dd HH:mm:ss', diff --git a/.ci/linux.groovy b/.ci/linux.groovy index 991fed11..4214d35d 100644 --- a/.ci/linux.groovy +++ b/.ci/linux.groovy @@ -15,9 +15,9 @@ def buildLinux(config, String configuration, String key) { warnings canComputeNew: false, canResolveRelativePaths: false, defaultEncoding: '', excludePattern: '''.*/EEPROM\\.h,.*/Dns\\.cpp,.*/socket\\.cpp,.*/util\\.h,.*/Servo\\.cpp, - .*/Adafruit_NeoPixel\\.cpp,.*/UIPEthernet.*,.*/SoftwareSerial\\.cpp, - .*/pins_arduino\\.h,.*/Stream\\.cpp,.*/USBCore\\.cpp,.*/Wire\\.cpp, - .*/hardware/esp8266.*,.*/libraries/SD/.*''', + .*/Adafruit_NeoPixel\\.cpp,.*/UIPEthernet.*,.*/SoftwareSerial\\.cpp, + .*/pins_arduino\\.h,.*/Stream\\.cpp,.*/USBCore\\.cpp,.*/Wire\\.cpp, + .*/hardware/.*,.*/libraries/.*''', failedTotalAll: '', healthy: '', includePattern: '', messagesPattern: '', parserConfigurations: [[parserName: 'GNU Make + GNU C Compiler (gcc)', pattern: config.library_root+'compiler_'+key+'.log']], unHealthy: '', unstableTotalAll: '0' diff --git a/.ci/pipeline.groovy b/.ci/pipeline.groovy index 4754b41e..3d437ad8 100644 --- a/.ci/pipeline.groovy +++ b/.ci/pipeline.groovy @@ -1,7 +1,9 @@ #!groovy def call(Closure body) { - def config = [:] + def config = [ + arduino_cli: '/opt/arduino-cli/arduino-cli', + ] body.resolveStrategy = Closure.DELEGATE_FIRST body.delegate = config body() @@ -30,20 +32,19 @@ def call(Closure body) { cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (Arduino Uno - Examples)', 'Not run yet...', '') cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (ESP32 - Tests)', 'Not run yet...', '') cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (ESP8266 - Tests)', 'Not run yet...', '') - cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (nRF52832 - Tests)', 'Not run yet...', '') + cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (nRF52 - Tests)', 'Not run yet...', '') cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (STM32F1 - Tests)', 'Not run yet...', '') cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (STM32F4 - Tests)', 'Not run yet...', '') // cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (MySensorsMicro - Tests)', 'Not run yet...', '') // cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (MySensorsGW - Tests)', 'Not run yet...', '') // cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (nRF51822 - Tests)', 'Not run yet...', '') - // cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (nRF5 - Tests)', 'Not run yet...', '') // cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (Arduino Mega - Tests)', 'Not run yet...', '') // cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (MySensorsMicro - Examples)', 'Not run yet...', '') // cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (MySensorsGW - Examples)', 'Not run yet...', '') // cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (nRF52832 - Examples)', 'Not run yet...', '') // cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (nRF51822 - Examples)', 'Not run yet...', '') - // cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (nRF5 - Examples)', 'Not run yet...', '') + // cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (nRF52 - Examples)', 'Not run yet...', '') // cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (STM32F1 - Examples)', 'Not run yet...', '') // cfg.pr.setBuildStatus(cfg, 'PENDING', 'Toll gate (STM32F4 - Examples)', 'Not run yet...', '') } @@ -146,7 +147,8 @@ def call(Closure body) { ) } - config.tests = findFiles(glob: "${config.library_root}tests/**/*.ino") + config.tests_fast = findFiles(glob: "${config.library_root}tests/fast/**/*.ino") + config.tests_nightly = findFiles(glob: "${config.library_root}tests/nightly/**/*.ino") config.examples = findFiles(glob: "${config.library_root}examples/**/*.ino") } @@ -177,75 +179,120 @@ def call(Closure body) { } } }, ArduinoBuilds: { - lock(quantity: 1, resource: 'arduinoEnv') { - stage('ArduinoUno (Tests)') { - arduino.buildArduinoUno(config, config.tests, 'Tests') + stage('ArduinoBuilds') { + // Run all Arduino builds in parallel + def arduinoBranches = [:] + + arduinoBranches['ArduinoUno (Tests)'] = { + stage('ArduinoUno (Tests)') { + arduino.buildArduinoUno(config, config.tests_fast, 'Tests') + } } - stage('ArduinoUno (Examples)') { - arduino.buildArduinoUno(config, config.examples, 'Examples') + arduinoBranches['ArduinoUno (Examples)'] = { + stage('ArduinoUno (Examples)') { + arduino.buildArduinoUno(config, config.examples, 'Examples') + } } - stage('ESP32 (Tests)') { - arduino.buildESP32(config, config.tests, 'Tests') + arduinoBranches['nRF52 (Tests)'] = { + stage('nRF52 (Tests)') { + arduino.buildnRF52(config, config.tests_fast, 'Tests') + } } - stage('nRF52832 (Tests)') { - arduino.buildnRF52832(config, config.tests, 'Tests') + arduinoBranches['STM32F1 (Tests)'] = { + stage('STM32F1 (Tests)') { + arduino.buildSTM32F1(config, config.tests_fast, 'Tests') + } } - stage('ESP8266 (Tests)') { - arduino.buildESP8266(config, config.tests, 'Tests') + arduinoBranches['STM32F4 (Tests)'] = { + stage('STM32F4 (Tests)') { + arduino.buildSTM32F4(config, config.tests_fast, 'Tests') + } } - stage('nRF5 (Tests)') { - arduino.buildnRF5(config, config.tests, 'Tests') + arduinoBranches['ESP32 (Tests)'] = { + stage('ESP32 (Tests)') { + arduino.buildESP32(config, config.tests_fast, 'Tests') + } } - stage('STM32F1 (Tests)') { - arduino.buildSTM32F1(config, config.tests, 'Tests') - } - stage('STM32F4 (Tests)') { - arduino.buildSTM32F4(config, config.tests, 'Tests') + arduinoBranches['ESP8266 (Tests)'] = { + stage('ESP8266 (Tests)') { + arduino.buildESP8266(config, config.tests_fast, 'Tests') + } } + /* - stage('MySensorsMicro (tests)') { - arduino.buildMySensorsMicro(config, config.tests, 'Tests') + arduinoBranches['MySensorsMicro (tests)'] = { + stage('MySensorsMicro (tests)') { + arduino.buildMySensorsMicro(config, config.tests_fast, 'Tests') + } } - stage('MySensorsGW (tests)') { - arduino.buildMySensorsGw(config, config.tests, 'Tests') + arduinoBranches['MySensorsGW (tests)'] = { + stage('MySensorsGW (tests)') { + arduino.buildMySensorsGw(config, config.tests_fast, 'Tests') + } } - stage('nRF51822 (tests)') { - arduino.buildnRF51822(config, config.tests, 'Tests') + arduinoBranches['nRF51822 (tests)'] = { + stage('nRF51822 (tests)') { + arduino.buildnRF51822(config, config.tests_fast, 'Tests') + } } - stage('ArduinoMega (tests)') { - arduino.buildArduinoMega(config, config.tests, 'Tests') + arduinoBranches['ArduinoMega (tests)'] = { + stage('ArduinoMega (tests)') { + arduino.buildArduinoMega(config, config.tests_fast, 'Tests') + } } - stage('MySensorsMicro (examples)') { - arduino.buildMySensorsMicro(config, config.examples, 'Examples') + arduinoBranches['MySensorsMicro (examples)'] = { + stage('MySensorsMicro (examples)') { + arduino.buildMySensorsMicro(config, config.examples, 'Examples') + } } - stage('MySensorsGW (examples)') { - arduino.buildMySensorsGw(config, config.examples, 'Examples') + arduinoBranches['MySensorsGW (examples)'] = { + stage('MySensorsGW (examples)') { + arduino.buildMySensorsGw(config, config.examples, 'Examples') + } } - stage('nRF52832 (examples)') { - arduino.buildnRF52832(config, config.examples, 'Examples') + arduinoBranches['nRF52832 (examples)'] = { + stage('nRF52832 (examples)') { + arduino.buildnRF52832(config, config.examples, 'Examples') + } } - stage('nRF51822 (examples)') { - arduino.buildnRF51822(config, config.examples, 'Examples') + arduinoBranches['nRF51822 (examples)'] = { + stage('nRF51822 (examples)') { + arduino.buildnRF51822(config, config.examples, 'Examples') + } } - stage('nRF5 (examples)') { - arduino.buildnRF5(config, config.examples, 'Examples') + arduinoBranches['nRF5 (examples)'] = { + stage('nRF5 (examples)') { + arduino.buildnRF5(config, config.examples, 'Examples') + } } - stage('ESP8266 (examples)') { - arduino.buildESP8266(config, config.examples, 'Examples') + arduinoBranches['ESP8266 (examples)'] = { + stage('ESP8266 (examples)') { + arduino.buildESP8266(config, config.examples, 'Examples') + } } - stage('ESP32 (examples)') { - arduino.buildESP32(config, config.examples, 'Examples') + arduinoBranches['ESP32 (examples)'] = { + stage('ESP32 (examples)') { + arduino.buildESP32(config, config.examples, 'Examples') + } } - stage('STM32F1 (Examples)') { - arduino.buildSTM32F1(config, config.tests, 'Examples') + arduinoBranches['STM32F1 (Examples)'] = { + stage('STM32F1 (Examples)') { + arduino.buildSTM32F1(config, config.examples, 'Examples') + } } - stage('STM32F4 (Examples)') { - arduino.buildSTM32F4(config, config.tests, 'Examples') + arduinoBranches['STM32F4 (Examples)'] = { + stage('STM32F4 (Examples)') { + arduino.buildSTM32F4(config, config.examples, 'Examples') + } } - stage('ArduinoMega (examples)') { - arduino.buildArduinoMega(config, config.examples, 'Examples') + arduinoBranches['ArduinoMega (examples)'] = { + stage('ArduinoMega (examples)') { + arduino.buildArduinoMega(config, config.examples, 'Examples') + } } */ + + parallel arduinoBranches } }, failFast: true } diff --git a/tests/Arduino/sketches/new_rfm69_driver/new_rfm69_driver.ino b/tests/fast/Arduino/sketches/new_rfm69_driver/new_rfm69_driver.ino similarity index 100% rename from tests/Arduino/sketches/new_rfm69_driver/new_rfm69_driver.ino rename to tests/fast/Arduino/sketches/new_rfm69_driver/new_rfm69_driver.ino diff --git a/tests/fast/Arduino/sketches/rf24_driver/rf24_driver.ino b/tests/fast/Arduino/sketches/rf24_driver/rf24_driver.ino new file mode 100644 index 00000000..163beece --- /dev/null +++ b/tests/fast/Arduino/sketches/rf24_driver/rf24_driver.ino @@ -0,0 +1,27 @@ +/* + * The MySensors Arduino library handles the wireless radio link and protocol + * between your home built sensors/actuators and HA controller of choice. + * The sensors forms a self healing radio network with optional repeaters. Each + * repeater and gateway builds a routing tables in EEPROM which keeps track of the + * network topology allowing messages to be routed to nodes. + * + * Created by Henrik Ekblad + * Copyright (C) 2013-2025 Sensnology AB + * Full contributor list: https://github.com/mysensors/MySensors/graphs/contributors + * + * Documentation: http://www.mysensors.org + * Support Forum: http://forum.mysensors.org + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + ******************************* + */ +#define MY_DEBUG +#define MY_RADIO_RF24 + +#include + +void setup() {} +void loop() {} diff --git a/tests/fast/Arduino/sketches/rfm95_driver/rfm95_driver.ino b/tests/fast/Arduino/sketches/rfm95_driver/rfm95_driver.ino new file mode 100644 index 00000000..da0b52e7 --- /dev/null +++ b/tests/fast/Arduino/sketches/rfm95_driver/rfm95_driver.ino @@ -0,0 +1,29 @@ +/* + * The MySensors Arduino library handles the wireless radio link and protocol + * between your home built sensors/actuators and HA controller of choice. + * The sensors forms a self healing radio network with optional repeaters. Each + * repeater and gateway builds a routing tables in EEPROM which keeps track of the + * network topology allowing messages to be routed to nodes. + * + * Created by Henrik Ekblad + * Copyright (C) 2013-2025 Sensnology AB + * Full contributor list: https://github.com/mysensors/MySensors/graphs/contributors + * + * Documentation: http://www.mysensors.org + * Support Forum: http://forum.mysensors.org + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + ******************************* + */ +#define MY_DEBUG +#define MY_RADIO_RFM95 +#define MY_RFM95_ENABLE_ENCRYPTION +#define MY_DEBUG_VERBOSE_RFM95 + +#include + +void setup() {} +void loop() {} diff --git a/tests/fast/Arduino/sketches/serial_gw/serial_gw.ino b/tests/fast/Arduino/sketches/serial_gw/serial_gw.ino new file mode 100644 index 00000000..6bb2234a --- /dev/null +++ b/tests/fast/Arduino/sketches/serial_gw/serial_gw.ino @@ -0,0 +1,27 @@ +/* + * The MySensors Arduino library handles the wireless radio link and protocol + * between your home built sensors/actuators and HA controller of choice. + * The sensors forms a self healing radio network with optional repeaters. Each + * repeater and gateway builds a routing tables in EEPROM which keeps track of the + * network topology allowing messages to be routed to nodes. + * + * Created by Henrik Ekblad + * Copyright (C) 2013-2025 Sensnology AB + * Full contributor list: https://github.com/mysensors/MySensors/graphs/contributors + * + * Documentation: http://www.mysensors.org + * Support Forum: http://forum.mysensors.org + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * version 2 as published by the Free Software Foundation. + * + ******************************* + */ +#define MY_DEBUG +#define MY_GATEWAY_SERIAL + +#include + +void setup() {} +void loop() {} diff --git a/tests/Arduino/sketches/serial_gw_no_transport_soft_signing_whitelisting_full_debug/serial_gw_no_transport_soft_signing_whitelisting_full_debug.ino b/tests/fast/Arduino/sketches/serial_gw_no_transport_soft_signing_whitelisting_full_debug/serial_gw_no_transport_soft_signing_whitelisting_full_debug.ino similarity index 100% rename from tests/Arduino/sketches/serial_gw_no_transport_soft_signing_whitelisting_full_debug/serial_gw_no_transport_soft_signing_whitelisting_full_debug.ino rename to tests/fast/Arduino/sketches/serial_gw_no_transport_soft_signing_whitelisting_full_debug/serial_gw_no_transport_soft_signing_whitelisting_full_debug.ino diff --git a/tests/Arduino/sketches/soft_signing_whitelisting_full_debug/soft_signing_whitelisting_full_debug.ino b/tests/fast/Arduino/sketches/soft_signing_whitelisting_full_debug/soft_signing_whitelisting_full_debug.ino similarity index 100% rename from tests/Arduino/sketches/soft_signing_whitelisting_full_debug/soft_signing_whitelisting_full_debug.ino rename to tests/fast/Arduino/sketches/soft_signing_whitelisting_full_debug/soft_signing_whitelisting_full_debug.ino diff --git a/tests/Arduino/sketches/hard_signing_no_whitelisting_full_debug/hard_signing_no_whitelisting_full_debug.ino b/tests/nightly/Arduino/sketches/hard_signing_no_whitelisting_full_debug/hard_signing_no_whitelisting_full_debug.ino similarity index 100% rename from tests/Arduino/sketches/hard_signing_no_whitelisting_full_debug/hard_signing_no_whitelisting_full_debug.ino rename to tests/nightly/Arduino/sketches/hard_signing_no_whitelisting_full_debug/hard_signing_no_whitelisting_full_debug.ino diff --git a/tests/Arduino/sketches/hard_signing_whitelisting_full_debug/hard_signing_whitelisting_full_debug.ino b/tests/nightly/Arduino/sketches/hard_signing_whitelisting_full_debug/hard_signing_whitelisting_full_debug.ino similarity index 100% rename from tests/Arduino/sketches/hard_signing_whitelisting_full_debug/hard_signing_whitelisting_full_debug.ino rename to tests/nightly/Arduino/sketches/hard_signing_whitelisting_full_debug/hard_signing_whitelisting_full_debug.ino diff --git a/tests/Arduino/sketches/hard_signing_whitelisting_full_debug_nodelock/hard_signing_whitelisting_full_debug_nodelock.ino b/tests/nightly/Arduino/sketches/hard_signing_whitelisting_full_debug_nodelock/hard_signing_whitelisting_full_debug_nodelock.ino similarity index 100% rename from tests/Arduino/sketches/hard_signing_whitelisting_full_debug_nodelock/hard_signing_whitelisting_full_debug_nodelock.ino rename to tests/nightly/Arduino/sketches/hard_signing_whitelisting_full_debug_nodelock/hard_signing_whitelisting_full_debug_nodelock.ino diff --git a/tests/Arduino/sketches/hard_signing_whitelisting_full_debug_rf24_rsa/hard_signing_whitelisting_full_debug_rf24_rsa.ino b/tests/nightly/Arduino/sketches/hard_signing_whitelisting_full_debug_rf24_rsa/hard_signing_whitelisting_full_debug_rf24_rsa.ino similarity index 100% rename from tests/Arduino/sketches/hard_signing_whitelisting_full_debug_rf24_rsa/hard_signing_whitelisting_full_debug_rf24_rsa.ino rename to tests/nightly/Arduino/sketches/hard_signing_whitelisting_full_debug_rf24_rsa/hard_signing_whitelisting_full_debug_rf24_rsa.ino diff --git a/tests/Arduino/sketches/hard_signing_whitelisting_full_debug_rfm69_rsa/hard_signing_whitelisting_full_debug_rfm69_rsa.ino b/tests/nightly/Arduino/sketches/hard_signing_whitelisting_full_debug_rfm69_rsa/hard_signing_whitelisting_full_debug_rfm69_rsa.ino similarity index 100% rename from tests/Arduino/sketches/hard_signing_whitelisting_full_debug_rfm69_rsa/hard_signing_whitelisting_full_debug_rfm69_rsa.ino rename to tests/nightly/Arduino/sketches/hard_signing_whitelisting_full_debug_rfm69_rsa/hard_signing_whitelisting_full_debug_rfm69_rsa.ino diff --git a/tests/Arduino/sketches/hard_signing_whitelisting_full_debug_rfm95_rsa/hard_signing_whitelisting_full_debug_rfm95_rsa.ino b/tests/nightly/Arduino/sketches/hard_signing_whitelisting_full_debug_rfm95_rsa/hard_signing_whitelisting_full_debug_rfm95_rsa.ino similarity index 100% rename from tests/Arduino/sketches/hard_signing_whitelisting_full_debug_rfm95_rsa/hard_signing_whitelisting_full_debug_rfm95_rsa.ino rename to tests/nightly/Arduino/sketches/hard_signing_whitelisting_full_debug_rfm95_rsa/hard_signing_whitelisting_full_debug_rfm95_rsa.ino diff --git a/tests/Arduino/sketches/ota_firmware_update_rf24/ota_firmware_update_rf24.ino b/tests/nightly/Arduino/sketches/ota_firmware_update_rf24/ota_firmware_update_rf24.ino similarity index 100% rename from tests/Arduino/sketches/ota_firmware_update_rf24/ota_firmware_update_rf24.ino rename to tests/nightly/Arduino/sketches/ota_firmware_update_rf24/ota_firmware_update_rf24.ino diff --git a/tests/Arduino/sketches/pjon_transport/pjon_transport.ino b/tests/nightly/Arduino/sketches/pjon_transport/pjon_transport.ino similarity index 100% rename from tests/Arduino/sketches/pjon_transport/pjon_transport.ino rename to tests/nightly/Arduino/sketches/pjon_transport/pjon_transport.ino diff --git a/tests/Arduino/sketches/serial_gw_no_transport_hard_signing_whitelisting_full_debug/serial_gw_no_transport_hard_signing_whitelisting_full_debug.ino b/tests/nightly/Arduino/sketches/serial_gw_no_transport_hard_signing_whitelisting_full_debug/serial_gw_no_transport_hard_signing_whitelisting_full_debug.ino similarity index 100% rename from tests/Arduino/sketches/serial_gw_no_transport_hard_signing_whitelisting_full_debug/serial_gw_no_transport_hard_signing_whitelisting_full_debug.ino rename to tests/nightly/Arduino/sketches/serial_gw_no_transport_hard_signing_whitelisting_full_debug/serial_gw_no_transport_hard_signing_whitelisting_full_debug.ino diff --git a/tests/Arduino/sketches/soft_signing_no_whitelisting_full_debug/soft_signing_no_whitelisting_full_debug.ino b/tests/nightly/Arduino/sketches/soft_signing_no_whitelisting_full_debug/soft_signing_no_whitelisting_full_debug.ino similarity index 100% rename from tests/Arduino/sketches/soft_signing_no_whitelisting_full_debug/soft_signing_no_whitelisting_full_debug.ino rename to tests/nightly/Arduino/sketches/soft_signing_no_whitelisting_full_debug/soft_signing_no_whitelisting_full_debug.ino