Skip to content

Commit ce4d6c2

Browse files
authored
update(parallel_tests): add an example of handling signals for Spot Instances (#238)
1 parent 839d60b commit ce4d6c2

File tree

2 files changed

+70
-24
lines changed

2 files changed

+70
-24
lines changed
Lines changed: 66 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,9 @@ pagination_next: null
33
pagination_prev: null
44
---
55

6+
import Tabs from '@theme/Tabs';
7+
import TabItem from '@theme/TabItem';
8+
69
# Using Knapsack Pro with `parallel_tests`
710

811
:::caution
@@ -54,26 +57,69 @@ bundle exec parallel_test -n $PARALLEL_TESTS_CONCURRENCY -e './bin/parallel_test
5457

5558
Create `bin/parallel_tests` and make it executable `chmod u+x`:
5659

57-
```bash
58-
#!/bin/bash
59-
60-
# The Knapsack Pro API sees 3 * 2 = 6 parallel nodes
61-
export KNAPSACK_PRO_CI_NODE_TOTAL=$(( $PARALLEL_TESTS_CONCURRENCY * $KNAPSACK_PRO_CI_NODE_TOTAL ))
62-
63-
if [ "$TEST_ENV_NUMBER" == "" ]; then
64-
export PARALLEL_TESTS_CONCURRENCY_INDEX=0
65-
else
66-
export PARALLEL_TESTS_CONCURRENCY_INDEX=$(( $TEST_ENV_NUMBER - 1 ))
67-
fi
68-
69-
# The current index for the Knapsack Pro API is {0,1,2} + (3 * {0,1}) in other words either {0,1,2,3,4,5}
70-
KNAPSACK_PRO_CI_NODE_INDEX=$(( $PARALLEL_TESTS_CONCURRENCY_INDEX + ($PARALLEL_TESTS_CONCURRENCY * $KNAPSACK_PRO_CI_NODE_INDEX) ))
71-
72-
# Debug log
73-
echo KNAPSACK_PRO_CI_NODE_TOTAL=$KNAPSACK_PRO_CI_NODE_TOTAL KNAPSACK_PRO_CI_NODE_INDEX=$KNAPSACK_PRO_CI_NODE_INDEX PARALLEL_TESTS_CONCURRENCY=$PARALLEL_TESTS_CONCURRENCY
74-
75-
bundle exec rake knapsack_pro:queue:rspec
76-
```
60+
<Tabs>
61+
<TabItem value="parallel_tests-on-parallel-nodes-default" label="Default" default>
62+
```bash
63+
#!/bin/bash
64+
65+
# The Knapsack Pro API sees 3 * 2 = 6 parallel nodes
66+
export KNAPSACK_PRO_CI_NODE_TOTAL=$(( $PARALLEL_TESTS_CONCURRENCY * $KNAPSACK_PRO_CI_NODE_TOTAL ))
67+
68+
if [ "$TEST_ENV_NUMBER" == "" ]; then
69+
export PARALLEL_TESTS_CONCURRENCY_INDEX=0
70+
else
71+
export PARALLEL_TESTS_CONCURRENCY_INDEX=$(( $TEST_ENV_NUMBER - 1 ))
72+
fi
73+
74+
# The current index for the Knapsack Pro API is {0,1,2} + (3 * {0,1}) in other words either {0,1,2,3,4,5}
75+
KNAPSACK_PRO_CI_NODE_INDEX=$(( $PARALLEL_TESTS_CONCURRENCY_INDEX + ($PARALLEL_TESTS_CONCURRENCY * $KNAPSACK_PRO_CI_NODE_INDEX) ))
76+
77+
# Debug log
78+
echo KNAPSACK_PRO_CI_NODE_TOTAL=$KNAPSACK_PRO_CI_NODE_TOTAL KNAPSACK_PRO_CI_NODE_INDEX=$KNAPSACK_PRO_CI_NODE_INDEX PARALLEL_TESTS_CONCURRENCY=$PARALLEL_TESTS_CONCURRENCY
79+
80+
bundle exec rake knapsack_pro:queue:rspec
81+
```
82+
</TabItem>
83+
<TabItem value="parallel_tests-on-parallel-nodes-spot-instances" label="with Spot Instances">
84+
If you use AWS Spot Instances as CI nodes, ensure that the termination signal is properly propagated down the script hierarchy.
85+
86+
```bash
87+
#!/bin/bash
88+
89+
handle_signal() {
90+
local signal=$1
91+
if [[ -n $knapsack_pro_pid ]]; then
92+
echo "KNAPSACK_PRO_CI_NODE_INDEX=$KNAPSACK_PRO_CI_NODE_INDEX Received signal $signal in bin/parallel_tests, terminating the Knapsack Pro process with TERM"
93+
kill -TERM $knapsack_pro_pid
94+
echo "KNAPSACK_PRO_CI_NODE_INDEX=$KNAPSACK_PRO_CI_NODE_INDEX Waiting for the Knapsack Pro process with PID $knapsack_pro_pid to terminate"
95+
wait $knapsack_pro_pid
96+
fi
97+
}
98+
99+
trap 'handle_signal TERM' TERM
100+
trap 'handle_signal INT' INT
101+
102+
# The Knapsack Pro API sees 3 * 2 = 6 parallel nodes
103+
export KNAPSACK_PRO_CI_NODE_TOTAL=$(( $PARALLEL_TESTS_CONCURRENCY * $KNAPSACK_PRO_CI_NODE_TOTAL ))
104+
105+
if [ "$TEST_ENV_NUMBER" == "" ]; then
106+
export PARALLEL_TESTS_CONCURRENCY_INDEX=0
107+
else
108+
export PARALLEL_TESTS_CONCURRENCY_INDEX=$(( $TEST_ENV_NUMBER - 1 ))
109+
fi
110+
111+
# The current index for the Knapsack Pro API is {0,1,2} + (3 * {0,1}) in other words either {0,1,2,3,4,5}
112+
KNAPSACK_PRO_CI_NODE_INDEX=$(( $PARALLEL_TESTS_CONCURRENCY_INDEX + ($PARALLEL_TESTS_CONCURRENCY * $KNAPSACK_PRO_CI_NODE_INDEX) ))
113+
114+
# Debug log
115+
echo KNAPSACK_PRO_CI_NODE_TOTAL=$KNAPSACK_PRO_CI_NODE_TOTAL KNAPSACK_PRO_CI_NODE_INDEX=$KNAPSACK_PRO_CI_NODE_INDEX PARALLEL_TESTS_CONCURRENCY=$PARALLEL_TESTS_CONCURRENCY
116+
117+
bundle exec rake knapsack_pro:queue:rspec &
118+
knapsack_pro_pid=$!
119+
wait $knapsack_pro_pid
120+
```
121+
</TabItem>
122+
</Tabs>
77123

78124
Running the above on CI should result in:
79125

docusaurus/docs/ruby/rspec.mdx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ You need to install the [`rspec_junit_formatter`](https://github.com/sj26/rspec_
7979
bundle exec rake "knapsack_pro:queue:rspec[--format documentation --format RspecJunitFormatter --out tmp/rspec_$MY_CI_NODE_INDEX.xml]"
8080
```
8181

82-
This also applies if you are running parallel test processes on each CI node (see how to [integrate Knapsack Pro with `parallel_tests` here](parallel_tests.md)).
82+
This also applies if you are running parallel test processes on each CI node (see how to [integrate Knapsack Pro with `parallel_tests` here](parallel_tests.mdx)).
8383

8484
<details>
8585
<summary>For legacy versions of `knapsack_pro` older than 7.0, please click here.</summary>
@@ -111,7 +111,7 @@ You need to install the [`rspec_junit_formatter`](https://github.com/sj26/rspec_
111111
FINAL_REPORT = "tmp/final_rspec_#{ENV['KNAPSACK_PRO_CI_NODE_INDEX']}.xml"
112112
```
113113

114-
This applies also if you are running parallel test processes on each CI node (see our page on to integrate Knapsack Pro with [`parallel_tests`](parallel_tests.md) for an example).
114+
This applies also if you are running parallel test processes on each CI node (see our page on to integrate Knapsack Pro with [`parallel_tests`](parallel_tests.mdx) for an example).
115115
</details>
116116
</TabItem>
117117
<TabItem value="json-formatter" label="Regular Mode">
@@ -136,7 +136,7 @@ You need to install the [`rspec_junit_formatter`](https://github.com/sj26/rspec_
136136
bundle exec rake "knapsack_pro:queue:rspec[--format documentation --format json --out tmp/rspec_$MY_CI_NODE_INDEX.json]"
137137
```
138138

139-
This also applies if you are running parallel test processes on each CI node (see how to [integrate Knapsack Pro with `parallel_tests` here](parallel_tests.md)).
139+
This also applies if you are running parallel test processes on each CI node (see how to [integrate Knapsack Pro with `parallel_tests` here](parallel_tests.mdx)).
140140

141141
<details>
142142
<summary>For legacy versions of `knapsack_pro` older than 7.0, please click here.</summary>
@@ -168,7 +168,7 @@ You need to install the [`rspec_junit_formatter`](https://github.com/sj26/rspec_
168168
FINAL_REPORT = "tmp/final_rspec_#{ENV['KNAPSACK_PRO_CI_NODE_INDEX']}.json"
169169
```
170170

171-
This applies also if you are running parallel test processes on each CI node (see our page on to integrate Knapsack Pro with [`parallel_tests`](parallel_tests.md) for an example).
171+
This applies also if you are running parallel test processes on each CI node (see our page on to integrate Knapsack Pro with [`parallel_tests`](parallel_tests.mdx) for an example).
172172
</details>
173173
</TabItem>
174174
<TabItem value="json-formatter" label="Regular Mode">

0 commit comments

Comments
 (0)