<p>George Joseph <strong>merged</strong> this change.</p><p><a href="https://gerrit.asterisk.org/c/asterisk/+/11622">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Kevin Harwell: Looks good to me, but someone else must approve
  Joshua Colp: Looks good to me, but someone else must approve
  George Joseph: Looks good to me, approved; Approved for Submit

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">CI:  Don't enable non-core modules in Certified branches<br><br>We don't support non-core modules for Certified releases but we<br>were enabling them for CI builds which was causing lots of test<br>failures.  Now we don't.<br><br>NOTE:  This change required that the rest of the CI shell scripts<br>and jenkinsfiles be updates to the same level as certified/16.3.<br><br>Change-Id: I0b3254c08a2479f3d39151690350cce5ce5ad766<br>---<br>M tests/CI/buildAsterisk.sh<br>M tests/CI/gateTestGroups.json<br>M tests/CI/gates.jenkinsfile<br>M tests/CI/installAsterisk.sh<br>M tests/CI/periodic-dailyTestGroups.json<br>M tests/CI/periodics-daily.jenkinsfile<br>M tests/CI/ref_debug.jenkinsfile<br>M tests/CI/runTestsuite.sh<br>M tests/CI/runUnittests.sh<br>M tests/CI/setupRealtime.sh<br>M tests/CI/teardownRealtime.sh<br>M tests/CI/unittests.jenkinsfile<br>12 files changed, 578 insertions(+), 216 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/tests/CI/buildAsterisk.sh b/tests/CI/buildAsterisk.sh</span><br><span>index 9840d85..2e94791 100755</span><br><span>--- a/tests/CI/buildAsterisk.sh</span><br><span>+++ b/tests/CI/buildAsterisk.sh</span><br><span>@@ -1,9 +1,21 @@</span><br><span> #!/usr/bin/env bash</span><br><span> </span><br><span> CIDIR=$(dirname $(readlink -fn $0))</span><br><span style="color: hsl(120, 100%, 40%);">+COVERAGE=0</span><br><span> REF_DEBUG=0</span><br><span style="color: hsl(120, 100%, 40%);">+DISABLE_BINARY_MODULES=0</span><br><span style="color: hsl(120, 100%, 40%);">+NO_CONFIGURE=0</span><br><span style="color: hsl(120, 100%, 40%);">+NO_MENUSELECT=0</span><br><span style="color: hsl(120, 100%, 40%);">+NO_MAKE=0</span><br><span style="color: hsl(120, 100%, 40%);">+NO_ALEMBIC=0</span><br><span> source $CIDIR/ci.functions</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+set -e</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if [ -z $BRANCH_NAME ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+    BRANCH_NAME=$(git config -f .gitreview --get gerrit.defaultbranch)</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> gen_cats() {</span><br><span>     set +x</span><br><span>       action=$1</span><br><span>@@ -26,10 +38,27 @@</span><br><span>      done</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-[ x"$OUTPUT_DIR" != x ] && mkdir -p "$OUTPUT_DIR" 2&> /dev/null</span><br><span style="color: hsl(120, 100%, 40%);">+run_alembic() {</span><br><span style="color: hsl(120, 100%, 40%);">+      pushd contrib/ast-db-manage >/dev/null</span><br><span style="color: hsl(120, 100%, 40%);">+     runner alembic $@</span><br><span style="color: hsl(120, 100%, 40%);">+     RC=$?</span><br><span style="color: hsl(120, 100%, 40%);">+ popd > /dev/null</span><br><span style="color: hsl(120, 100%, 40%);">+   return $RC</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+[ x"$OUTPUT_DIR" != x ] && mkdir -p "$OUTPUT_DIR" 2> /dev/null</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if [ -z $TESTED_ONLY ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+        # Skip building untested modules by default if coverage is enabled.</span><br><span style="color: hsl(120, 100%, 40%);">+   TESTED_ONLY=$COVERAGE</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if [ -z $LCOV_DIR ]; then</span><br><span style="color: hsl(120, 100%, 40%);">+        LCOV_DIR="${OUTPUT_DIR:+${OUTPUT_DIR}/}lcov"</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span> </span><br><span> if [ x"$CACHE_DIR" != x ] ; then</span><br><span style="color: hsl(0, 100%, 40%);">-    mkdir -p "$CACHE_DIR/sounds $CACHE_DIR/externals" 2&> /dev/null</span><br><span style="color: hsl(120, 100%, 40%);">+      mkdir -p $CACHE_DIR/sounds $CACHE_DIR/externals 2> /dev/null</span><br><span> fi</span><br><span> </span><br><span> if [ ${CCACHE_DISABLE:-0} -ne 1 ] ; then</span><br><span>@@ -58,76 +87,134 @@</span><br><span> runner ulimit -a</span><br><span> </span><br><span> MAKE=`which make`</span><br><span style="color: hsl(120, 100%, 40%);">+PKGCONFIG=`which pkg-config`</span><br><span> [ -d /usr/lib64 ] && _libdir=/usr/lib64</span><br><span> </span><br><span> common_config_args="--prefix=/usr ${_libdir:+--libdir=${_libdir}} --sysconfdir=/etc --with-pjproject-bundled"</span><br><span style="color: hsl(120, 100%, 40%);">+$PKGCONFIG 'jansson >= 2.11' || common_config_args+=" --with-jansson-bundled"</span><br><span> common_config_args+=" ${CACHE_DIR:+--with-sounds-cache=${CACHE_DIR}/sounds --with-externals-cache=${CACHE_DIR}/externals}"</span><br><span> common_config_args+=" --enable-dev-mode"</span><br><span style="color: hsl(120, 100%, 40%);">+if [ $COVERAGE -eq 1 ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+    common_config_args+=" --enable-coverage"</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+if [ "$BRANCH_NAME" == "master" -o $DISABLE_BINARY_MODULES -eq 1 ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+ common_config_args+=" --disable-binary-modules"</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> export WGET_EXTRA_ARGS="--quiet"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-runner ./configure ${common_config_args} > ${OUTPUT_DIR:+${OUTPUT_DIR}/}configure.txt</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-runner ${MAKE} menuselect.makeopts</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-runner menuselect/menuselect `gen_mods enable DONT_OPTIMIZE BETTER_BACKTRACES MALLOC_DEBUG DO_CRASH TEST_FRAMEWORK` menuselect.makeopts</span><br><span style="color: hsl(0, 100%, 40%);">-runner menuselect/menuselect `gen_mods disable COMPILE_DOUBLE BUILD_NATIVE` menuselect.makeopts</span><br><span style="color: hsl(0, 100%, 40%);">-if [ $REF_DEBUG -eq 1 ] ; then</span><br><span style="color: hsl(0, 100%, 40%);">- runner menuselect/menuselect --enable REF_DEBUG menuselect.makeopts</span><br><span style="color: hsl(120, 100%, 40%);">+if [ $NO_CONFIGURE -eq 0 ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+        runner ./configure ${common_config_args} > ${OUTPUT_DIR:+${OUTPUT_DIR}/}configure.txt</span><br><span> fi</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-cat_enables="MENUSELECT_BRIDGES MENUSELECT_CEL MENUSELECT_CDR"</span><br><span style="color: hsl(0, 100%, 40%);">-cat_enables+=" MENUSELECT_CHANNELS MENUSELECT_CODECS MENUSELECT_FORMATS MENUSELECT_FUNCS"</span><br><span style="color: hsl(0, 100%, 40%);">-cat_enables+=" MENUSELECT_PBX MENUSELECT_RES MENUSELECT_UTILS MENUSELECT_TESTS"</span><br><span style="color: hsl(0, 100%, 40%);">-runner menuselect/menuselect `gen_cats enable $cat_enables` menuselect.makeopts</span><br><span style="color: hsl(120, 100%, 40%);">+if [ $NO_MENUSELECT -eq 0 ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+     runner ${MAKE} menuselect.makeopts</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-mod_disables="res_digium_phone chan_vpb"</span><br><span style="color: hsl(0, 100%, 40%);">-[ "$BRANCH_NAME" == "master" ] && mod_disables+=" codec_opus codec_silk codec_g729a codec_siren7 codec_siren14"</span><br><span style="color: hsl(0, 100%, 40%);">-runner menuselect/menuselect `gen_mods disable $mod_disables` menuselect.makeopts</span><br><span style="color: hsl(120, 100%, 40%);">+        runner menuselect/menuselect `gen_mods enable DONT_OPTIMIZE BETTER_BACKTRACES MALLOC_DEBUG DO_CRASH TEST_FRAMEWORK` menuselect.makeopts</span><br><span style="color: hsl(120, 100%, 40%);">+       runner menuselect/menuselect `gen_mods disable COMPILE_DOUBLE BUILD_NATIVE` menuselect.makeopts</span><br><span style="color: hsl(120, 100%, 40%);">+       if [ $REF_DEBUG -eq 1 ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+                runner menuselect/menuselect --enable REF_DEBUG menuselect.makeopts</span><br><span style="color: hsl(120, 100%, 40%);">+   fi</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-mod_enables="app_voicemail app_directory FILE_STORAGE"</span><br><span style="color: hsl(0, 100%, 40%);">-mod_enables+=" res_mwi_external res_ari_mailboxes res_mwi_external_ami res_stasis_mailbox"</span><br><span style="color: hsl(0, 100%, 40%);">-mod_enables+=" CORE-SOUNDS-EN-GSM MOH-OPSOUND-GSM EXTRA-SOUNDS-EN-GSM"</span><br><span style="color: hsl(0, 100%, 40%);">-runner menuselect/menuselect `gen_mods enable $mod_enables` menuselect.makeopts</span><br><span style="color: hsl(120, 100%, 40%);">+     cat_enables="MENUSELECT_TESTS"</span><br><span style="color: hsl(120, 100%, 40%);">+      mod_disabled=""</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-runner ${MAKE} -j8 || runner ${MAKE} -j1 NOISY_BUILD=yes</span><br><span style="color: hsl(120, 100%, 40%);">+ if [[ ! "${BRANCH_NAME}" =~ ^certified ]] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+            cat_enables+=" MENUSELECT_BRIDGES MENUSELECT_CEL MENUSELECT_CDR"</span><br><span style="color: hsl(120, 100%, 40%);">+            cat_enables+=" MENUSELECT_CHANNELS MENUSELECT_CODECS MENUSELECT_FORMATS MENUSELECT_FUNCS"</span><br><span style="color: hsl(120, 100%, 40%);">+           cat_enables+=" MENUSELECT_PBX MENUSELECT_RES MENUSELECT_UTILS"</span><br><span style="color: hsl(120, 100%, 40%);">+      else</span><br><span style="color: hsl(120, 100%, 40%);">+          mod_disables+=" test_utils"</span><br><span style="color: hsl(120, 100%, 40%);">+ fi</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-ALEMBIC=$(which alembic 2>/dev/null || : )</span><br><span style="color: hsl(0, 100%, 40%);">-if [ x"$ALEMBIC" = x ] ; then</span><br><span style="color: hsl(0, 100%, 40%);">-      echo "Alembic not installed"</span><br><span style="color: hsl(0, 100%, 40%);">-  exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+        runner menuselect/menuselect `gen_cats enable $cat_enables` menuselect.makeopts</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     mod_disables+=" res_digium_phone chan_vpb"</span><br><span style="color: hsl(120, 100%, 40%);">+  if [ $TESTED_ONLY -eq 1 ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+              # These modules are not tested at all.  They are loaded but nothing is ever done</span><br><span style="color: hsl(120, 100%, 40%);">+              # with them, no testsuite tests depend on them.</span><br><span style="color: hsl(120, 100%, 40%);">+               mod_disables+=" app_adsiprog app_alarmreceiver app_celgenuserevent app_db app_dictate"</span><br><span style="color: hsl(120, 100%, 40%);">+              mod_disables+=" app_dumpchan app_externalivr app_festival app_getcpeid app_ices app_image"</span><br><span style="color: hsl(120, 100%, 40%);">+          mod_disables+=" app_jack app_milliwatt app_minivm app_morsecode app_mp3 app_nbscat app_privacy"</span><br><span style="color: hsl(120, 100%, 40%);">+             mod_disables+=" app_readexten app_sms app_speech_utils app_test app_url app_waitforring"</span><br><span style="color: hsl(120, 100%, 40%);">+            mod_disables+=" app_waitforsilence app_waituntil app_zapateller"</span><br><span style="color: hsl(120, 100%, 40%);">+            mod_disables+=" cdr_adaptive_odbc cdr_custom cdr_manager cdr_odbc cdr_pgsql cdr_radius"</span><br><span style="color: hsl(120, 100%, 40%);">+             mod_disables+=" cdr_syslog cdr_tds"</span><br><span style="color: hsl(120, 100%, 40%);">+         mod_disables+=" cel_odbc cel_pgsql cel_radius cel_sqlite3_custom cel_tds"</span><br><span style="color: hsl(120, 100%, 40%);">+           mod_disables+=" chan_alsa chan_console chan_mgcp chan_motif chan_oss chan_rtp chan_skinny chan_unistim"</span><br><span style="color: hsl(120, 100%, 40%);">+             mod_disables+=" func_frame_trace func_pitchshift func_speex func_volume func_dialgroup"</span><br><span style="color: hsl(120, 100%, 40%);">+             mod_disables+=" func_periodic_hook func_sprintf func_enum func_extstate func_sysinfo func_iconv"</span><br><span style="color: hsl(120, 100%, 40%);">+            mod_disables+=" func_callcompletion func_version func_rand func_sha1 func_module func_md5"</span><br><span style="color: hsl(120, 100%, 40%);">+          mod_disables+=" pbx_dundi pbx_loopback"</span><br><span style="color: hsl(120, 100%, 40%);">+             mod_disables+=" res_ael_share res_calendar res_config_ldap res_config_pgsql res_corosync"</span><br><span style="color: hsl(120, 100%, 40%);">+           mod_disables+=" res_http_post res_pktccops res_rtp_multicast res_snmp res_xmpp"</span><br><span style="color: hsl(120, 100%, 40%);">+     fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  runner menuselect/menuselect `gen_mods disable $mod_disables` menuselect.makeopts</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   mod_enables="app_voicemail app_directory FILE_STORAGE"</span><br><span style="color: hsl(120, 100%, 40%);">+      mod_enables+=" res_mwi_external res_ari_mailboxes res_mwi_external_ami res_stasis_mailbox"</span><br><span style="color: hsl(120, 100%, 40%);">+  mod_enables+=" CORE-SOUNDS-EN-GSM MOH-OPSOUND-GSM EXTRA-SOUNDS-EN-GSM"</span><br><span style="color: hsl(120, 100%, 40%);">+      runner menuselect/menuselect `gen_mods enable $mod_enables` menuselect.makeopts</span><br><span> fi</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-cd contrib/ast-db-manage</span><br><span style="color: hsl(0, 100%, 40%);">-find -name *.pyc -delete</span><br><span style="color: hsl(0, 100%, 40%);">-out=$(alembic -c config.ini.sample branches)</span><br><span style="color: hsl(0, 100%, 40%);">-if [ "x$out" != "x" ] ; then</span><br><span style="color: hsl(0, 100%, 40%);">-   >&2 echo "Alembic branches were found for config"</span><br><span style="color: hsl(0, 100%, 40%);">-      >&2 echo $out</span><br><span style="color: hsl(0, 100%, 40%);">-    exit 1</span><br><span style="color: hsl(0, 100%, 40%);">-else</span><br><span style="color: hsl(0, 100%, 40%);">-      >&2 echo "Alembic for 'config' OK"</span><br><span style="color: hsl(120, 100%, 40%);">+if [ $NO_MAKE -eq 0 ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+     runner ${MAKE} -j8 || runner ${MAKE} -j1 NOISY_BUILD=yes</span><br><span> fi</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-out=$(alembic -c cdr.ini.sample branches)</span><br><span style="color: hsl(0, 100%, 40%);">-if [ "x$out" != "x" ] ; then</span><br><span style="color: hsl(0, 100%, 40%);">-     >&2 echo "Alembic branches were found for cdr"</span><br><span style="color: hsl(0, 100%, 40%);">- >&2 echo $out</span><br><span style="color: hsl(0, 100%, 40%);">-    exit 1</span><br><span style="color: hsl(0, 100%, 40%);">-else</span><br><span style="color: hsl(0, 100%, 40%);">-      >&2 echo "Alembic for 'cdr' OK"</span><br><span style="color: hsl(120, 100%, 40%);">+runner rm -f ${LCOV_DIR}/*.info</span><br><span style="color: hsl(120, 100%, 40%);">+if [ $COVERAGE -eq 1 ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+      runner mkdir -p ${LCOV_DIR}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ # Zero counter data</span><br><span style="color: hsl(120, 100%, 40%);">+   runner lcov --quiet --directory . --zerocounters</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    # Branch coverage is not supported by --initial.  Disable to suppresses a notice</span><br><span style="color: hsl(120, 100%, 40%);">+      # printed if it was enabled in lcovrc.</span><br><span style="color: hsl(120, 100%, 40%);">+        # This initial capture ensures any module which was built but never loaded is</span><br><span style="color: hsl(120, 100%, 40%);">+ # reported with 0% coverage for all sources.</span><br><span style="color: hsl(120, 100%, 40%);">+  runner lcov --quiet --directory . --no-external --capture --initial --rc lcov_branch_coverage=0 \</span><br><span style="color: hsl(120, 100%, 40%);">+             --output-file ${LCOV_DIR}/initial.info</span><br><span> fi</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-out=$(alembic -c voicemail.ini.sample branches)</span><br><span style="color: hsl(0, 100%, 40%);">-if [ "x$out" != "x" ] ; then</span><br><span style="color: hsl(0, 100%, 40%);">- >&2 echo "Alembic branches were found for voicemail"</span><br><span style="color: hsl(0, 100%, 40%);">-   >&2 echo $out</span><br><span style="color: hsl(0, 100%, 40%);">-    exit 1</span><br><span style="color: hsl(0, 100%, 40%);">-else</span><br><span style="color: hsl(0, 100%, 40%);">-      >&2 echo "Alembic for 'voicemail' OK"</span><br><span style="color: hsl(120, 100%, 40%);">+if [ $NO_ALEMBIC -eq 0 ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+       ALEMBIC=$(which alembic 2>/dev/null || : )</span><br><span style="color: hsl(120, 100%, 40%);">+ if [ x"$ALEMBIC" = x ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+               >&2 echo "Alembic not installed"</span><br><span style="color: hsl(120, 100%, 40%);">+             exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+        fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  find contrib/ast-db-manage -name *.pyc -delete</span><br><span style="color: hsl(120, 100%, 40%);">+        out=$(run_alembic -c config.ini.sample branches)</span><br><span style="color: hsl(120, 100%, 40%);">+      if [ "x$out" != "x" ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+              >&2 echo "Alembic branches were found for config"</span><br><span style="color: hsl(120, 100%, 40%);">+            >&2 echo $out</span><br><span style="color: hsl(120, 100%, 40%);">+          exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+        fi</span><br><span style="color: hsl(120, 100%, 40%);">+    run_alembic -c config.ini.sample upgrade head --sql > "${OUTPUT_DIR:+${OUTPUT_DIR}/}alembic-config.sql" || exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+        echo "Alembic for 'config' OK"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    out=$(run_alembic -c cdr.ini.sample branches)</span><br><span style="color: hsl(120, 100%, 40%);">+ if [ "x$out" != "x" ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+              >&2 echo "Alembic branches were found for cdr"</span><br><span style="color: hsl(120, 100%, 40%);">+               >&2 echo $out</span><br><span style="color: hsl(120, 100%, 40%);">+          exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+        fi</span><br><span style="color: hsl(120, 100%, 40%);">+    run_alembic -c cdr.ini.sample upgrade head --sql > "${OUTPUT_DIR:+${OUTPUT_DIR}/}alembic-cdr.sql" || exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+      echo "Alembic for 'cdr' OK"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       out=$(run_alembic -c voicemail.ini.sample branches)</span><br><span style="color: hsl(120, 100%, 40%);">+   if [ "x$out" != "x" ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+              >&2 echo "Alembic branches were found for voicemail"</span><br><span style="color: hsl(120, 100%, 40%);">+         >&2 echo $out</span><br><span style="color: hsl(120, 100%, 40%);">+          exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+        fi</span><br><span style="color: hsl(120, 100%, 40%);">+    run_alembic -c voicemail.ini.sample upgrade head --sql > "${OUTPUT_DIR:+${OUTPUT_DIR}/}alembic-voicemail.sql" || exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+  echo "Alembic for 'voicemail' OK"</span><br><span> fi</span><br><span> </span><br><span> if [ -f "doc/core-en_US.xml" ] ; then</span><br><span style="color: hsl(0, 100%, 40%);">-        ${MAKE} validate-docs || ${MAKE} NOISY_BUILD=yes validate-docs</span><br><span style="color: hsl(120, 100%, 40%);">+        runner ${MAKE} validate-docs || ${MAKE} NOISY_BUILD=yes validate-docs</span><br><span> fi</span><br><span> </span><br><span> </span><br><span>diff --git a/tests/CI/gateTestGroups.json b/tests/CI/gateTestGroups.json</span><br><span>index 7c8b917..d048896 100644</span><br><span>--- a/tests/CI/gateTestGroups.json</span><br><span>+++ b/tests/CI/gateTestGroups.json</span><br><span>@@ -2,46 +2,55 @@</span><br><span>         {</span><br><span>            "name": "ari1",</span><br><span>          "dir": "tests/CI/output/ari1",</span><br><span style="color: hsl(120, 100%, 40%);">+            "runTestsuiteOptions": "--test-timeout=180",</span><br><span>             "testcmd": "--test-regex=tests/rest_api/[Ca-d]"</span><br><span>  },</span><br><span>   {</span><br><span>            "name": "ari2",</span><br><span>          "dir": "tests/CI/output/ari2",</span><br><span style="color: hsl(120, 100%, 40%);">+            "runTestsuiteOptions": "--test-timeout=180",</span><br><span>             "testcmd": "--test-regex=tests/rest_api/[e-z]"</span><br><span>   },</span><br><span>   {</span><br><span>            "name": "pjs1",</span><br><span>          "dir": "tests/CI/output/pjsip1",</span><br><span style="color: hsl(120, 100%, 40%);">+          "runTestsuiteOptions": "--test-timeout=180",</span><br><span>             "testcmd": "--test-regex=tests/channels/pjsip/[a-f]"</span><br><span>     },</span><br><span>   {</span><br><span>            "name": "pjs2",</span><br><span>          "dir": "tests/CI/output/pjsip2",</span><br><span style="color: hsl(120, 100%, 40%);">+          "runTestsuiteOptions": "--test-timeout=180",</span><br><span>             "testcmd": "--test-regex=tests/channels/pjsip/[g-r]"</span><br><span>     },</span><br><span>   {</span><br><span>            "name": "pjs3",</span><br><span>          "dir": "tests/CI/output/pjsip3",</span><br><span style="color: hsl(120, 100%, 40%);">+          "runTestsuiteOptions": "--test-timeout=180",</span><br><span>             "testcmd": "--test-regex=tests/channels/pjsip/[s-z]"</span><br><span>     },</span><br><span>   {</span><br><span>            "name": "sip1",</span><br><span>          "dir": "tests/CI/output/sip1",</span><br><span style="color: hsl(120, 100%, 40%);">+            "runTestsuiteOptions": "--test-timeout=240",</span><br><span>             "testcmd": "--test-regex=tests/channels/SIP/[Sa-r]"</span><br><span>      },</span><br><span>   {</span><br><span>            "name": "sip2",</span><br><span>          "dir": "tests/CI/output/sip2",</span><br><span style="color: hsl(120, 100%, 40%);">+            "runTestsuiteOptions": "--test-timeout=240",</span><br><span>             "testcmd": "--test-regex=tests/channels/SIP/[s-z]"</span><br><span>       },</span><br><span>   {</span><br><span>            "name": "iax ",</span><br><span>          "dir": "tests/CI/output/iax2_local",</span><br><span style="color: hsl(120, 100%, 40%);">+              "runTestsuiteOptions": "--test-timeout=180",</span><br><span>             "testcmd": " -t tests/channels/iax2 -t tests/channels/local"</span><br><span>     },</span><br><span>   {</span><br><span>            "name": "mwi ",</span><br><span>          "dir": "tests/CI/output/extmwi",</span><br><span style="color: hsl(120, 100%, 40%);">+          "runTestsuiteOptions": "--test-timeout=180",</span><br><span>             "testcmd": "--test-regex=tests/channels/pjsip/.*mwi"</span><br><span>     }</span><br><span> ]</span><br><span>diff --git a/tests/CI/gates.jenkinsfile b/tests/CI/gates.jenkinsfile</span><br><span>index 9dc7308..bc23781 100644</span><br><span>--- a/tests/CI/gates.jenkinsfile</span><br><span>+++ b/tests/CI/gates.jenkinsfile</span><br><span>@@ -10,7 +10,19 @@</span><br><span>  * we need to dynamically determine which docker image we're going to use and</span><br><span>  * you can't do that in a delcarative pipeline.</span><br><span>  */</span><br><span style="color: hsl(120, 100%, 40%);">+def timeoutTime = 60</span><br><span style="color: hsl(120, 100%, 40%);">+def timeoutUnits = 'MINUTES'</span><br><span style="color: hsl(120, 100%, 40%);">+if (env.TIMEOUT_GATES) {</span><br><span style="color: hsl(120, 100%, 40%);">+     def _timeout = env.TIMEOUT_GATES.split()</span><br><span style="color: hsl(120, 100%, 40%);">+      timeoutTime = _timeout[0].toInteger()</span><br><span style="color: hsl(120, 100%, 40%);">+ timeoutUnits = _timeout[1]</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> pipeline {</span><br><span style="color: hsl(120, 100%, 40%);">+ options {</span><br><span style="color: hsl(120, 100%, 40%);">+             timestamps()</span><br><span style="color: hsl(120, 100%, 40%);">+          timeout(time: timeoutTime, unit: timeoutUnits)</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span>    triggers {</span><br><span>           /*</span><br><span>            * This trigger will match either the "asterisk" or "Security-asterisk"</span><br><span>@@ -62,10 +74,12 @@</span><br><span>                    steps {</span><br><span>                              /* Here's where we switch to scripted pipeline */</span><br><span>                                script {</span><br><span style="color: hsl(120, 100%, 40%);">+                                      manager.build.displayName = "${env.GERRIT_CHANGE_NUMBER}"</span><br><span style="color: hsl(120, 100%, 40%);">+                                   manager.createSummary("/plugin/workflow-job/images/48x48/pipelinejob.png").appendText("Docker Host: ${NODE_NAME}", false)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                                      stage ("Checkout") {</span><br><span>                                               sh "sudo chown -R jenkins:users ."  </span><br><span style="color: hsl(0, 100%, 40%);">-                                          env.GERRIT_PROJECT_URL = env.GERRIT_CHANGE_URL.replaceAll(/\/[0-9]+$/, "/${env.GERRIT_PROJECT}")</span><br><span style="color: hsl(0, 100%, 40%);">-                                              sh "printenv | sort"</span><br><span style="color: hsl(120, 100%, 40%);">+                                                env.GERRIT_PROJECT_URL = env.GIT_URL.replaceAll(/[^\/]+$/, env.GERRIT_PROJECT)</span><br><span>                                       </span><br><span>                                             /*</span><br><span>                                            * Jenkins has already automatically checked out the base branch</span><br><span>@@ -76,33 +90,46 @@</span><br><span>                                                *</span><br><span>                                            * The Gerrit Trigger provides all the URLs and refspecs to</span><br><span>                                           * check out the change.</span><br><span style="color: hsl(120, 100%, 40%);">+                                               *</span><br><span style="color: hsl(120, 100%, 40%);">+                                             * We need to retrieve the jenkins2 gerrit https credentials</span><br><span style="color: hsl(120, 100%, 40%);">+                                           * in case this review is in a restricted project.</span><br><span>                                            */</span><br><span style="color: hsl(0, 100%, 40%);">-                                             checkout scm: [$class: 'GitSCM',</span><br><span style="color: hsl(0, 100%, 40%);">-                                                        branches: [[name: env.GERRIT_BRANCH ]],</span><br><span style="color: hsl(0, 100%, 40%);">-                                                 extensions: [</span><br><span style="color: hsl(0, 100%, 40%);">-                                                           [$class: 'ScmName', name: 'gerrit-public'],</span><br><span style="color: hsl(0, 100%, 40%);">-                                                             [$class: 'CleanBeforeCheckout'],</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                [$class: 'PreBuildMerge', options: [</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                    mergeRemote: 'gerrit-public',</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                   fastForwardMode: 'NO_FF',</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                       mergeStrategy: 'RECURSIVE',</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                     mergeTarget: env.GERRIT_BRANCH]],</span><br><span style="color: hsl(0, 100%, 40%);">-                                                               [$class: 'CloneOption',</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                 honorRefspec: true,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                     noTags: true,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                   depth: 10,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                      shallow: true</span><br><span style="color: hsl(0, 100%, 40%);">-                                                           ],</span><br><span style="color: hsl(0, 100%, 40%);">-                                                              [$class: 'PruneStaleBranch'],</span><br><span style="color: hsl(0, 100%, 40%);">-                                                           [$class: 'BuildChooserSetting',</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                 buildChooser: [$class: 'GerritTriggerBuildChooser']</span><br><span style="color: hsl(0, 100%, 40%);">-                                                             ]</span><br><span style="color: hsl(0, 100%, 40%);">-                                                       ],</span><br><span style="color: hsl(0, 100%, 40%);">-                                                      userRemoteConfigs: [</span><br><span style="color: hsl(0, 100%, 40%);">-                                                            [name: env.GERRIT_NAME, refspec: env.GERRIT_REFSPEC, url: env.GERRIT_PROJECT_URL ]</span><br><span style="color: hsl(0, 100%, 40%);">-                                                      ]</span><br><span style="color: hsl(0, 100%, 40%);">-                                               ]</span><br><span style="color: hsl(120, 100%, 40%);">+                                             withCredentials([usernamePassword(credentialsId: "${JENKINS_GERRIT_CREDS}",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                 passwordVariable: 'GERRIT_USER_PW', usernameVariable: 'GERRIT_USER_NAME')]) {</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+                                                     sh "printenv | sort"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      checkout scm: [$class: 'GitSCM',</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              branches: [[name: env.GERRIT_BRANCH ]],</span><br><span style="color: hsl(120, 100%, 40%);">+                                                               extensions: [</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                 [$class: 'ScmName', name: env.GERRIT_NAME],</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   [$class: 'CleanBeforeCheckout'],</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                      [$class: 'PreBuildMerge', options: [</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                          mergeRemote: env.GERRIT_NAME,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                         fastForwardMode: 'NO_FF',</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                             mergeStrategy: 'RECURSIVE',</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                           mergeTarget: env.GERRIT_BRANCH]],</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                     [$class: 'CloneOption',</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                               honorRefspec: true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                           noTags: true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                         depth: 10,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                            shallow: true</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                 ],</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                    [$class: 'PruneStaleBranch'],</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                 [$class: 'BuildChooserSetting',</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                               buildChooser: [$class: 'GerritTriggerBuildChooser']</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   ]</span><br><span style="color: hsl(120, 100%, 40%);">+                                                             ],</span><br><span style="color: hsl(120, 100%, 40%);">+                                                            userRemoteConfigs: [</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                  [</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                     credentialsId: env.JENKINS_GERRIT_CREDS,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                      name: env.GERRIT_NAME,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                        refspec: env.GERRIT_REFSPEC,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                  url: env.GERRIT_PROJECT_URL.replaceAll("http(s)?://", "http\$1://${GERRIT_USER_NAME}@")</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   ]</span><br><span style="color: hsl(120, 100%, 40%);">+                                                             ]</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     ]</span><br><span style="color: hsl(120, 100%, 40%);">+                                             }</span><br><span>                                            sh "sudo tests/CI/setupJenkinsEnvironment.sh"</span><br><span>                                      }</span><br><span> </span><br><span>@@ -110,11 +137,14 @@</span><br><span>                                        def r = currentBuild.startTimeInMillis % images.length</span><br><span>                                       def ri = images[(int)r]</span><br><span>                                      def randomImage = env.DOCKER_REGISTRY + "/" + ri</span><br><span style="color: hsl(0, 100%, 40%);">-                                      def dockerOptions = "--ulimit core=0 --ulimit nofile=10240 " +</span><br><span style="color: hsl(0, 100%, 40%);">-                                                " -v /srv/jenkins:/srv/jenkins:rw -v /srv/cache:/srv/cache:rw " +</span><br><span style="color: hsl(120, 100%, 40%);">+                                   /* FYI... Jenkins takes care of mouting the workspace for the container */</span><br><span style="color: hsl(120, 100%, 40%);">+                                    def dockerOptions = "--privileged --ulimit core=0 --ulimit nofile=10240 " +</span><br><span style="color: hsl(120, 100%, 40%);">+                                         " --tmpfs /tmp:exec,size=1G -v /srv/jenkins:/srv/jenkins:rw -v /srv/cache:/srv/cache:rw " +</span><br><span>                                                " --entrypoint=''"</span><br><span>                                         def bt = env.BUILD_TAG.replaceAll(/[^a-zA-Z0-9_.-]/, '-')</span><br><span>                                    def outputdir = "tests/CI/output/Testsuite"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                                       manager.createSummary("/plugin/workflow-job/images/48x48/pipelinejob.png").appendText("Docker Image: ${randomImage}", false)</span><br><span>                                     def img = docker.image(randomImage)</span><br><span>                                  img.pull()</span><br><span> </span><br><span>@@ -122,7 +152,7 @@</span><br><span>                                                 img.inside(dockerOptions + " --name ${bt}-build") {</span><br><span>                                                        echo 'Building..'</span><br><span>                                                    env.CCACHE_DIR = "/srv/cache/ccache"</span><br><span style="color: hsl(0, 100%, 40%);">-                                                  sh "./tests/CI/buildAsterisk.sh --output-dir=${outputdir} --cache-dir=/srv/cache"</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   sh "./tests/CI/buildAsterisk.sh --branch-name=${BRANCH_NAME} --output-dir=${outputdir} --cache-dir=/srv/cache"</span><br><span> </span><br><span>                                                         archiveArtifacts allowEmptyArchive: true, defaultExcludes: false, fingerprint: false,</span><br><span>                                                                artifacts: "${outputdir}/*"</span><br><span>@@ -148,13 +178,15 @@</span><br><span>                                                                img.inside("${dockerOptions} --name ${bt}-${groupName}") {</span><br><span> </span><br><span>                                                                     lock("${JOB_NAME}.${NODE_NAME}.installer") {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                          sh 'sudo ./tests/CI/installAsterisk.sh  --user-group=jenkins:users'</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                           sh "sudo ./tests/CI/installAsterisk.sh --uninstall-all --branch-name=${BRANCH_NAME} --user-group=jenkins:users"</span><br><span>                                                                    }</span><br><span> </span><br><span>                                                                        sh "sudo rm -rf ${groupDir} || : "</span><br><span>                                                                         </span><br><span style="color: hsl(0, 100%, 40%);">-                                                                        checkout scm: [$class: 'GitSCM',</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                branches: [[name: "${BRANCH_NAME}"]],</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                       withCredentials([usernamePassword(credentialsId: "${JENKINS_GERRIT_CREDS}",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                         passwordVariable: 'GERRIT_USER_PW', usernameVariable: 'GERRIT_USER_NAME')]) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                         checkout scm: [$class: 'GitSCM',</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                                      branches: [[name: "${BRANCH_NAME}"]],</span><br><span>                                                                                      extensions: [</span><br><span>                                                                                                [$class: 'RelativeTargetDirectory', relativeTargetDir: groupDir],</span><br><span>                                                                                            [$class: 'CloneOption',</span><br><span>@@ -164,10 +196,17 @@</span><br><span>                                                                                                      shallow: true</span><br><span>                                                                                                ],</span><br><span>                                                                                   ],</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                                      userRemoteConfigs: [[name: env.GERRIT_NAME, url: testsuiteUrl]]</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                                       userRemoteConfigs: [</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                                          [</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                                             credentialsId: env.JENKINS_GERRIT_CREDS,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                                              name: env.GERRIT_NAME,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                                                url: testsuiteUrl.replaceAll("http(s)?://", "http\$1://${GERRIT_USER_NAME}@")</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                                             ]</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                                     ]</span><br><span>                                                                            ]</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                                                                   sh "sudo tests/CI/runTestsuite.sh --testsuite-dir='${groupDir}' --test-command='${groupTestcmd}'"</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   sh "sudo tests/CI/runTestsuite.sh --testsuite-dir='${groupDir}' --testsuite-command='${groupTestcmd}'"</span><br><span> </span><br><span>                                                                         archiveArtifacts allowEmptyArchive: true, defaultExcludes: false, fingerprint: true,</span><br><span>                                                                                 artifacts: "${groupDir}/asterisk-test-suite-report.xml, ${groupDir}/logs/**, ${groupDir}/core*.txt"</span><br><span>@@ -189,8 +228,8 @@</span><br><span>  }</span><br><span>    post {</span><br><span>               cleanup {</span><br><span style="color: hsl(0, 100%, 40%);">-                       sh "sudo make distclean 2&>/dev/null || : "</span><br><span style="color: hsl(0, 100%, 40%);">-                    sh "sudo rm -rf tests/CI/output  2&>/dev/null || : "</span><br><span style="color: hsl(120, 100%, 40%);">+                 sh "sudo make distclean >/dev/null 2>&1 || : "</span><br><span style="color: hsl(120, 100%, 40%);">+                    sh "sudo rm -rf tests/CI/output >/dev/null 2>&1 || : "</span><br><span>           }</span><br><span>            /*</span><br><span>            * The Gerrit Trigger will automatically post the "Verified" results back</span><br><span>diff --git a/tests/CI/installAsterisk.sh b/tests/CI/installAsterisk.sh</span><br><span>index 74f5651..0806566 100755</span><br><span>--- a/tests/CI/installAsterisk.sh</span><br><span>+++ b/tests/CI/installAsterisk.sh</span><br><span>@@ -1,6 +1,8 @@</span><br><span> #!/usr/bin/env bash</span><br><span> </span><br><span> CIDIR=$(dirname $(readlink -fn $0))</span><br><span style="color: hsl(120, 100%, 40%);">+UNINSTALL=0</span><br><span style="color: hsl(120, 100%, 40%);">+UNINSTALL_ALL=0</span><br><span> source $CIDIR/ci.functions</span><br><span> </span><br><span> MAKE=`which make`</span><br><span>@@ -10,6 +12,9 @@</span><br><span> fi</span><br><span> destdir=${DESTDIR:+DESTDIR=$DESTDIR}</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+[ $UNINSTALL -gt 0 ] && ${MAKE} ${destdir} uninstall</span><br><span style="color: hsl(120, 100%, 40%);">+[ $UNINSTALL_ALL -gt 0 ] && ${MAKE} ${destdir} uninstall-all</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> ${MAKE} ${destdir} install || ${MAKE} ${destdir} NOISY_BUILD=yes install || exit 1</span><br><span> ${MAKE} ${destdir} samples</span><br><span> if [ x"$DESTDIR" != x ] ; then</span><br><span>diff --git a/tests/CI/periodic-dailyTestGroups.json b/tests/CI/periodic-dailyTestGroups.json</span><br><span>index 01f51d1..7f0fd7e 100644</span><br><span>--- a/tests/CI/periodic-dailyTestGroups.json</span><br><span>+++ b/tests/CI/periodic-dailyTestGroups.json</span><br><span>@@ -2,37 +2,43 @@</span><br><span>   {</span><br><span>            "name": "ari ",</span><br><span>          "dir": "tests/CI/output/ari",</span><br><span style="color: hsl(120, 100%, 40%);">+             "runTestsuiteOptions": "--test-timeout=180",</span><br><span>             "testcmd": "-t tests/rest_api/"</span><br><span>  },</span><br><span>   {</span><br><span>            "name": "pjs ",</span><br><span>          "dir": "tests/CI/output/pjsip",</span><br><span style="color: hsl(120, 100%, 40%);">+           "runTestsuiteOptions": "--test-timeout=180",</span><br><span>             "testcmd": "-t tests/channels/pjsip"</span><br><span>     },</span><br><span>   {</span><br><span>            "name": "sip ",</span><br><span>          "dir": "tests/CI/output/sip",</span><br><span style="color: hsl(120, 100%, 40%);">+             "runTestsuiteOptions": "--test-timeout=240",</span><br><span>             "testcmd": "-t tests/channels/SIP"</span><br><span>       },</span><br><span>   {</span><br><span>            "name": "iax ",</span><br><span>          "dir": "tests/CI/output/iax2_local",</span><br><span style="color: hsl(120, 100%, 40%);">+              "runTestsuiteOptions": "--test-timeout=180",</span><br><span>             "testcmd": " -t tests/channels/iax2 -t tests/channels/local"</span><br><span>     },</span><br><span>   {</span><br><span>            "name": "apps",</span><br><span>          "dir": "tests/CI/output/agi-apps",</span><br><span style="color: hsl(120, 100%, 40%);">+                "runTestsuiteOptions": "--test-timeout=180",</span><br><span>             "testcmd": " -t tests/agi -t tests/apps -t blind-transfer-parkingtimeout"</span><br><span>        },</span><br><span>   {</span><br><span>            "name": "othr",</span><br><span>          "dir": "tests/CI/output/other",</span><br><span style="color: hsl(120, 100%, 40%);">+           "runTestsuiteOptions": "--test-timeout=180",</span><br><span>             "testcmd": " -T tests/(apps|agi|blind-transfer-parkingtimeout|rest_api|channels|realtime|example|skeleton_test|remote-test)"</span><br><span>     },</span><br><span>   {</span><br><span>            "name": "real",</span><br><span>          "dir": "tests/CI/output/realtime",</span><br><span style="color: hsl(0, 100%, 40%);">-          "runTestsuiteOptions": "--realtime",</span><br><span style="color: hsl(120, 100%, 40%);">+              "runTestsuiteOptions": "--test-timeout=180 --realtime --initialize-db --cleanup-db",</span><br><span>             "testcmd": " -t tests/channels/pjsip -G realtime-incompatible"</span><br><span>   }</span><br><span> ]</span><br><span>diff --git a/tests/CI/periodics-daily.jenkinsfile b/tests/CI/periodics-daily.jenkinsfile</span><br><span>index 8f53658..ae762f8 100644</span><br><span>--- a/tests/CI/periodics-daily.jenkinsfile</span><br><span>+++ b/tests/CI/periodics-daily.jenkinsfile</span><br><span>@@ -10,11 +10,23 @@</span><br><span>  * we need to dynamically determine which docker image we're going to use and</span><br><span>  * you can't do that in a delcarative pipeline.</span><br><span>  */</span><br><span style="color: hsl(120, 100%, 40%);">+def timeoutTime = 3</span><br><span style="color: hsl(120, 100%, 40%);">+def timeoutUnits = 'HOURS'</span><br><span style="color: hsl(120, 100%, 40%);">+if (env.TIMEOUT_DAILIES) {</span><br><span style="color: hsl(120, 100%, 40%);">+     def _timeout = env.TIMEOUT_DAILIES.split()</span><br><span style="color: hsl(120, 100%, 40%);">+    timeoutTime = _timeout[0].toInteger()</span><br><span style="color: hsl(120, 100%, 40%);">+ timeoutUnits = _timeout[1]</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> pipeline {</span><br><span style="color: hsl(120, 100%, 40%);">+ options {</span><br><span style="color: hsl(120, 100%, 40%);">+             timestamps()</span><br><span style="color: hsl(120, 100%, 40%);">+          timeout(time: timeoutTime, unit: timeoutUnits)</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span>    triggers {</span><br><span>           cron 'H H(0-4) * * *'</span><br><span>        }</span><br><span style="color: hsl(0, 100%, 40%);">-       </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   agent {</span><br><span>              /* All of the stages need to be performed on a docker host */</span><br><span>                label "swdev-docker"</span><br><span>@@ -25,8 +37,10 @@</span><br><span>                  steps {</span><br><span>                              /* Here's where we switch to scripted pipeline */</span><br><span>                                script {</span><br><span style="color: hsl(120, 100%, 40%);">+                                      manager.createSummary("/plugin/workflow-job/images/48x48/pipelinejob.png").appendText("Docker Host: ${NODE_NAME}", false)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                                      stage ("Checkout") {</span><br><span style="color: hsl(0, 100%, 40%);">-                                          sh "sudo chown -R jenkins:users ."  </span><br><span style="color: hsl(120, 100%, 40%);">+                                                sh "sudo chown -R jenkins:users ."</span><br><span>                                                 sh "printenv | sort"</span><br><span>                                               sh "sudo tests/CI/setupJenkinsEnvironment.sh"</span><br><span>                                      }</span><br><span>@@ -35,23 +49,46 @@</span><br><span>                                      def r = currentBuild.startTimeInMillis % images.length</span><br><span>                                       def ri = images[(int)r]</span><br><span>                                      def randomImage = env.DOCKER_REGISTRY + "/" + ri</span><br><span style="color: hsl(0, 100%, 40%);">-                                      def dockerOptions = "--ulimit core=0 --ulimit nofile=10240 " +</span><br><span style="color: hsl(0, 100%, 40%);">-                                                " -v /srv/jenkins:/srv/jenkins:rw -v /srv/cache:/srv/cache:rw " +</span><br><span style="color: hsl(120, 100%, 40%);">+                                   def dockerOptions = "--privileged --ulimit core=0 --ulimit nofile=10240 " +</span><br><span style="color: hsl(120, 100%, 40%);">+                                         " --tmpfs /tmp:exec,size=1G -v /srv/jenkins:/srv/jenkins:rw -v /srv/cache:/srv/cache:rw " +</span><br><span>                                                " --entrypoint=''"</span><br><span>                                         def bt = env.BUILD_TAG.replaceAll(/[^a-zA-Z0-9_.-]/, '-')</span><br><span>                                    def outputdir = "tests/CI/output/Testsuite"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                                       manager.createSummary("/plugin/workflow-job/images/48x48/pipelinejob.png").appendText("Docker Image: ${randomImage}", false)</span><br><span>                                     def img = docker.image(randomImage)</span><br><span>                                  img.pull()</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                                  stage ("Build") {</span><br><span style="color: hsl(0, 100%, 40%);">-                                             img.inside(dockerOptions + " --name ${bt}-build") {</span><br><span style="color: hsl(120, 100%, 40%);">+                                 img.inside(dockerOptions + " --name ${bt}-build") {</span><br><span style="color: hsl(120, 100%, 40%);">+                                         stage ("Build") {</span><br><span>                                                  echo 'Building..'</span><br><span>                                                    env.CCACHE_DIR = "/srv/cache/ccache"</span><br><span style="color: hsl(0, 100%, 40%);">-                                                  sh "./tests/CI/buildAsterisk.sh --output-dir=${outputdir} --cache-dir=/srv/cache"</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   sh "./tests/CI/buildAsterisk.sh --branch-name=${BRANCH_NAME} --output-dir=${outputdir} --cache-dir=/srv/cache"</span><br><span> </span><br><span>                                                         archiveArtifacts allowEmptyArchive: true, defaultExcludes: false, fingerprint: false,</span><br><span>                                                                artifacts: "${outputdir}/*"</span><br><span>                                                }</span><br><span style="color: hsl(120, 100%, 40%);">+                                             stage ("Docs") {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  sh "sudo ./tests/CI/installAsterisk.sh --branch-name=${BRANCH_NAME}  --user-group=jenkins:users"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  def docUrl = env.GIT_URL.replaceAll(/\/[^\/]+$/, "/publish-docs")</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   checkout scm: [$class: 'GitSCM',</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              branches: [[name: "master"]],</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                       extensions: [</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                         [$class: 'RelativeTargetDirectory', relativeTargetDir: "tests/CI/output/publish-docs"],</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                             [$class: 'CloneOption',</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                                       noTags: true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                                 depth: 10,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                                    honorRefspec: true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                                   shallow: true</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                         ],</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                    ],</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                    userRemoteConfigs: [[url: docUrl]]</span><br><span style="color: hsl(120, 100%, 40%);">+                                                            ]</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   sh "./tests/CI/publishAsteriskDocs.sh --user-group=jenkins:users --branch-name=${BRANCH_NAME} --wiki-doc-branch-regex=\"${WIKI_DOC_BRANCH_REGEX}\""</span><br><span style="color: hsl(120, 100%, 40%);">+                                               }</span><br><span>                                    }</span><br><span> </span><br><span>                                        def testGroups = readJSON file: "tests/CI/periodic-dailyTestGroups.json"</span><br><span>@@ -74,11 +111,11 @@</span><br><span>                                                            img.inside("${dockerOptions} --name ${bt}-${groupName}") {</span><br><span> </span><br><span>                                                                     lock("${JOB_NAME}.${NODE_NAME}.installer") {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                          sh 'sudo ./tests/CI/installAsterisk.sh  --user-group=jenkins:users'</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                           sh "sudo ./tests/CI/installAsterisk.sh --uninstall-all --branch-name=${BRANCH_NAME} --user-group=jenkins:users"</span><br><span>                                                                    }</span><br><span> </span><br><span>                                                                        sh "sudo rm -rf ${groupDir} || : "</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                    </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                                                                   checkout scm: [$class: 'GitSCM',</span><br><span>                                                                             branches: [[name: "${BRANCH_NAME}"]],</span><br><span>                                                                                      extensions: [</span><br><span>@@ -93,7 +130,7 @@</span><br><span>                                                                                   userRemoteConfigs: [[url: testsuiteUrl]]</span><br><span>                                                                             ]</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                                                                   sh "sudo tests/CI/runTestsuite.sh ${groupRunTestsuiteOptions} --testsuite-dir='${groupDir}' --test-command='${groupTestcmd}'"</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                       sh "sudo tests/CI/runTestsuite.sh ${groupRunTestsuiteOptions} --testsuite-dir='${groupDir}' --testsuite-command='${groupTestcmd}'"</span><br><span> </span><br><span>                                                                     archiveArtifacts allowEmptyArchive: true, defaultExcludes: false, fingerprint: true,</span><br><span>                                                                                 artifacts: "${groupDir}/asterisk-test-suite-report.xml, ${groupDir}/logs/**, ${groupDir}/core*.txt"</span><br><span>@@ -115,8 +152,8 @@</span><br><span>  }</span><br><span>    post {</span><br><span>               cleanup {</span><br><span style="color: hsl(0, 100%, 40%);">-                       sh "sudo make distclean 2&>/dev/null || : "</span><br><span style="color: hsl(0, 100%, 40%);">-                    sh "sudo rm -rf tests/CI/output  2&>/dev/null || : "</span><br><span style="color: hsl(120, 100%, 40%);">+                 sh "sudo make distclean >/dev/null 2>&1 || : "</span><br><span style="color: hsl(120, 100%, 40%);">+                    sh "sudo rm -rf tests/CI/output >/dev/null 2>&1 || : "</span><br><span>           }</span><br><span>            success {</span><br><span>                    echo "Reporting ${currentBuild.currentResult} Passed"</span><br><span>diff --git a/tests/CI/ref_debug.jenkinsfile b/tests/CI/ref_debug.jenkinsfile</span><br><span>index d0c42ea..0e0f49c 100644</span><br><span>--- a/tests/CI/ref_debug.jenkinsfile</span><br><span>+++ b/tests/CI/ref_debug.jenkinsfile</span><br><span>@@ -10,7 +10,19 @@</span><br><span>  * we need to dynamically determine which docker image we're going to use and</span><br><span>  * you can't do that in a delcarative pipeline.</span><br><span>  */</span><br><span style="color: hsl(120, 100%, 40%);">+def timeoutTime = 24</span><br><span style="color: hsl(120, 100%, 40%);">+def timeoutUnits = 'HOURS'</span><br><span style="color: hsl(120, 100%, 40%);">+if (env.TIMEOUT_REF_DEBUG) {</span><br><span style="color: hsl(120, 100%, 40%);">+  def _timeout = env.TIMEOUT_REF_DEBUG.split()</span><br><span style="color: hsl(120, 100%, 40%);">+  timeoutTime = _timeout[0].toInteger()</span><br><span style="color: hsl(120, 100%, 40%);">+ timeoutUnits = _timeout[1]</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> pipeline {</span><br><span style="color: hsl(120, 100%, 40%);">+ options {</span><br><span style="color: hsl(120, 100%, 40%);">+             timestamps()</span><br><span style="color: hsl(120, 100%, 40%);">+          timeout(time: timeoutTime, unit: timeoutUnits)</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span>    triggers {</span><br><span>           cron 'H H(0-4) * * 0'</span><br><span>        }</span><br><span>@@ -25,6 +37,8 @@</span><br><span>                        steps {</span><br><span>                              /* Here's where we switch to scripted pipeline */</span><br><span>                                script {</span><br><span style="color: hsl(120, 100%, 40%);">+                                      manager.createSummary("/plugin/workflow-job/images/48x48/pipelinejob.png").appendText("Docker Host: ${NODE_NAME}", false)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                                      stage ("Checkout") {</span><br><span>                                               sh "sudo chown -R jenkins:users ."  </span><br><span>                                               sh "printenv | sort"</span><br><span>@@ -35,11 +49,13 @@</span><br><span>                                         def r = currentBuild.startTimeInMillis % images.length</span><br><span>                                       def ri = images[(int)r]</span><br><span>                                      def randomImage = env.DOCKER_REGISTRY + "/" + ri</span><br><span style="color: hsl(0, 100%, 40%);">-                                      def dockerOptions = "--ulimit core=0 --ulimit nofile=10240 " +</span><br><span style="color: hsl(0, 100%, 40%);">-                                                " -v /srv/jenkins:/srv/jenkins:rw -v /srv/cache:/srv/cache:rw " +</span><br><span style="color: hsl(120, 100%, 40%);">+                                   def dockerOptions = "--privileged --ulimit core=0 --ulimit nofile=10240 " +</span><br><span style="color: hsl(120, 100%, 40%);">+                                         " --tmpfs /tmp:exec,size=1G -v /srv/jenkins:/srv/jenkins:rw -v /srv/cache:/srv/cache:rw " +</span><br><span>                                                " --entrypoint=''"</span><br><span>                                         def bt = env.BUILD_TAG.replaceAll(/[^a-zA-Z0-9_.-]/, '-')</span><br><span>                                    def outputdir = "tests/CI/output/Testsuite"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                                       manager.createSummary("/plugin/workflow-job/images/48x48/pipelinejob.png").appendText("Docker Image: ${randomImage}", false)</span><br><span>                                     def img = docker.image(randomImage)</span><br><span>                                  img.pull()</span><br><span> </span><br><span>@@ -47,7 +63,7 @@</span><br><span>                                           img.inside(dockerOptions + " --name ${bt}-build") {</span><br><span>                                                        echo 'Building..'</span><br><span>                                                    env.CCACHE_DIR = "/srv/cache/ccache"</span><br><span style="color: hsl(0, 100%, 40%);">-                                                  sh "./tests/CI/buildAsterisk.sh --ref-debug --output-dir=${outputdir} --cache-dir=/srv/cache"</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       sh "./tests/CI/buildAsterisk.sh --ref-debug --branch-name=${BRANCH_NAME} --output-dir=${outputdir} --cache-dir=/srv/cache"</span><br><span> </span><br><span>                                                     archiveArtifacts allowEmptyArchive: true, defaultExcludes: false, fingerprint: false,</span><br><span>                                                                artifacts: "${outputdir}/*"</span><br><span>@@ -65,7 +81,7 @@</span><br><span>                                            def groupName = testGroup.name</span><br><span>                                               def groupDir = testGroup.dir</span><br><span>                                                 def groupTestcmd = testGroup.testcmd</span><br><span style="color: hsl(0, 100%, 40%);">-                                            def testsuiteUrl = env.GIT_URL.replaceAll(/\/[^\/]+$/, "/1testsuite")</span><br><span style="color: hsl(120, 100%, 40%);">+                                               def testsuiteUrl = env.GIT_URL.replaceAll(/\/[^\/]+$/, "/testsuite")</span><br><span> </span><br><span>                                           parallelTasks[groupName] = {</span><br><span>                                                         stage (groupName) {</span><br><span>@@ -73,7 +89,7 @@</span><br><span>                                                              img.inside("${dockerOptions} --name ${bt}-${groupName}") {</span><br><span> </span><br><span>                                                                     lock("${JOB_NAME}.${NODE_NAME}.installer") {</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                          sh 'sudo ./tests/CI/installAsterisk.sh  --user-group=jenkins:users'</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                           sh "sudo ./tests/CI/installAsterisk.sh  --uninstall-all --branch-name=${BRANCH_NAME} --user-group=jenkins:users"</span><br><span>                                                                   }</span><br><span> </span><br><span>                                                                        sh "sudo rm -rf ${groupDir} || : "</span><br><span>@@ -92,7 +108,7 @@</span><br><span>                                                                                    userRemoteConfigs: [[url: testsuiteUrl]]</span><br><span>                                                                             ]</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                                                                   sh "sudo tests/CI/runTestsuite.sh --testsuite-dir='${groupDir}' --test-command='${groupTestcmd}'"</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   sh "sudo tests/CI/runTestsuite.sh --testsuite-dir='${groupDir}' --testsuite-command='${groupTestcmd}'"</span><br><span> </span><br><span>                                                                         archiveArtifacts allowEmptyArchive: true, defaultExcludes: false, fingerprint: true,</span><br><span>                                                                                 artifacts: "${groupDir}/asterisk-test-suite-report.xml, ${groupDir}/logs/**, ${groupDir}/core*.txt"</span><br><span>@@ -111,8 +127,8 @@</span><br><span>  }</span><br><span>    post {</span><br><span>               cleanup {</span><br><span style="color: hsl(0, 100%, 40%);">-                       sh "sudo make distclean 2&>/dev/null || : "</span><br><span style="color: hsl(0, 100%, 40%);">-                    sh "sudo rm -rf tests/CI/output  2&>/dev/null || : "</span><br><span style="color: hsl(120, 100%, 40%);">+                 sh "sudo make distclean >/dev/null 2>&1 || : "</span><br><span style="color: hsl(120, 100%, 40%);">+                    sh "sudo rm -rf tests/CI/output >/dev/null 2>&1 || : "</span><br><span>           }</span><br><span>            success {</span><br><span>                    echo "Reporting ${currentBuild.currentResult} Passed"</span><br><span>diff --git a/tests/CI/runTestsuite.sh b/tests/CI/runTestsuite.sh</span><br><span>index 4ca6369..466991a 100755</span><br><span>--- a/tests/CI/runTestsuite.sh</span><br><span>+++ b/tests/CI/runTestsuite.sh</span><br><span>@@ -1,23 +1,29 @@</span><br><span> #!/usr/bin/env bash</span><br><span> CIDIR=$(dirname $(readlink -fn $0))</span><br><span> REALTIME=0</span><br><span style="color: hsl(120, 100%, 40%);">+TEST_TIMEOUT=600</span><br><span> source $CIDIR/ci.functions</span><br><span> ASTETCDIR=$DESTDIR/etc/asterisk</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+if [ x"$WORK_DIR" != x ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+        export AST_WORK_DIR="$(readlink -f $WORK_DIR)"</span><br><span style="color: hsl(120, 100%, 40%);">+      mkdir -p "$AST_WORK_DIR"</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> pushd $TESTSUITE_DIR</span><br><span> </span><br><span> ./cleanup-test-remnants.sh</span><br><span> </span><br><span> if [ $REALTIME -eq 1 ] ; then</span><br><span style="color: hsl(0, 100%, 40%);">- $CIDIR/setupRealtime.sh</span><br><span style="color: hsl(120, 100%, 40%);">+       $CIDIR/setupRealtime.sh --initialize-db=${INITIALIZE_DB:?0}</span><br><span> fi</span><br><span> </span><br><span> export PYTHONPATH=./lib/python/</span><br><span style="color: hsl(0, 100%, 40%);">-echo "Running tests ${TEST_COMMAND}"</span><br><span style="color: hsl(0, 100%, 40%);">-./runtests.py --cleanup ${TEST_COMMAND} | contrib/scripts/pretty_print --no-color --no-timer --term-width=120 --show-errors || :</span><br><span style="color: hsl(120, 100%, 40%);">+echo "Running tests ${TESTSUITE_COMMAND} ${AST_WORK_DIR:+with work directory ${AST_WORK_DIR}}"</span><br><span style="color: hsl(120, 100%, 40%);">+./runtests.py --cleanup --timeout=${TEST_TIMEOUT} ${TESTSUITE_COMMAND} | contrib/scripts/pretty_print --no-color --no-timer --term-width=120 --show-errors || :</span><br><span> </span><br><span> if [ $REALTIME -eq 1 ] ; then</span><br><span style="color: hsl(0, 100%, 40%);">-  $CIDIR/teardownRealtime.sh</span><br><span style="color: hsl(120, 100%, 40%);">+    $CIDIR/teardownRealtime.sh --cleanup-db=${CLEANUP_DB:?0}</span><br><span> fi</span><br><span> </span><br><span> if [ -f core* ] ; then</span><br><span>@@ -26,4 +32,4 @@</span><br><span>     exit 1</span><br><span> fi</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-popd</span><br><span>\ No newline at end of file</span><br><span style="color: hsl(120, 100%, 40%);">+popd</span><br><span>diff --git a/tests/CI/runUnittests.sh b/tests/CI/runUnittests.sh</span><br><span>index 0ad5f49..e2d7e45 100755</span><br><span>--- a/tests/CI/runUnittests.sh</span><br><span>+++ b/tests/CI/runUnittests.sh</span><br><span>@@ -1,9 +1,69 @@</span><br><span> #!/usr/bin/env bash</span><br><span> CIDIR=$(dirname $(readlink -fn $0))</span><br><span style="color: hsl(120, 100%, 40%);">+NO_EXPECT=0</span><br><span> source $CIDIR/ci.functions</span><br><span> ASTETCDIR=$DESTDIR/etc/asterisk</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-echo "full => notice,warning,error,debug,verbose" >     "$ASTETCDIR/logger.conf"</span><br><span style="color: hsl(120, 100%, 40%);">+asterisk_corefile_glob() {</span><br><span style="color: hsl(120, 100%, 40%);">+        local pattern=$(/sbin/sysctl -n kernel.core_pattern)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        # If core_pattern is a pipe there isn't much we can do</span><br><span style="color: hsl(120, 100%, 40%);">+    if [[ ${pattern:0:1} == "|" ]] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+               echo "core*"</span><br><span style="color: hsl(120, 100%, 40%);">+        else</span><br><span style="color: hsl(120, 100%, 40%);">+          echo "${pattern%%%*}*"</span><br><span style="color: hsl(120, 100%, 40%);">+      fi</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+run_tests_expect() {</span><br><span style="color: hsl(120, 100%, 40%);">+$EXPECT <<-EOF</span><br><span style="color: hsl(120, 100%, 40%);">+   spawn sudo $ASTERISK ${USER_GROUP:+-U ${USER_GROUP%%:*} -G ${USER_GROUP##*:}} -fcng -C $CONFFILE</span><br><span style="color: hsl(120, 100%, 40%);">+      match_max 512</span><br><span style="color: hsl(120, 100%, 40%);">+ set timeout 600</span><br><span style="color: hsl(120, 100%, 40%);">+       expect -notransfer "Asterisk Ready."</span><br><span style="color: hsl(120, 100%, 40%);">+        send "core show settings\r"</span><br><span style="color: hsl(120, 100%, 40%);">+ expect -notransfer "CLI>"</span><br><span style="color: hsl(120, 100%, 40%);">+        send "${UNITTEST_COMMAND:-test execute all}\r"</span><br><span style="color: hsl(120, 100%, 40%);">+      expect -notransfer -ex "Test(s) Executed"</span><br><span style="color: hsl(120, 100%, 40%);">+   expect -notransfer "CLI>"</span><br><span style="color: hsl(120, 100%, 40%);">+        send "test show results failed\r"</span><br><span style="color: hsl(120, 100%, 40%);">+   expect -notransfer "CLI>"</span><br><span style="color: hsl(120, 100%, 40%);">+        send "test generate results xml ${OUTPUTFILE}\r"</span><br><span style="color: hsl(120, 100%, 40%);">+    expect -notransfer "CLI>"</span><br><span style="color: hsl(120, 100%, 40%);">+        send "core stop now\r"</span><br><span style="color: hsl(120, 100%, 40%);">+      expect -notransfer "Executing last minute cleanups"</span><br><span style="color: hsl(120, 100%, 40%);">+ wait</span><br><span style="color: hsl(120, 100%, 40%);">+EOF</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+run_tests_socket() {</span><br><span style="color: hsl(120, 100%, 40%);">+  sudo $ASTERISK ${USER_GROUP:+-U ${USER_GROUP%%:*} -G ${USER_GROUP##*:}} -gn -C $CONFFILE</span><br><span style="color: hsl(120, 100%, 40%);">+      for n in {1..5} ; do</span><br><span style="color: hsl(120, 100%, 40%);">+          sleep 3</span><br><span style="color: hsl(120, 100%, 40%);">+               $ASTERISK -rx "core waitfullybooted" -C $CONFFILE && break</span><br><span style="color: hsl(120, 100%, 40%);">+  done</span><br><span style="color: hsl(120, 100%, 40%);">+  sleep 1</span><br><span style="color: hsl(120, 100%, 40%);">+       $ASTERISK -rx "core show settings" -C $CONFFILE</span><br><span style="color: hsl(120, 100%, 40%);">+     $ASTERISK -rx "${UNITTEST_COMMAND:-test execute all}" -C $CONFFILE</span><br><span style="color: hsl(120, 100%, 40%);">+  $ASTERISK -rx "test show results failed" -C $CONFFILE</span><br><span style="color: hsl(120, 100%, 40%);">+       $ASTERISK -rx "test generate results xml $OUTPUTFILE" -C $CONFFILE</span><br><span style="color: hsl(120, 100%, 40%);">+  $ASTERISK -rx "core stop now" -C $CONFFILE</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# If DESTDIR is used to install and run asterisk from non standard locations,</span><br><span style="color: hsl(120, 100%, 40%);">+# the directory entries in asterisk.conf need to be munged to prepend DESTDIR.</span><br><span style="color: hsl(120, 100%, 40%);">+ALTERED=$(head -10 ../tmp/DESTDIR/etc/asterisk/asterisk.conf | grep -q "DESTDIR" && echo yes)</span><br><span style="color: hsl(120, 100%, 40%);">+if [ x"$ALTERED" = x ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+    # In the section that starts with [directories and ends with a blank line,</span><br><span style="color: hsl(120, 100%, 40%);">+    # replace "=> " with "=> ${DESTDIR}"</span><br><span style="color: hsl(120, 100%, 40%);">+        sed -i -r -e "/^\[directories/,/^$/ s@=>\s+@=> ${DESTDIR}@" "$ASTETCDIR/asterisk.conf"</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+cat <<-EOF > "$ASTETCDIR/logger.conf"</span><br><span style="color: hsl(120, 100%, 40%);">+      [logfiles]</span><br><span style="color: hsl(120, 100%, 40%);">+    full => notice,warning,error,debug,verbose</span><br><span style="color: hsl(120, 100%, 40%);">+ console => notice,warning,error</span><br><span style="color: hsl(120, 100%, 40%);">+EOF</span><br><span> </span><br><span> echo "[default]" > "$ASTETCDIR/extensions.conf"</span><br><span> </span><br><span>@@ -23,7 +83,7 @@</span><br><span>        [general]</span><br><span>    enabled=yes</span><br><span>  bindaddr=127.0.0.1</span><br><span style="color: hsl(0, 100%, 40%);">-      port=8088</span><br><span style="color: hsl(120, 100%, 40%);">+     bindport=8088</span><br><span> EOF</span><br><span> </span><br><span> cat <<-EOF > "$ASTETCDIR/modules.conf"</span><br><span>@@ -44,6 +104,7 @@</span><br><span> CONFFILE=$ASTETCDIR/asterisk.conf</span><br><span> OUTPUTDIR=${OUTPUT_DIR:-tests/CI/output/}</span><br><span> OUTPUTFILE=${OUTPUT_XML:-${OUTPUTDIR}/unittests-results.xml}</span><br><span style="color: hsl(120, 100%, 40%);">+EXPECT="$(which expect 2>/dev/null || : )"</span><br><span> </span><br><span> [ ! -d ${OUTPUTDIR} ] && mkdir -p $OUTPUTDIR</span><br><span> [ x"$USER_GROUP" != x ] && sudo chown -R $USER_GROUP $OUTPUTDIR</span><br><span>@@ -51,23 +112,28 @@</span><br><span> rm -rf $ASTETCDIR/extensions.{ael,lua} || :</span><br><span> </span><br><span> set -x</span><br><span style="color: hsl(0, 100%, 40%);">-sudo $ASTERISK ${USER_GROUP:+-U ${USER_GROUP%%:*} -G ${USER_GROUP##*:}} -gn -C $CONFFILE</span><br><span style="color: hsl(0, 100%, 40%);">-for n in `seq 1 5` ; do</span><br><span style="color: hsl(0, 100%, 40%);">-       sleep 3</span><br><span style="color: hsl(0, 100%, 40%);">- $ASTERISK -rx "core waitfullybooted" -C $CONFFILE && break</span><br><span style="color: hsl(0, 100%, 40%);">-done</span><br><span style="color: hsl(0, 100%, 40%);">-sleep 1</span><br><span style="color: hsl(0, 100%, 40%);">-$ASTERISK -rx "${TEST_COMMAND:-test execute all}" -C $CONFFILE</span><br><span style="color: hsl(0, 100%, 40%);">-$ASTERISK -rx "test show results failed" -C $CONFFILE</span><br><span style="color: hsl(0, 100%, 40%);">-$ASTERISK -rx "test generate results xml $OUTPUTFILE" -C $CONFFILE</span><br><span style="color: hsl(0, 100%, 40%);">-$ASTERISK -rx "core stop now" -C $CONFFILE</span><br><span style="color: hsl(120, 100%, 40%);">+if [ x"$EXPECT" != x -a $NO_EXPECT -eq 0 ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+   run_tests_expect</span><br><span style="color: hsl(120, 100%, 40%);">+else</span><br><span style="color: hsl(120, 100%, 40%);">+        run_tests_socket</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+# Cleanup "just in case"</span><br><span style="color: hsl(120, 100%, 40%);">+sudo killall -qe -ABRT $ASTERISK </span><br><span> </span><br><span> runner rsync -vaH $DESTDIR/var/log/asterisk/. $OUTPUTDIR</span><br><span> set +x</span><br><span> </span><br><span> [ x"$USER_GROUP" != x ] && sudo chown -R $USER_GROUP $OUTPUTDIR</span><br><span style="color: hsl(0, 100%, 40%);">-if [ -f core* ] ; then</span><br><span style="color: hsl(0, 100%, 40%);">-  echo "*** Found a core file after running unit tests ***"</span><br><span style="color: hsl(0, 100%, 40%);">-     $DESTDIR/var/lib/asterisk/scripts/ast_coredumper --no-default-search core*</span><br><span style="color: hsl(0, 100%, 40%);">-      exit 1</span><br><span style="color: hsl(0, 100%, 40%);">-fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+for core in $(asterisk_corefile_glob)</span><br><span style="color: hsl(120, 100%, 40%);">+do</span><br><span style="color: hsl(120, 100%, 40%);">+ if [ -f $core ]</span><br><span style="color: hsl(120, 100%, 40%);">+       then</span><br><span style="color: hsl(120, 100%, 40%);">+          echo "*** Found a core file ($core) after running unit tests ***"</span><br><span style="color: hsl(120, 100%, 40%);">+           set -x</span><br><span style="color: hsl(120, 100%, 40%);">+                sudo OUTPUTDIR=$OUTPUTDIR $DESTDIR/var/lib/asterisk/scripts/ast_coredumper --no-default-search $core</span><br><span style="color: hsl(120, 100%, 40%);">+  fi</span><br><span style="color: hsl(120, 100%, 40%);">+done</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+exit 0</span><br><span>diff --git a/tests/CI/setupRealtime.sh b/tests/CI/setupRealtime.sh</span><br><span>index f599d33..49ffb8b 100755</span><br><span>--- a/tests/CI/setupRealtime.sh</span><br><span>+++ b/tests/CI/setupRealtime.sh</span><br><span>@@ -1,9 +1,114 @@</span><br><span> #!/usr/bin/env bash</span><br><span> CIDIR=$(dirname $(readlink -fn $0))</span><br><span style="color: hsl(120, 100%, 40%);">+INITIALIZE_DB=0</span><br><span> source $CIDIR/ci.functions</span><br><span style="color: hsl(120, 100%, 40%);">+ASTTOP=$(readlink -fn $CIDIR/../../)</span><br><span> </span><br><span> set -e</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+POSTGRES_PID=`pidof postgres || : `</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if [ -z "$POSTGRES_PID" ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+       if [ -x /usr/local/bin/postgresql-start ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+              /usr/local/bin/postgresql-start</span><br><span style="color: hsl(120, 100%, 40%);">+       fi</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+POSTGRES_PID=`pidof postgres || : `</span><br><span style="color: hsl(120, 100%, 40%);">+if [ -z "$POSTGRES_PID" ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+     echo "Postgres isn't running. It must be started manually before this test can continue."</span><br><span style="color: hsl(120, 100%, 40%);">+       exit 1</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+if [ $INITIALIZE_DB -gt 0 ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+      echo "(re)Initializing Database"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  sudo -u postgres dropdb -e asterisk_test >/dev/null 2>&1 || :</span><br><span style="color: hsl(120, 100%, 40%);">+       sudo -u postgres dropuser -e asterisk_test >/dev/null  2>&1 || :</span><br><span style="color: hsl(120, 100%, 40%);">+    sudo -u postgres createuser --username=postgres -RDIElS asterisk_test</span><br><span style="color: hsl(120, 100%, 40%);">+ sudo -u postgres createdb --username=postgres -E UTF-8 -O asterisk_test asterisk_test</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       echo "Configuring ODBC"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   sudo odbcinst -u -d -n "PostgreSQL-Asterisk-Test"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ sudo odbcinst -i -d -n "PostgreSQL-Asterisk-Test" -f /dev/stdin <<-EOF</span><br><span style="color: hsl(120, 100%, 40%);">+                [PostgreSQL-Asterisk-Test]</span><br><span style="color: hsl(120, 100%, 40%);">+            Description=PostgreSQL ODBC driver (Unicode version)</span><br><span style="color: hsl(120, 100%, 40%);">+          Driver=psqlodbcw.so</span><br><span style="color: hsl(120, 100%, 40%);">+           Setup=libodbcpsqlS.so</span><br><span style="color: hsl(120, 100%, 40%);">+         Debug=0</span><br><span style="color: hsl(120, 100%, 40%);">+               CommLog=1</span><br><span style="color: hsl(120, 100%, 40%);">+             UsageCount=1</span><br><span style="color: hsl(120, 100%, 40%);">+  EOF</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ sudo odbcinst -u -s -l -n asterisk-connector-test</span><br><span style="color: hsl(120, 100%, 40%);">+     sudo odbcinst -i -s -l -n asterisk-connector-test -f /dev/stdin <<-EOF</span><br><span style="color: hsl(120, 100%, 40%);">+          [asterisk-connector-test]</span><br><span style="color: hsl(120, 100%, 40%);">+             Description        = PostgreSQL connection to 'asterisk' database</span><br><span style="color: hsl(120, 100%, 40%);">+             Driver             = PostgreSQL-Asterisk-Test</span><br><span style="color: hsl(120, 100%, 40%);">+         Database           = asterisk_test</span><br><span style="color: hsl(120, 100%, 40%);">+            Servername         = 127.0.0.1</span><br><span style="color: hsl(120, 100%, 40%);">+                UserName           = asterisk_test</span><br><span style="color: hsl(120, 100%, 40%);">+            Port               = 5432</span><br><span style="color: hsl(120, 100%, 40%);">+             Protocol           = 9.1</span><br><span style="color: hsl(120, 100%, 40%);">+              ReadOnly           = No</span><br><span style="color: hsl(120, 100%, 40%);">+               RowVersioning      = No</span><br><span style="color: hsl(120, 100%, 40%);">+               ShowSystemTables   = No</span><br><span style="color: hsl(120, 100%, 40%);">+               ShowOldColumn      = No</span><br><span style="color: hsl(120, 100%, 40%);">+               FakeOldIndex       = No</span><br><span style="color: hsl(120, 100%, 40%);">+               ConnSettings       =</span><br><span style="color: hsl(120, 100%, 40%);">+  EOF</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+cat >/tmp/config.ini <<-EOF</span><br><span style="color: hsl(120, 100%, 40%);">+       [alembic]</span><br><span style="color: hsl(120, 100%, 40%);">+     script_location = config</span><br><span style="color: hsl(120, 100%, 40%);">+      sqlalchemy.url = postgresql://asterisk_test@localhost/asterisk_test</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ [loggers]</span><br><span style="color: hsl(120, 100%, 40%);">+     keys = root,sqlalchemy,alembic</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      [handlers]</span><br><span style="color: hsl(120, 100%, 40%);">+    keys = console</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      [formatters]</span><br><span style="color: hsl(120, 100%, 40%);">+  keys = generic</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      [logger_root]</span><br><span style="color: hsl(120, 100%, 40%);">+ level = WARN</span><br><span style="color: hsl(120, 100%, 40%);">+  handlers = console</span><br><span style="color: hsl(120, 100%, 40%);">+    qualname =</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  [logger_sqlalchemy]</span><br><span style="color: hsl(120, 100%, 40%);">+   level = WARN</span><br><span style="color: hsl(120, 100%, 40%);">+  handlers =</span><br><span style="color: hsl(120, 100%, 40%);">+    qualname = sqlalchemy.engine</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        [logger_alembic]</span><br><span style="color: hsl(120, 100%, 40%);">+      level = INFO</span><br><span style="color: hsl(120, 100%, 40%);">+  handlers =</span><br><span style="color: hsl(120, 100%, 40%);">+    qualname = alembic</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  [handler_console]</span><br><span style="color: hsl(120, 100%, 40%);">+     class = StreamHandler</span><br><span style="color: hsl(120, 100%, 40%);">+ args = (sys.stderr,)</span><br><span style="color: hsl(120, 100%, 40%);">+  level = NOTSET</span><br><span style="color: hsl(120, 100%, 40%);">+        formatter = generic</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ [formatter_generic]</span><br><span style="color: hsl(120, 100%, 40%);">+   format = %(levelname)-5.5s [%(name)s] %(message)s</span><br><span style="color: hsl(120, 100%, 40%);">+     datefmt = %H:%M:%S</span><br><span style="color: hsl(120, 100%, 40%);">+EOF</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+pushd $ASTTOP/contrib/ast-db-manage</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+psql --username=asterisk_test --host=localhost --db=asterisk_test --command='DROP OWNED BY asterisk_test CASCADE'</span><br><span style="color: hsl(120, 100%, 40%);">+alembic -c /tmp/config.ini upgrade head</span><br><span style="color: hsl(120, 100%, 40%);">+rm -rf /tmp/config.ini || :</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+popd</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> cp test-config.yaml test-config.orig.yaml</span><br><span> </span><br><span> cat >test-config.yaml <<-EOF</span><br><span>@@ -65,59 +170,10 @@</span><br><span>                         config-section: realtime-config</span><br><span>              </span><br><span>         realtime-config:</span><br><span style="color: hsl(0, 100%, 40%);">-            username: "asterisk"</span><br><span style="color: hsl(120, 100%, 40%);">+                username: "asterisk_test"</span><br><span style="color: hsl(120, 100%, 40%);">+           password: "asterisk_test"</span><br><span>          host: "localhost"</span><br><span style="color: hsl(0, 100%, 40%);">-             db: "asterisk"</span><br><span style="color: hsl(0, 100%, 40%);">-                dsn: "asterisk-connector"</span><br><span style="color: hsl(120, 100%, 40%);">+           db: "asterisk_test"</span><br><span style="color: hsl(120, 100%, 40%);">+         dsn: "asterisk-connector-test"</span><br><span> EOF</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-ASTTOP=$(readlink -fn $CIDIR/../../)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-cat >/tmp/config.ini <<-EOF</span><br><span style="color: hsl(0, 100%, 40%);">-     [alembic]</span><br><span style="color: hsl(0, 100%, 40%);">-       script_location = config</span><br><span style="color: hsl(0, 100%, 40%);">-        sqlalchemy.url = postgresql://asterisk@localhost/asterisk</span><br><span style="color: hsl(0, 100%, 40%);">-               </span><br><span style="color: hsl(0, 100%, 40%);">-        [loggers]</span><br><span style="color: hsl(0, 100%, 40%);">-       keys = root,sqlalchemy,alembic</span><br><span style="color: hsl(0, 100%, 40%);">-          </span><br><span style="color: hsl(0, 100%, 40%);">-        [handlers]</span><br><span style="color: hsl(0, 100%, 40%);">-      keys = console</span><br><span style="color: hsl(0, 100%, 40%);">-          </span><br><span style="color: hsl(0, 100%, 40%);">-        [formatters]</span><br><span style="color: hsl(0, 100%, 40%);">-    keys = generic</span><br><span style="color: hsl(0, 100%, 40%);">-          </span><br><span style="color: hsl(0, 100%, 40%);">-        [logger_root]</span><br><span style="color: hsl(0, 100%, 40%);">-   level = WARN</span><br><span style="color: hsl(0, 100%, 40%);">-    handlers = console</span><br><span style="color: hsl(0, 100%, 40%);">-      qualname =</span><br><span style="color: hsl(0, 100%, 40%);">-              </span><br><span style="color: hsl(0, 100%, 40%);">-        [logger_sqlalchemy]</span><br><span style="color: hsl(0, 100%, 40%);">-     level = WARN</span><br><span style="color: hsl(0, 100%, 40%);">-    handlers =</span><br><span style="color: hsl(0, 100%, 40%);">-      qualname = sqlalchemy.engine</span><br><span style="color: hsl(0, 100%, 40%);">-            </span><br><span style="color: hsl(0, 100%, 40%);">-        [logger_alembic]</span><br><span style="color: hsl(0, 100%, 40%);">-        level = INFO</span><br><span style="color: hsl(0, 100%, 40%);">-    handlers =</span><br><span style="color: hsl(0, 100%, 40%);">-      qualname = alembic</span><br><span style="color: hsl(0, 100%, 40%);">-              </span><br><span style="color: hsl(0, 100%, 40%);">-        [handler_console]</span><br><span style="color: hsl(0, 100%, 40%);">-       class = StreamHandler</span><br><span style="color: hsl(0, 100%, 40%);">-   args = (sys.stderr,)</span><br><span style="color: hsl(0, 100%, 40%);">-    level = NOTSET</span><br><span style="color: hsl(0, 100%, 40%);">-  formatter = generic</span><br><span style="color: hsl(0, 100%, 40%);">-             </span><br><span style="color: hsl(0, 100%, 40%);">-        [formatter_generic]</span><br><span style="color: hsl(0, 100%, 40%);">-     format = %(levelname)-5.5s [%(name)s] %(message)s</span><br><span style="color: hsl(0, 100%, 40%);">-       datefmt = %H:%M:%S</span><br><span style="color: hsl(0, 100%, 40%);">-EOF</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-pushd $ASTTOP/contrib/ast-db-manage</span><br><span style="color: hsl(0, 100%, 40%);">-if [ -x /usr/local/bin/postgresql-start ] ; then</span><br><span style="color: hsl(0, 100%, 40%);">-        /usr/local/bin/postgresql-start</span><br><span style="color: hsl(0, 100%, 40%);">-fi</span><br><span style="color: hsl(0, 100%, 40%);">-psql --username=asterisk --host=localhost --db=asterisk --command='DROP OWNED BY asterisk CASCADE'</span><br><span style="color: hsl(0, 100%, 40%);">-alembic -c /tmp/config.ini upgrade head</span><br><span style="color: hsl(0, 100%, 40%);">-rm -rf /tmp/config.ini || :</span><br><span style="color: hsl(0, 100%, 40%);">-popd</span><br><span>diff --git a/tests/CI/teardownRealtime.sh b/tests/CI/teardownRealtime.sh</span><br><span>index 1114699..8687706 100755</span><br><span>--- a/tests/CI/teardownRealtime.sh</span><br><span>+++ b/tests/CI/teardownRealtime.sh</span><br><span>@@ -1,6 +1,12 @@</span><br><span> #!/usr/bin/env bash</span><br><span> CIDIR=$(dirname $(readlink -fn $0))</span><br><span style="color: hsl(120, 100%, 40%);">+CLEANUP_DB=0</span><br><span> source $CIDIR/ci.functions</span><br><span> </span><br><span> cp test-config.orig.yaml test-config.yaml</span><br><span style="color: hsl(0, 100%, 40%);">-psql --username=asterisk --host=localhost --db=asterisk --command='DROP OWNED BY asterisk CASCADE'</span><br><span style="color: hsl(120, 100%, 40%);">+if [ $CLEANUP_DB -gt 0 ] ; then</span><br><span style="color: hsl(120, 100%, 40%);">+       sudo -u postgres dropdb -e asterisk_test >/dev/null 2>&1 || :</span><br><span style="color: hsl(120, 100%, 40%);">+       sudo -u postgres dropuser -e asterisk_test  >/dev/null 2>&1 || :</span><br><span style="color: hsl(120, 100%, 40%);">+    sudo odbcinst -u -d -n "PostgreSQL-Asterisk-Test"</span><br><span style="color: hsl(120, 100%, 40%);">+   sudo odbcinst -u -s -l -n "asterisk-connector-test"</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span>diff --git a/tests/CI/unittests.jenkinsfile b/tests/CI/unittests.jenkinsfile</span><br><span>index 767ff94..3961cf5 100644</span><br><span>--- a/tests/CI/unittests.jenkinsfile</span><br><span>+++ b/tests/CI/unittests.jenkinsfile</span><br><span>@@ -10,7 +10,19 @@</span><br><span>  * we need to dynamically determine which docker image we're going to use and</span><br><span>  * you can't do that in a delcarative pipeline.</span><br><span>  */</span><br><span style="color: hsl(120, 100%, 40%);">+def timeoutTime = 30</span><br><span style="color: hsl(120, 100%, 40%);">+def timeoutUnits = 'MINUTES'</span><br><span style="color: hsl(120, 100%, 40%);">+if (env.TIMEOUT_UNITTESTS) {</span><br><span style="color: hsl(120, 100%, 40%);">+      def _timeout = env.TIMEOUT_UNITTESTS.split()</span><br><span style="color: hsl(120, 100%, 40%);">+  timeoutTime = _timeout[0].toInteger()</span><br><span style="color: hsl(120, 100%, 40%);">+ timeoutUnits = _timeout[1]</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> pipeline {</span><br><span style="color: hsl(120, 100%, 40%);">+ options {</span><br><span style="color: hsl(120, 100%, 40%);">+             timestamps()</span><br><span style="color: hsl(120, 100%, 40%);">+          timeout(time: timeoutTime, unit: timeoutUnits)</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span>    triggers {</span><br><span>           /*</span><br><span>            * This trigger will match either the "asterisk" or "Security-asterisk"</span><br><span>@@ -34,7 +46,7 @@</span><br><span>                      triggerOnEvents: [</span><br><span>                           commentAddedContains('^recheck$'),</span><br><span>                           patchsetCreated(excludeDrafts: false,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                           excludeNoCodeChange: true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                            excludeNoCodeChange: false,</span><br><span>                                                          excludeTrivialRebase: false),</span><br><span>                                draftPublished()</span><br><span>                     ],</span><br><span>@@ -63,10 +75,12 @@</span><br><span>                     }</span><br><span>                    steps {</span><br><span>                              script {</span><br><span style="color: hsl(120, 100%, 40%);">+                                      manager.build.displayName = "${env.GERRIT_CHANGE_NUMBER}"</span><br><span style="color: hsl(120, 100%, 40%);">+                                   manager.createSummary("/plugin/workflow-job/images/48x48/pipelinejob.png").appendText("Docker Host: ${NODE_NAME}", false)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                                      stage ("Checkout") {</span><br><span>                                               sh "sudo chown -R jenkins:users ."</span><br><span style="color: hsl(0, 100%, 40%);">-                                            env.GERRIT_PROJECT_URL = env.GERRIT_CHANGE_URL.replaceAll(/\/[0-9]+$/, "/${env.GERRIT_PROJECT}")</span><br><span style="color: hsl(0, 100%, 40%);">-                                              sh "printenv | sort"</span><br><span style="color: hsl(120, 100%, 40%);">+                                                env.GERRIT_PROJECT_URL = env.GIT_URL.replaceAll(/[^\/]+$/, env.GERRIT_PROJECT)</span><br><span> </span><br><span>                                           /*</span><br><span>                                            * Jenkins has already automatically checked out the base branch</span><br><span>@@ -77,32 +91,46 @@</span><br><span>                                                *</span><br><span>                                            * The Gerrit Trigger provides all the URLs and refspecs to</span><br><span>                                           * check out the change.</span><br><span style="color: hsl(120, 100%, 40%);">+                                               *</span><br><span style="color: hsl(120, 100%, 40%);">+                                             * We need to retrieve the jenkins2 gerrit https credentials</span><br><span style="color: hsl(120, 100%, 40%);">+                                           * in case this review is in a restricted project.</span><br><span>                                            */</span><br><span style="color: hsl(0, 100%, 40%);">-                                             checkout scm: [$class: 'GitSCM',</span><br><span style="color: hsl(0, 100%, 40%);">-                                                        branches: [[name: env.GERRIT_BRANCH ]],</span><br><span style="color: hsl(0, 100%, 40%);">-                                                 extensions: [</span><br><span style="color: hsl(0, 100%, 40%);">-                                                           [$class: 'ScmName', name: 'gerrit-public'],</span><br><span style="color: hsl(0, 100%, 40%);">-                                                             [$class: 'CleanBeforeCheckout'],</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                [$class: 'PreBuildMerge', options: [</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                    mergeRemote: 'gerrit-public',</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                   fastForwardMode: 'NO_FF',</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                       mergeStrategy: 'RECURSIVE',</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                     mergeTarget: env.GERRIT_BRANCH]],</span><br><span style="color: hsl(0, 100%, 40%);">-                                                               [$class: 'CloneOption',</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                 honorRefspec: true,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                     noTags: true,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                   depth: 10,</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                      shallow: true</span><br><span style="color: hsl(120, 100%, 40%);">+                                         withCredentials([usernamePassword(credentialsId: "${JENKINS_GERRIT_CREDS}",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                 passwordVariable: 'GERRIT_USER_PW', usernameVariable: 'GERRIT_USER_NAME')]) {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       sh "printenv | sort"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      checkout scm: [$class: 'GitSCM',</span><br><span style="color: hsl(120, 100%, 40%);">+                                                              branches: [[name: env.GERRIT_BRANCH ]],</span><br><span style="color: hsl(120, 100%, 40%);">+                                                               extensions: [</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                 [$class: 'ScmName', name: env.GERRIT_NAME],</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   [$class: 'CleanBeforeCheckout'],</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                      [$class: 'PreBuildMerge', options: [</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                          mergeRemote: env.GERRIT_NAME,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                         fastForwardMode: 'NO_FF',</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                             mergeStrategy: 'RECURSIVE',</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                           mergeTarget: env.GERRIT_BRANCH]],</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                     [$class: 'CloneOption',</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                               honorRefspec: true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                           noTags: true,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                         depth: 10,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                            shallow: true</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                 ],</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                    [$class: 'PruneStaleBranch'],</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                 [$class: 'BuildChooserSetting',</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                               buildChooser: [$class: 'GerritTriggerBuildChooser']</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   ]</span><br><span>                                                            ],</span><br><span style="color: hsl(0, 100%, 40%);">-                                                              [$class: 'PruneStaleBranch'],</span><br><span style="color: hsl(0, 100%, 40%);">-                                                           [$class: 'BuildChooserSetting',</span><br><span style="color: hsl(0, 100%, 40%);">-                                                                 buildChooser: [$class: 'GerritTriggerBuildChooser']</span><br><span style="color: hsl(120, 100%, 40%);">+                                                           userRemoteConfigs: [</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                  [</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                     credentialsId: env.JENKINS_GERRIT_CREDS,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                      name: env.GERRIT_NAME,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                        refspec: env.GERRIT_REFSPEC,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                  url: env.GERRIT_PROJECT_URL.replaceAll("http(s)?://", "http\$1://${GERRIT_USER_NAME}@")</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                   ]</span><br><span>                                                            ]</span><br><span style="color: hsl(0, 100%, 40%);">-                                                       ],</span><br><span style="color: hsl(0, 100%, 40%);">-                                                      userRemoteConfigs: [</span><br><span style="color: hsl(0, 100%, 40%);">-                                                            [name: env.GERRIT_NAME, refspec: env.GERRIT_REFSPEC, url: env.GERRIT_PROJECT_URL ]</span><br><span>                                                   ]</span><br><span style="color: hsl(0, 100%, 40%);">-                                               ]</span><br><span style="color: hsl(120, 100%, 40%);">+                                             }</span><br><span> </span><br><span>                                                sh "sudo tests/CI/setupJenkinsEnvironment.sh"</span><br><span>                                      }</span><br><span>@@ -112,11 +140,12 @@</span><br><span>                                    def ri = images[(int)r]</span><br><span>                                      def randomImage = env.DOCKER_REGISTRY + "/" + ri;</span><br><span>                                  def bt = env.BUILD_TAG.replaceAll(/[^a-zA-Z0-9_.-]/, '-')</span><br><span style="color: hsl(0, 100%, 40%);">-                                       def dockerOptions = "--ulimit core=0 --ulimit nofile=10240 " +</span><br><span style="color: hsl(0, 100%, 40%);">-                                                " -v /srv/jenkins:/srv/jenkins:rw -v /srv/cache:/srv/cache:rw " +</span><br><span style="color: hsl(120, 100%, 40%);">+                                   def dockerOptions = "--privileged --ulimit core=0 --ulimit nofile=10240 " +</span><br><span style="color: hsl(120, 100%, 40%);">+                                         " --tmpfs /tmp:exec,size=1G -v /srv/jenkins:/srv/jenkins:rw -v /srv/cache:/srv/cache:rw " +</span><br><span>                                                " --entrypoint='' --name ${bt}-build"</span><br><span>                                      def outputdir = "tests/CI/output/UnitTests"</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+                                     manager.createSummary("/plugin/workflow-job/images/48x48/pipelinejob.png").appendText("Docker Image: ${randomImage}", false)</span><br><span>                                     def img = docker.image(randomImage)</span><br><span>                                  img.pull()</span><br><span>                                   img.inside(dockerOptions) {</span><br><span>@@ -124,7 +153,7 @@</span><br><span>                                            stage ('Build') {</span><br><span>                                                    echo 'Building..'</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                                                   sh "./tests/CI/buildAsterisk.sh --output-dir=${outputdir} --cache-dir=/srv/cache"</span><br><span style="color: hsl(120, 100%, 40%);">+                                                   sh "./tests/CI/buildAsterisk.sh --branch-name=${BRANCH_NAME} --output-dir=${outputdir} --cache-dir=/srv/cache"</span><br><span> </span><br><span>                                                         archiveArtifacts allowEmptyArchive: true, defaultExcludes: false, fingerprint: false,</span><br><span>                                                                artifacts: "${outputdir}/*"</span><br><span>@@ -134,9 +163,9 @@</span><br><span>                                                  def outputfile = "${outputdir}/unittests-results.xml"</span><br><span>                                                      def testcmd = "test execute all"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                                                  sh 'sudo ./tests/CI/installAsterisk.sh --user-group=jenkins:users'</span><br><span style="color: hsl(120, 100%, 40%);">+                                                    sh "sudo ./tests/CI/installAsterisk.sh --uninstall-all --branch-name=${BRANCH_NAME} --user-group=jenkins:users"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                                                   sh "tests/CI/runUnittests.sh --user-group=jenkins:users --output-dir='${outputdir}' --output-xml='${outputfile}' --test-command='${testcmd}'"</span><br><span style="color: hsl(120, 100%, 40%);">+                                                       sh "tests/CI/runUnittests.sh --user-group=jenkins:users --output-dir='${outputdir}' --output-xml='${outputfile}' --unittest-command='${testcmd}'"</span><br><span> </span><br><span>                                                      archiveArtifacts allowEmptyArchive: true, defaultExcludes: false, fingerprint: true,</span><br><span>                                                                 artifacts: "${outputdir}/**"</span><br><span>@@ -152,8 +181,8 @@</span><br><span>         }</span><br><span>    post {</span><br><span>               cleanup {</span><br><span style="color: hsl(0, 100%, 40%);">-                       sh "sudo make distclean 2&>/dev/null || : "</span><br><span style="color: hsl(0, 100%, 40%);">-                    sh "sudo rm -rf tests/CI/output 2&>/dev/null || : "</span><br><span style="color: hsl(120, 100%, 40%);">+                  sh "sudo make distclean >/dev/null 2>&1 || : "</span><br><span style="color: hsl(120, 100%, 40%);">+                    sh "sudo rm -rf tests/CI/output >/dev/null 2>&1 || : "</span><br><span>           }</span><br><span>            /*</span><br><span>            * The Gerrit Trigger will automatically post the "Verified" results back</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/c/asterisk/+/11622">change 11622</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/c/asterisk/+/11622"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: certified/13.21 </div>
<div style="display:none"> Gerrit-Change-Id: I0b3254c08a2479f3d39151690350cce5ce5ad766 </div>
<div style="display:none"> Gerrit-Change-Number: 11622 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Friendly Automation </div>
<div style="display:none"> Gerrit-Reviewer: George Joseph <gjoseph@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Joshua Colp <jcolp@digium.com> </div>
<div style="display:none"> Gerrit-Reviewer: Kevin Harwell <kharwell@digium.com> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>