256 lines
4.9 KiB
Bash
Executable File
256 lines
4.9 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
|
|
### shfmt -w -s -ci -sr -kp -fn ci.sh
|
|
|
|
#------------------------------------------------------------------------------
|
|
# CI Script
|
|
# Helper script for running CI jobs
|
|
#------------------------------------------------------------------------------
|
|
|
|
# Function to display usage information
|
|
display_usage()
|
|
{
|
|
echo "Usage: $0 -t <type> -a <action> -c <code> -p <path>"
|
|
echo "Options:"
|
|
echo " -t Type (unit-test, scan-build)"
|
|
echo " -a Action (configure, build, install, validate)"
|
|
echo " -c Code (sofia-sip, freeswitch)"
|
|
echo " -p Path to code"
|
|
exit 1
|
|
}
|
|
|
|
# Parse command line arguments
|
|
while getopts "t:p:a:c:h" opt; do
|
|
case $opt in
|
|
t) TYPE="$OPTARG" ;;
|
|
a) ACTION="$OPTARG" ;;
|
|
c) CODE="$OPTARG" ;;
|
|
p) PATH_TO_CODE="$OPTARG" ;;
|
|
h) display_usage ;;
|
|
?) display_usage ;;
|
|
esac
|
|
done
|
|
|
|
# Function to handle sofia-sip configuration
|
|
configure_sofia_sip()
|
|
{
|
|
./autogen.sh && ./configure.gnu || exit 1
|
|
}
|
|
|
|
# Function to handle sofia-sip build
|
|
build_sofia_sip()
|
|
{
|
|
make -j$(nproc) || exit 1
|
|
}
|
|
|
|
# Function to handle sofia-sip installation
|
|
install_sofia_sip()
|
|
{
|
|
make install || exit 1
|
|
}
|
|
|
|
# Function to handle sofia-sip validation
|
|
validate_sofia_sip()
|
|
{
|
|
exit 0
|
|
}
|
|
|
|
# Function to handle freeswitch configuration
|
|
configure_freeswitch()
|
|
{
|
|
local type="$1"
|
|
|
|
./bootstrap.sh -j || exit 1
|
|
|
|
case "$type" in
|
|
"unit-test")
|
|
echo 'codecs/mod_openh264' >> modules.conf
|
|
sed -i \
|
|
-e '/applications\/mod_http_cache/s/^#//g' \
|
|
-e '/formats\/mod_opusfile/s/^#//g' \
|
|
-e '/languages\/mod_lua/s/^#//g' \
|
|
modules.conf
|
|
|
|
export ASAN_OPTIONS=log_path=stdout:disable_coredump=0:unmap_shadow_on_exit=1:fast_unwind_on_malloc=0
|
|
|
|
./configure \
|
|
--enable-address-sanitizer \
|
|
--enable-fake-dlclose ||
|
|
exit 1
|
|
|
|
;;
|
|
"scan-build")
|
|
cp build/modules.conf.most modules.conf
|
|
|
|
# "Enable"/"Uncomment" mods
|
|
echo 'codecs/mod_openh264' >> modules.conf
|
|
sed -i \
|
|
-e '/mod_mariadb/s/^#//g' \
|
|
-e '/mod_v8/s/^#//g' \
|
|
modules.conf
|
|
|
|
# "Disable"/"Comment out" mods
|
|
sed -i \
|
|
-e '/mod_ilbc/s/^/#/g' \
|
|
-e '/mod_mongo/s/^/#/g' \
|
|
-e '/mod_pocketsphinx/s/^/#/g' \
|
|
-e '/mod_siren/s/^/#/g' \
|
|
-e '/mod_avmd/s/^/#/g' \
|
|
-e '/mod_basic/s/^/#/g' \
|
|
-e '/mod_cdr_mongodb/s/^/#/g' \
|
|
-e '/mod_cv/s/^/#/g' \
|
|
-e '/mod_erlang_event/s/^/#/g' \
|
|
-e '/mod_perl/s/^/#/g' \
|
|
-e '/mod_rtmp/s/^/#/g' \
|
|
-e '/mod_unimrcp/s/^/#/g' \
|
|
-e '/mod_xml_rpc/s/^/#/g' \
|
|
modules.conf
|
|
|
|
./configure || exit 1
|
|
|
|
;;
|
|
*)
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Function to handle freeswitch build
|
|
build_freeswitch()
|
|
{
|
|
local type="$1"
|
|
|
|
set -o pipefail
|
|
|
|
case "$type" in
|
|
"unit-test")
|
|
make --no-keep-going -j$(nproc --all) |& tee ./unit-tests-build-result.txt
|
|
build_status=${PIPESTATUS[0]}
|
|
if [[ $build_status != "0" ]]; then
|
|
exit $build_status
|
|
fi
|
|
|
|
;;
|
|
"scan-build")
|
|
if ! command -v scan-build-14 > /dev/null 2>&1; then
|
|
echo "Error: scan-build-14 command not found. Please ensure clang static analyzer is installed." >&2
|
|
exit 1
|
|
fi
|
|
|
|
mkdir -p scan-build
|
|
|
|
scan-build-14 \
|
|
--force-analyze-debug-code \
|
|
--status-bugs \
|
|
-o ./scan-build/ \
|
|
make --no-keep-going -j$(nproc --all) |& tee ./scan-build-result.txt
|
|
build_status=${PIPESTATUS[0]}
|
|
|
|
if ! grep -siq "scan-build: No bugs found" ./scan-build-result.txt; then
|
|
echo "scan-build: bugs found!"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ $build_status != "0" ]]; then
|
|
echo "scan-build: compilation failed!"
|
|
exit $build_status
|
|
fi
|
|
|
|
;;
|
|
*)
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Function to handle freeswitch installation
|
|
install_freeswitch()
|
|
{
|
|
make install || exit 1
|
|
}
|
|
|
|
# Function to handle freeswitch validation
|
|
validate_freeswitch()
|
|
{
|
|
local type="$1"
|
|
|
|
case "$type" in
|
|
"unit-test")
|
|
exit 0
|
|
;;
|
|
"scan-build")
|
|
REPORT_PATH=$(find scan-build* -mindepth 1 -type d)
|
|
if [ -n "$REPORT_PATH" ]; then
|
|
echo "Found analysis report at: $REPORT_PATH"
|
|
|
|
if command -v html2text > /dev/null 2>&1; then
|
|
echo "Report contents:"
|
|
html2text "$REPORT_PATH"/*.html || true
|
|
fi
|
|
|
|
echo "Number of issues found:"
|
|
grep -c "<!--BUGDESC" "$REPORT_PATH"/*.html || true
|
|
|
|
exit $([ -d "$REPORT_PATH" ])
|
|
else
|
|
echo "No analysis report found"
|
|
exit 0
|
|
fi
|
|
|
|
;;
|
|
*)
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Change to the code directory
|
|
if [ -n "$PATH_TO_CODE" ]; then
|
|
cd "$PATH_TO_CODE" || exit 1
|
|
fi
|
|
|
|
# Execute appropriate flow based on code, type, and action
|
|
case "$CODE" in
|
|
"sofia-sip")
|
|
case "$ACTION" in
|
|
"configure")
|
|
configure_sofia_sip "$TYPE"
|
|
;;
|
|
"build")
|
|
build_sofia_sip "$TYPE"
|
|
;;
|
|
"install")
|
|
install_sofia_sip "$TYPE"
|
|
;;
|
|
"validate")
|
|
validate_sofia_sip "$TYPE"
|
|
;;
|
|
*)
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
"freeswitch")
|
|
case "$ACTION" in
|
|
"configure")
|
|
configure_freeswitch "$TYPE"
|
|
;;
|
|
"build")
|
|
build_freeswitch "$TYPE"
|
|
;;
|
|
"install")
|
|
install_freeswitch "$TYPE"
|
|
;;
|
|
"validate")
|
|
validate_freeswitch "$TYPE"
|
|
;;
|
|
*)
|
|
exit 1
|
|
;;
|
|
esac
|
|
;;
|
|
*)
|
|
exit 1
|
|
;;
|
|
esac
|