diff --git a/api/Jenkinsfile.ble_test b/api/Jenkinsfile.ble_test index a55f4c3..941039d 100644 --- a/api/Jenkinsfile.ble_test +++ b/api/Jenkinsfile.ble_test @@ -1,46 +1,77 @@ pipeline { agent any + // ------------------------------------------------------------------ + // Global environment variables – change as needed + // ------------------------------------------------------------------ environment { - DEBIAN_IP = 'debian_machine_ip' - SSH_CREDENTIALS_ID = 'jenkins_root_ssh' - REMOTE_SCRIPT = '/opt/ble-test/ble_api/api/ble.py' + DEBIAN_IP = 'debian_machine_ip' + SSH_CREDENTIALS_ID = 'jenkins_root_ssh' + REMOTE_SCRIPT = '/opt/ble-test/ble_api/api/ble.py' } + // ------------------------------------------------------------------ + // Build parameters (visible to the user) + // ------------------------------------------------------------------ parameters { - string(name: 'host_ip', defaultValue: '172.20.20.51', description: 'IP of the host that runs the BLE test') - string(name: 'test_count', defaultValue: '25', description: 'Number of test iterations') - string(name: 'BT_USB_ID', defaultValue: '0bda:c821', description: 'USB ID of the BLE dongle') + string(name: 'host_ip', defaultValue: '', description: 'IP of the host that runs the BLE test') + string(name: 'test_count', defaultValue: '1000', description: 'Number of test iterations') + string(name: 'BT_USB_ID', defaultValue: '0001', description: 'USB ID of the BLE dongle') } + // ------------------------------------------------------------------ + // Stages + // ------------------------------------------------------------------ stages { + + // --------------------------------------------------------------- + // 1️⃣ Prepare a unique screen session name + // --------------------------------------------------------------- + stage('Prepare Screen Name') { + steps { + script { + // epoch seconds truncated to the last 6 digits + def epochSec = System.currentTimeMillis() / 1000 + env.SCREEN_SESSION = "ble_test_${String.format('%06d', epochSec % 1_000_000)}" + } + } + } + + // --------------------------------------------------------------- + // 2️⃣ Verify / install screen (runs only once) + // --------------------------------------------------------------- + stage('Ensure screen is present') { + steps { + sshagent([env.SSH_CREDENTIALS_ID]) { + sh """ + ssh -o StrictHostKeyChecking=no \\ + -o ServerAliveInterval=60 \\ + -o ServerAliveCountMax=120 \\ + root@${params.host_ip} <<'EOF' + # If screen is missing, install it + if ! command -v screen > /dev/null; then + echo "screen not found – installing" + apt-get update && apt-get install -y screen + fi + EOF + """ + } + } + } + + // --------------------------------------------------------------- + // 3️⃣ Run the BLE test in a detached screen session + // --------------------------------------------------------------- stage('Run BLE Test') { steps { - // ----- 1. Compute a 6‑digit hash from the epoch seconds - script { - // epoch seconds at the moment the build starts - def epochSec = System.currentTimeMillis() / 1000 - // keep only the last 6 decimal digits - def hash = String.format("%06d", epochSec % 1_000_000) - env.SCREEN_SESSION = "ble_test_${hash}" - } - - // ----- 2. Retry SSH 3× in case of a transient hiccup retry(3) { - // ----- 3. Timeout the whole test (adjust as needed) - timeout(time: 5, unit: 'MINUTES') { + timeout(time: 8, unit: 'HOURS') { sshagent([env.SSH_CREDENTIALS_ID]) { sh """ ssh -o StrictHostKeyChecking=no \\ -o ServerAliveInterval=60 \\ -o ServerAliveCountMax=120 \\ root@${params.host_ip} <<'EOF' - # Ensure screen is present - if ! command -v screen > /dev/null; then - echo "screen not found - installing" - apt-get update && apt-get install -y screen - fi - # Start the test in a detached screen session screen -dmS ${env.SCREEN_SESSION} bash -c ' echo "===== BLE test starting: \$(date)" > /tmp/ble_test.log @@ -52,17 +83,13 @@ pipeline { python3 -u ${REMOTE_SCRIPT} ${params.test_count} 2>&1 | tee -a /tmp/ble_test.log echo "===== BLE test finished: \$(date)" >> /tmp/ble_test.log ' - # Give screen a moment to spin up sleep 2 EOF """ } - // Small pause so the screen session has a chance to start - sh 'sleep 2' - - // Verify that the test reported completion + // Verify that the test finished sh """ ssh -o StrictHostKeyChecking=no \\ -o ServerAliveInterval=60 \\ @@ -71,30 +98,34 @@ pipeline { if grep -q "BLE test finished" /tmp/ble_test.log; then echo "Test completed successfully." else - echo "Test did NOT finish - aborting build." + echo "Test did NOT finish – aborting build." exit 1 fi EOF """ - } // end timeout - } // end retry - } // end steps - } // end stage - } // end stages + } + } + } + } + } - // ----- 4. Clean up the screen session on the remote host + // ------------------------------------------------------------------ + // Post‑build cleanup – kill the remote screen session + // ------------------------------------------------------------------ post { always { - sh """ - ssh -o StrictHostKeyChecking=no \\ - -o ServerAliveInterval=60 \\ - -o ServerAliveCountMax=120 \\ - root@${params.host_ip} <<'EOF' - if screen -list | grep -q ${env.SCREEN_SESSION}; then - screen -S ${env.SCREEN_SESSION} -X quit - fi - EOF - """ + sshagent([env.SSH_CREDENTIALS_ID]) { + sh """ + ssh -o StrictHostKeyChecking=no \\ + -o ServerAliveInterval=60 \\ + -o ServerAliveCountMax=120 \\ + root@${params.host_ip} <<'EOF' + if screen -list | grep -q ${env.SCREEN_SESSION}; then + screen -S ${env.SCREEN_SESSION} -X quit + fi + EOF + """ + } } } } \ No newline at end of file diff --git a/api/ble.py b/api/ble.py index 9710df2..5d92ddd 100644 --- a/api/ble.py +++ b/api/ble.py @@ -291,7 +291,7 @@ def test(test_count = 0, bt_usb_id = None) -> None: log.info(f" Scanning MACs: {mac_list}") test_list = mac_list while not test_result: - if test_count > 20: + if test_loop_count > 20: reset_adapter() reset_count = reset_count + 1 test_loop_count = 0