blob: f456f521b9d841a7f2d0595096ca68e27c507362 [file] [log] [blame]
#!/bin/bash
# Copyright (c) 2017 Linaro Limited
#
# SPDX-License-Identifier: Apache-2.0
#
# Author: Anas Nashif
#
# This script is run in CI and support both pull request and commit modes. So
# it can be used also on commits to the tree or on tags.
# The following options are supports:
# -p start the script for pull requests
# -m matrix node number, for example 3 on a 5 node matrix
# -M total number of nodes in the matrix
# -b base branch
# -r the remote to rebase on
#
# The script can be run locally using for exmaple:
# ./scripts/ci/run_ci.sh -b master -r upstream -p
source zephyr-env.sh
SANITYCHECK_OPTIONS=" --inline-logs --enable-coverage -N"
SANITYCHECK_OPTIONS_RETRY="${SANITYCHECK_OPTIONS} --only-failed --outdir=out-2nd-pass"
SANITYCHECK_OPTIONS_RETRY_2="${SANITYCHECK_OPTIONS} --only-failed --outdir=out-3nd-pass"
SANITYCHECK="${ZEPHYR_BASE}/scripts/sanitycheck"
MATRIX_BUILDS=1
MATRIX=1
while getopts ":pm:b:r:M:" opt; do
case $opt in
p)
echo "Testing a Pull Request." >&2
PULL_REQUEST=1
;;
m)
echo "Running on Matrix $OPTARG" >&2
MATRIX=$OPTARG
;;
M)
echo "Running a matrix of $OPTARG slaves" >&2
MATRIX_BUILDS=$OPTARG
;;
b)
echo "Base Branch: $OPTARG" >&2
BRANCH=$OPTARG
;;
r)
echo "Remote: $OPTARG" >&2
REMOTE=$OPTARG
;;
\?)
echo "Invalid option: -$OPTARG" >&2
;;
esac
done
DOC_MATRIX=${MATRIX_BUILDS}
if [ -z "$BRANCH" ]; then
echo "No base branch given"
exit
fi
if [ -n "$PULL_REQUEST" ]; then
git rebase $REMOTE/${BRANCH};
fi
if [ -n "$BRANCH" ]; then
COMMIT_RANGE=$REMOTE/${BRANCH}..HEAD
echo "Commit range:" ${COMMIT_RANGE}
else
exit
fi
function build_btsim() {
NRF_HW_MODELS_VERSION=`cat boards/posix/nrf52_bsim/hw_models_version`
pushd . ;
cd ${BSIM_COMPONENTS_PATH} ;
if [ -d ext_NRF52_hw_models ]; then
cd ext_NRF52_hw_models
git describe --tags --abbrev=0 ${NRF52_HW_MODELS_TAG}\
> /dev/null
if [ "$?" != "0" ]; then
echo "`pwd` seems to contain the nRF52 HW\
models but they are out of date"
exit 1;
fi
else
git clone -b ${NRF_HW_MODELS_VERSION} \
https://github.com/BabbleSim/ext_NRF52_hw_models.git
fi
cd ${BSIM_OUT_PATH}
make everything -j 8 -s
popd ;
}
function run_bsim_bt_tests() {
WORK_DIR=${ZEPHYR_BASE}/bsim_bt_out tests/bluetooth/bsim_bt/compile.sh
RESULTS_FILE=${ZEPHYR_BASE}/${BSIM_BT_TEST_RESULTS_FILE} \
SEARCH_PATH=tests/bluetooth/bsim_bt/bsim_test_app/tests_scripts \
tests/bluetooth/bsim_bt/run_parallel.sh
}
function build_docs() {
echo "- Building Documentation";
make htmldocs
if [ "$?" != "0" ]; then
echo "Documentation build failed";
exit 1;
fi
if [ -s doc/_build/doc.warnings ]; then
echo " => New documentation warnings/errors";
cp doc/_build/doc.warnings doc.warnings
fi
echo "- Verify commit message, coding style, doc build";
}
function get_tests_to_run() {
./scripts/ci/get_modified_tests.py --commits ${COMMIT_RANGE} > modified_tests.args;
./scripts/ci/get_modified_boards.py --commits ${COMMIT_RANGE} > modified_boards.args;
if [ -s modified_boards.args ]; then
${SANITYCHECK} ${SANITYCHECK_OPTIONS} +modified_boards.args --save-tests test_file.txt || exit 1;
fi
if [ -s modified_tests.args ]; then
${SANITYCHECK} ${SANITYCHECK_OPTIONS} +modified_tests.args --save-tests test_file.txt || exit 1;
fi
rm -f modified_tests.args modified_boards.args;
}
if [ ! -z "${BSIM_OUT_PATH}" ]; then
# Build BT Simulator
build_btsim
# Run BLE tests in simulator on the 1st CI instance:
if [ "$MATRIX" = "1" ]; then
run_bsim_bt_tests
fi
else
echo "Skipping BT simulator tests"
fi
# Build Docs on matrix 5 in a pull request
if [ "${MATRIX}" = "${DOC_MATRIX}" -a -n "${PULL_REQUEST}" ]; then
build_docs
./scripts/ci/check-compliance.py --commits ${COMMIT_RANGE} || true;
fi
# In a pull-request see if we have changed any tests or board definitions
if [ -n "${PULL_REQUEST}" ]; then
get_tests_to_run
fi
# Save list of tests to be run
${SANITYCHECK} ${SANITYCHECK_OPTIONS} --save-tests test_file.txt || exit 1
# Run a subset of tests based on matrix size
${SANITYCHECK} ${SANITYCHECK_OPTIONS} --load-tests test_file.txt --subset ${MATRIX}/${MATRIX_BUILDS}
if [ "$?" != 0 ]; then
# let the host settle down
sleep 10
${SANITYCHECK} ${SANITYCHECK_OPTIONS_RETRY} || \
( sleep 10; ${SANITYCHECK} ${SANITYCHECK_OPTIONS_RETRY}; )
fi
# cleanup
rm test_file.txt