131 lines
5.7 KiB
Plaintext
131 lines
5.7 KiB
Plaintext
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: '', 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 {
|
||
retry(3) {
|
||
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'
|
||
# Start the test in a detached screen session
|
||
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
|
||
"""
|
||
}
|
||
|
||
// Verify that the test finished
|
||
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
|
||
"""
|
||
}
|
||
}
|
||
}
|
||
} |