-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Expand file tree
/
Copy pathJenkinsfile
More file actions
141 lines (137 loc) · 5.09 KB
/
Jenkinsfile
File metadata and controls
141 lines (137 loc) · 5.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
import org.jenkinsci.plugins.workflow.steps.FlowInterruptedException
pipeline {
agent any
stages {
stage('Build Docker Image') {
steps {
sh 'docker build -t hackrf https://github.com/greatscottgadgets/hackrf.git'
}
}
stage('Test HackRF One') {
agent {
docker {
image 'hackrf'
reuseNode true
args '''--group-add=20 --group-add=46 --device-cgroup-rule="c 189:* rmw" \
--device-cgroup-rule="c 166:* rmw" -v /dev/bus/usb:/dev/bus/usb \
-v /tmp/req_pipe:/tmp/req_pipe -v /tmp/res_pipe:/tmp/res_pipe'''
}
}
steps {
sh './ci-scripts/install_host.sh'
sh './ci-scripts/build_h1_firmware.sh'
script {
allOff();
}
retry(3) {
script {
reset('h1_eut')
}
sh 'sleep 1s'
sh './ci-scripts/test_host.sh'
}
retry(3) {
script {
reset('h1_tester h1_eut')
}
sh 'sleep 1s'
script {
// Allow 5 minutes for the test to run
runCommand(5, 'MINUTES', "HackRF One Test",
'''python3 ci-scripts/hackrf_test.py --ci --log log \
--hostdir host/build/hackrf-tools/src/ \
--fwupdate firmware/hackrf_usb/build/ \
--tester 0000000000000000325866e629a25623 \
--eut RunningFromRAM --unattended --rev r4'''
)
allOff()
}
}
retry(3) {
script {
reset('h1_eut')
}
sh 'sleep 1s'
sh 'python3 ci-scripts/test_sgpio_debug.py'
}
}
}
stage('Test HackRF Pro') {
agent {
docker {
image 'hackrf'
reuseNode true
args '''--group-add=20 --group-add=46 --device-cgroup-rule="c 189:* rmw" \
--device-cgroup-rule="c 166:* rmw" -v /dev/bus/usb:/dev/bus/usb \
-v /tmp/req_pipe:/tmp/req_pipe -v /tmp/res_pipe:/tmp/res_pipe'''
}
}
steps {
sh './ci-scripts/install_host.sh'
sh './ci-scripts/build_hpro_firmware.sh'
script {
allOff();
}
retry(3) {
script {
reset('hpro_eut')
}
sh 'sleep 1s'
sh './ci-scripts/test_host.sh'
}
retry(3) {
script {
reset('hpro_tester hpro_eut')
}
sh 'sleep 1s'
script {
// Allow 5 minutes for the test to run
runCommand(5, 'MINUTES', "HackRF Pro Test",
'''python3 ci-scripts/hackrf_pro_test.py --ci --log log \
--hostdir host/build/hackrf-tools/src \
--fwupdate firmware/hackrf_usb/build \
--tester 0000000000000000a06063c82338145f \
--eut RunningFromRAM -p --rev r1.2'''
)
}
}
}
}
}
post {
always {
cleanWs(cleanWhenNotBuilt: false,
deleteDirs: true,
disableDeferredWipeout: true,
notFailBuild: true)
}
}
}
def allOff() {
// Allow 20 seconds for the USB hub port power server to respond
runCommand(20, 'SECONDS', 'USB hub port power server command', "hubs all off")
}
def reset(devices) {
// Allow 20 seconds for the USB hub port power server to respond
runCommand(20, 'SECONDS', 'USB hub port power server command', "hubs ${devices} reset")
}
def runCommand(time, unit, title, cmd) {
try {
timeout(time: time, unit: unit) {
sh "${cmd}"
}
} catch (FlowInterruptedException err) {
// Check if the cause was specifically an exceeded timeout
def cause = err.getCauses().get(0)
if (cause instanceof org.jenkinsci.plugins.workflow.steps.TimeoutStepExecution.ExceededTimeout) {
echo "${title} timeout reached."
throw err // Re-throw the exception to fail the build
} else {
echo "Build interrupted for another reason."
throw err // Re-throw the exception to fail the build
}
} catch (Exception err) {
echo "An unrelated error occurred: ${err.getMessage()}"
throw err
}
}