parallel_tests with knapsack_pro on parallel CI nodes
You can run knapsack_pro
with parallel_tests gem to run multiple concurrent knapsack_pro
commands per CI node.
Let's consider this example. We have 2 CI node. On each CI node we want to run 2 concurrent knapsack_pro
commands by parallel_tests
gem (PARALLEL_TESTS_CONCURRENCY=2
).
This means we would have 4 parallel knapsack_pro
commands in total across all CI nodes. So from knapsack_pro
perspective you will have 4 nodes in total.
Create in your project directory an executable file bin/parallel_tests
:
#!/bin/bash
# This file should be in bin/parallel_tests
# updates CI node total based on parallel_tests concurrency
KNAPSACK_PRO_CI_NODE_TOTAL=$(( $PARALLEL_TESTS_CONCURRENCY * $KNAPSACK_PRO_CI_NODE_TOTAL ))
if [ "$TEST_ENV_NUMBER" == "" ]; then
PARALLEL_TESTS_CONCURRENCY_INDEX=0
else
PARALLEL_TESTS_CONCURRENCY_INDEX=$(( $TEST_ENV_NUMBER - 1 ))
fi
KNAPSACK_PRO_CI_NODE_INDEX=$(( $PARALLEL_TESTS_CONCURRENCY_INDEX + ($PARALLEL_TESTS_CONCURRENCY * $KNAPSACK_PRO_CI_NODE_INDEX) ))
# logs info about ENVs to ensure everything works
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
# you can customize your knapsack_pro command here to use regular or queue mode
bundle exec rake knapsack_pro:queue:rspec
Now you need to set parallel_tests
command per CI node:
CI node 0 (first CI node):
export PARALLEL_TESTS_CONCURRENCY=2; # this must be export RAILS_ENV=test \ KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC=xxx \ KNAPSACK_PRO_CI_NODE_TOTAL=$YOUR_CI_NODE_TOTAL \ KNAPSACK_PRO_CI_NODE_INDEX=$YOUR_CI_NODE_INDEX \ bundle exec parallel_test -n $PARALLEL_TESTS_CONCURRENCY -e './bin/parallel_tests'
CI node 1 (second CI node):
export PARALLEL_TESTS_CONCURRENCY=2; # this must be export RAILS_ENV=test \ KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC=xxx \ KNAPSACK_PRO_CI_NODE_TOTAL=$YOUR_CI_NODE_TOTAL \ KNAPSACK_PRO_CI_NODE_INDEX=$YOUR_CI_NODE_INDEX \ bundle exec parallel_test -n $PARALLEL_TESTS_CONCURRENCY -e './bin/parallel_tests'
Please note you need to update $YOUR_CI_NODE_TOTAL
and $YOUR_CI_NODE_INDEX
to the ENVs provided by your CI provider. For instance in case of CircleCI it would be $CIRCLE_NODE_TOTAL
and $CIRCLE_NODE_INDEX
. Below is an example for CircleCI configuration:
# circle.yml for CircleCI 1.0
# KNAPSACK_PRO_TEST_SUITE_TOKEN_RSPEC=xxx can be set in CircleCI ENV settings
test:
override:
- export PARALLEL_TESTS_CONCURRENCY=2; RAILS_ENV=test KNAPSACK_PRO_CI_NODE_TOTAL=$CIRCLE_NODE_TOTAL KNAPSACK_PRO_CI_NODE_INDEX=$CIRCLE_NODE_INDEX bundle exec parallel_test -n $PARALLEL_TESTS_CONCURRENCY -e './bin/parallel_tests':
parallel: true # Caution: there are 8 spaces indentation!
In summary, the bin/parallel_tests
script will calculate a new values for KNAPSAKC_PRO_*
environment variables and then run knapsack_pro
command with them.
To ensure everything works you can check output for each CI node.
Expected output for CI node 0 (first CI node):
KNAPSACK_PRO_CI_NODE_TOTAL=4 KNAPSACK_PRO_CI_NODE_INDEX=1 PARALLEL_TESTS_CONCURRENCY=2 KNAPSACK_PRO_CI_NODE_TOTAL=4 KNAPSACK_PRO_CI_NODE_INDEX=0 PARALLEL_TESTS_CONCURRENCY=2 (tests output here)
Expected output for CI node 1 (second CI node):
KNAPSACK_PRO_CI_NODE_TOTAL=4 KNAPSACK_PRO_CI_NODE_INDEX=2 PARALLEL_TESTS_CONCURRENCY=2 KNAPSACK_PRO_CI_NODE_TOTAL=4 KNAPSACK_PRO_CI_NODE_INDEX=3 PARALLEL_TESTS_CONCURRENCY=2 (tests output here)
See also
See also tips on how to do it on on a single powerful CI server.