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' } // ------------------------------------------------------------------ // 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') } // ------------------------------------------------------------------ // Stages // ------------------------------------------------------------------ stages { // --------------------------------------------------------------- // 1️⃣ Generate a unique screen session name // --------------------------------------------------------------- stage('Prepare Screen Name') { steps { script { // 1) Get epoch seconds (long) long epochSec = (System.currentTimeMillis() / 1000L) as long // 2) Keep only the last 6 digits to avoid collisions env.SCREEN_SESSION = "ble_test_${String.format('%06d', epochSec % 1_000_000)}" } } } // --------------------------------------------------------------- // 2️⃣ Ensure screen is installed (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 ! 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 inside a detached screen session // --------------------------------------------------------------- stage('Run BLE Test') { steps { retry(3) { // 3× retry on transient SSH hiccups timeout(time: 8, unit: 'HOURS') { // 8‑hour hard timeout sshagent([env.SSH_CREDENTIALS_ID]) { sh '''\ ssh -o StrictHostKeyChecking=no \ -o ServerAliveInterval=60 \ -o ServerAliveCountMax=120 \ root@${params.host_ip} <<'EOF' # Start test in detached screen screen -dmS ${env.SCREEN_SESSION} bash -c ' echo "===== BLE test starting: $(date)" > /tmp/ble_test.log usbreset ${params.BT_USB_ID} sleep 5 cd /opt/ble-test/ble_api git pull cd /opt/ble-test/ble_api/api 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 ''' } // ------------------------------------------------------------------ // 3a. Verify that the test finished successfully // ------------------------------------------------------------------ sh '''\ ssh -o StrictHostKeyChecking=no \ -o ServerAliveInterval=60 \ -o ServerAliveCountMax=120 \ root@${params.host_ip} <<'EOF' if grep -q "BLE test finished" /tmp/ble_test.log; then echo "Test completed successfully." else echo "Test did NOT finish – aborting build." exit 1 fi EOF ''' } } } } } // ------------------------------------------------------------------ // Post‑build cleanup – kill the remote screen session // ------------------------------------------------------------------ post { always { 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 ''' } } } }