From 44815645d9c79f7eea6b372115d01bc8b1ec9554 Mon Sep 17 00:00:00 2001 From: lifeng68 Date: Wed, 3 Jun 2020 11:30:16 +0800 Subject: [PATCH] CI: add coverage report into CI Signed-off-by: lifeng68 --- CI/Dockerfile | 36 ++++++++++++------------ CI/build.sh | 35 +++++++++++++++++++++-- CI/generate_gcov.sh | 43 +++++++++++++++++++++++++++++ CI/make-and-install.sh | 46 +++++++++++++++++++++---------- CMakeLists.txt | 2 +- test/runtime/isula/CMakeLists.txt | 3 +- test/test.sh | 12 ++++++-- 7 files changed, 139 insertions(+), 38 deletions(-) create mode 100755 CI/generate_gcov.sh diff --git a/CI/Dockerfile b/CI/Dockerfile index 2867caa..12ad906 100644 --- a/CI/Dockerfile +++ b/CI/Dockerfile @@ -82,7 +82,9 @@ RUN yum clean all && yum makecache && yum install -y epel-release && yum swap -y CUnit \ CUnit-devel \ valgrind \ - e2fsprogs + e2fsprogs \ + lcov \ + libasan RUN yum clean all && \ (cd /lib/systemd/system/sysinit.target.wants/; for i in *; \ @@ -220,22 +222,22 @@ RUN export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH && \ # install gtest/gmock RUN export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH && \ - set -x && \ - cd ~ && \ - git clone https://gitee.com/src-openeuler/gtest.git && \ - cd gtest && \ - tar xf release-1.8.1.tar.gz && \ - cd googletest-release-1.8.1 && \ - patch -p1 -F1 -s < ../gtest-1.8.1-null-pointer.patch && \ - patch -p1 -F1 -s < ../gtest-PR1839-Fix-Python3-support.patch && \ - patch -p1 -F1 -s < ../gtest-1.8.1-libversion.patch && \ - patch -p1 -F1 -s < ../gtest-1.8.1-add-missing-pkgconfig-requires.patch && \ - mkdir -p build && \ - cd build && \ - cmake -DBUILD_SHARED_LIBS=ON ../ && \ - make -j $(nproc) && \ - make install && \ - ldconfig + set -x && \ + cd ~ && \ + git clone https://gitee.com/src-openeuler/gtest.git && \ + cd gtest && \ + tar xf release-1.8.1.tar.gz && \ + cd googletest-release-1.8.1 && \ + patch -p1 -F1 -s < ../gtest-1.8.1-null-pointer.patch && \ + patch -p1 -F1 -s < ../gtest-PR1839-Fix-Python3-support.patch && \ + patch -p1 -F1 -s < ../gtest-1.8.1-libversion.patch && \ + patch -p1 -F1 -s < ../gtest-1.8.1-add-missing-pkgconfig-requires.patch && \ + mkdir -p build && \ + cd build && \ + cmake -DBUILD_SHARED_LIBS=ON ../ && \ + make -j $(nproc) && \ + make install && \ + ldconfig VOLUME [ "/sys/fs/cgroup" ] CMD ["/usr/sbin/init"] diff --git a/CI/build.sh b/CI/build.sh index 64f873b..6929b24 100755 --- a/CI/build.sh +++ b/CI/build.sh @@ -17,12 +17,14 @@ set +e set -x +enable_gcov=OFF ignore_ci=false basepath=$(cd `dirname $0`; pwd) source $basepath/helper.sh TOPDIR=`pwd` src_code_dir="$TOPDIR" make_script="${TOPDIR}/CI/make-and-install.sh" +gcov_script="${TOPDIR}/CI/generate_gcov.sh" CIDIR="$TOPDIR/CI" testcase_script="${src_code_dir}/CI/run-testcases.sh" testcase_test="${src_code_dir}/CI/test.sh" @@ -58,7 +60,7 @@ function err() { echo "[$(date +'%Y-%m-%dT%H:%M:%S%z')]: $@" >&2 } -args=`getopt -o m:n:g:i:h --long module:,container-num:,ignore-ci:,help -- "$@"` +args=`getopt -o m:n:g:i:h --long module:,container-num:,enable-gcov:,ignore-ci:,help -- "$@"` if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi eval set -- "$args" @@ -66,6 +68,7 @@ while true; do case "$1" in -m|--module) modules=${2} ; modules=(${modules// / }) ; shift 2 ;; -n|--container-num) container_nums=${2} ; shift 2 ;; + -g|--enable-gcov) enable_gcov=${2} ; shift 2 ;; -i|--ignore-ci) ignore_ci=${2} ; shift 2 ;; -h|--help) usage ; exit 0 ;; --) shift ; break ;; @@ -73,6 +76,10 @@ while true; do esac done +if [[ "x${enable_gcov}" == "xON" ]]; then + container_nums=1 +fi + declare -A scripts pwd TESTCASE_PATH="./CI/test_cases" @@ -173,7 +180,7 @@ function do_testcase_auto_assignment() { fi acc_time=$((acc_time + spend_time)) - if [[ ${acc_time} -ge 600 ]]; then + if [[ ${acc_time} -ge 200 ]]; then acc_time=0 CONTAINER_INDEX=$((CONTAINER_INDEX + 1)) fi @@ -286,6 +293,11 @@ fi RES_CODE=0 mkdir -p $LXC_LOCK_DIR_HOST +env_gcov="" +if [[ "x${enable_gcov}" == "xON" ]]; then + env_gcov="--env GCOV=ON" +fi + env_ignore_ci="" if [ "x$ignore_ci" == "xON" ];then env_ignore_ci="--env IGNORE_CI=ON" @@ -378,6 +390,25 @@ trap "kill -9 $tailpid; exit 0" 15 2 wait $pids kill -9 $tailpid +if [[ "x${enable_gcov}" == "xON" ]]; then + rm -rf ${tmpdir}/build + docker cp ${containers[1]}:/root/iSulad/build ${tmpdir} + docker cp ${tmpdir}/build ${containers[0]}:/root + docker exec -e TOPDIR=${src_code_dir} ${containers[0]} ${gcov_script} + echo "iSulad GCOV html generated" + tar xf ./isulad-gcov.tar.gz + rm -rf /var/www/html/isulad-gcov + rm -rf /var/www/html/isulad-gcov.tar.gz + mv ./tmp/isulad-gcov /var/www/html + cp isulad-gcov.tar.gz /var/www/html + + tar xf ./isulad-llt-gcov.tar.gz + rm -rf /var/www/html/isulad-llt-gcov + rm -rf /var/www/html/isulad-llt-gcov.tar.gz + mv ./coverage /var/www/html + cp isulad-llt-gcov.tar.gz /var/www/html +fi + if [[ -e $CIDIR/${CONTAINER_NAME}.runflag ]]; then echo_success "All \"${#scripts[@]}\" testcases passed!" rm -rf $CIDIR/${CONTAINER_NAME}.runflag diff --git a/CI/generate_gcov.sh b/CI/generate_gcov.sh new file mode 100755 index 0000000..41444c4 --- /dev/null +++ b/CI/generate_gcov.sh @@ -0,0 +1,43 @@ +#!/bin/bash +set +e +set -x + +umask 0022 +export GCOV_RESULT_PATH=/tmp/isulad-gcov +ISULAD_SRC_PATH=$(env | grep TOPDIR | awk -F = '{print $2}') +export ISULAD_COPY_PATH=~/iSulad + +echo "================================Generate GCOV data====================================" + +echo "*****************Get iSulad GCOV data**************************" +cp -r ~/build $ISULAD_COPY_PATH +cd $ISULAD_COPY_PATH/build/src/CMakeFiles +lcov -c -o isulad.info -d isulad.dir +lcov -c -o isula.info -d isula.dir/src +lcov -c -o isulad-shim.info -d isulad-shim.dir/src +lcov -c -o libisula.info -d libisula.dir + +# Remove std files +lcov --remove isulad.info '/usr/*' -o isulad.info +lcov --remove isula.info '/usr/*' -o isula.info +lcov --remove isulad-shim.info '/usr/*' -o isulad-shim.info +lcov --remove libisula.info '/usr/*' -o libisula.info + +# Generate html +genhtml --ignore-errors source -o $GCOV_RESULT_PATH/isulad isulad.info +genhtml --ignore-errors source -o $GCOV_RESULT_PATH/isula isula.info +genhtml --ignore-errors source -o $GCOV_RESULT_PATH/isulad-shim isulad-shim.info +genhtml --ignore-errors source -o $GCOV_RESULT_PATH/libisula libisula.info + +cd $ISULAD_COPY_PATH/build/src/http/CMakeFiles +lcov -c -o libhttpclient.info '/usr/*' -o libhttpclient.info + +# Remove std file +lcov --remove libhttpclient.info '/usr/*' -o libhttpclient.info + +# Generate html +genhtml --ignore-errors source -o $GCOV_RESULT_PATH/libhttpclient libhttpclient.info + +tar -zcf $ISULAD_SRC_PATH/isulad-gcov.tar.gz $GCOV_RESULT_PATH + +echo "================================Generate GCOV finish====================================" diff --git a/CI/make-and-install.sh b/CI/make-and-install.sh index d3c3638..1e30a99 100755 --- a/CI/make-and-install.sh +++ b/CI/make-and-install.sh @@ -38,7 +38,7 @@ export C_INCLUDE_PATH=/usr/local/include:${builddir}/include:$C_INCLUDE_PATH export CPLUS_INCLUDE_PATH=/usr/local/include:${builddir}/include:$CPLUS_INCLUDE_PATH export PATH=${builddir}/bin:$PATH -ISULAD_SRC_PATH=`env | grep TOPDIR | awk -F = '{print $2}'` +ISULAD_SRC_PATH=`env | grep TOPDIR | awk -F '=' '{print $2}'` export ISULAD_COPY_PATH=~/iSulad export LCR_SRC_PATH=~/lcr/ @@ -48,6 +48,13 @@ export PATH=$PATH:/usr/local/go/bin umask 0022 cp -r $ISULAD_SRC_PATH $ISULAD_COPY_PATH +#Init GCOV configs +set +e +if [[ "x${GCOV}" == "xON" ]]; then + export enable_gcov=1 +fi +set -e + function echo_success() { echo -e "\033[1;32m"$@"\033[0m" @@ -60,6 +67,19 @@ function echo_error() source $basepath/install_depends.sh +echo_success "===================RUN DT-LLT TESTCASES START=========================" +cd $ISULAD_COPY_PATH +rm -rf build +cd ./test +./test.sh -mcoverage -c -r -t +if [[ $? -ne 0 ]]; then + exit 1 +fi +ISULAD_SRC_PATH=$(env | grep TOPDIR | awk -F = '{print $2}') +tar -zcf $ISULAD_SRC_PATH/isulad-llt-gcov.tar.gz ./coverage +./test.sh -e +echo_success "===================RUN DT-LLT TESTCASES END=========================" + cd $ISULAD_COPY_PATH sed -i 's/fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO/fd == 0 || fd == 1 || fd == 2 || fd >= 1000/g' ./src/cutils/utils.c @@ -67,29 +87,27 @@ sed -i 's/fd == STDIN_FILENO || fd == STDOUT_FILENO || fd == STDERR_FILENO/fd == rm -rf build mkdir build cd build -cmake -DLIB_INSTALL_DIR=${builddir}/lib -DCMAKE_INSTALL_PREFIX=${builddir} -DCMAKE_INSTALL_SYSCONFDIR=${builddir}/etc -DENABLE_EMBEDDED=ON .. +if [[ ${enable_gcov} -ne 1 ]]; then + cmake -DLIB_INSTALL_DIR=${builddir}/lib -DCMAKE_INSTALL_PREFIX=${builddir} -DCMAKE_INSTALL_SYSCONFDIR=${builddir}/etc -DCMAKE_BUILD_TYPE=debug -DGCOV=ON -DENABLE_EMBEDDED=ON .. +else + cmake -DLIB_INSTALL_DIR=${builddir}/lib -DCMAKE_INSTALL_PREFIX=${builddir} -DCMAKE_INSTALL_SYSCONFDIR=${builddir}/etc -DENABLE_EMBEDDED=ON .. +fi make -j $(nproc) make install sed -i 's/"log-driver": "stdout"/"log-driver": "file"/g' ${builddir}/etc/isulad/daemon.json sed -i "/registry-mirrors/a\ \"https://hub-mirror.c.163.com\"" ${builddir}/etc/isulad/daemon.json -echo_success "===================RUN DT-LLT TESTCASES START=========================" -cd $ISULAD_COPY_PATH -rm -rf build -cd ./test -./test.sh -m -c -r -if [[ $? -ne 0 ]]; then - exit 1 -fi -./test.sh -e -echo_success "===================RUN DT-LLT TESTCASES END=========================" - # build rest version cd $ISULAD_COPY_PATH rm -rf build mkdir build cd build -cmake -DLIB_INSTALL_DIR=${restbuilddir}/lib -DCMAKE_INSTALL_PREFIX=${restbuilddir} -DCMAKE_INSTALL_SYSCONFDIR=${restbuilddir}/etc -DENABLE_EMBEDDED=ON -DENABLE_GRPC=OFF .. + +if [[ ${enable_gcov} -ne 0 ]]; then + cmake -DLIB_INSTALL_DIR=${restbuilddir}/lib -DCMAKE_INSTALL_PREFIX=${restbuilddir} -DCMAKE_INSTALL_SYSCONFDIR=${restbuilddir}/etc -DCMAKE_BUILD_TYPE=debug -DGCOV=ON -DENABLE_EMBEDDED=ON -DENABLE_GRPC=OFF -DDISABLE_OCI=ON .. +else + cmake -DLIB_INSTALL_DIR=${restbuilddir}/lib -DCMAKE_INSTALL_PREFIX=${restbuilddir} -DCMAKE_INSTALL_SYSCONFDIR=${restbuilddir}/etc -DENABLE_EMBEDDED=ON -DENABLE_GRPC=OFF -DDISABLE_OCI=ON .. +fi make -j $(nproc) make install sed -i 's/"log-driver": "stdout"/"log-driver": "file"/g' ${restbuilddir}/etc/isulad/daemon.json diff --git a/CMakeLists.txt b/CMakeLists.txt index f788ae9..38eb54f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -57,7 +57,7 @@ include(cmake/protoc.cmake) SET(CMAKE_VERBOSE_MAKEFILE OFF) IF(ENABLE_COVERAGE) MESSAGE(STATUS "Enable coverage compile option") - SET(COVERAGE_C_OPTION "${COVERAGE_OPTION} -fprofile-arcs -ftest-coverage -fkeep-inline-functions -fkeep-static-functions") + SET(COVERAGE_C_OPTION "${COVERAGE_OPTION} -fprofile-arcs -ftest-coverage -fkeep-inline-functions") SET(COVERAGE_CXX_OPTION "${COVERAGE_OPTION} -fprofile-arcs -ftest-coverage") ENDIF(ENABLE_COVERAGE) diff --git a/test/runtime/isula/CMakeLists.txt b/test/runtime/isula/CMakeLists.txt index e497503..03cf2fd 100644 --- a/test/runtime/isula/CMakeLists.txt +++ b/test/runtime/isula/CMakeLists.txt @@ -10,6 +10,7 @@ add_executable(${EXE} ${CMAKE_CURRENT_SOURCE_DIR}/../../../src/cutils/utils_string.c ${CMAKE_CURRENT_SOURCE_DIR}/../../../src/cutils/utils_convert.c ${CMAKE_CURRENT_SOURCE_DIR}/../../../src/cutils/utils_file.c + ${CMAKE_CURRENT_SOURCE_DIR}/../../../src/cutils/util_atomic.c ${CMAKE_CURRENT_SOURCE_DIR}/../../../src/sha256/sha256.c ${CMAKE_CURRENT_SOURCE_DIR}/../../../src/path.c ${CMAKE_CURRENT_SOURCE_DIR}/../../../src/libisulad.c @@ -47,4 +48,4 @@ target_include_directories(${EXE} PUBLIC ) #set_target_properties(${EXE} PROPERTIES LINK_FLAGS) -target_link_libraries(${EXE} ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${CMAKE_THREAD_LIBS_INIT} ${ISULA_LIBUTILS_LIBRARY} -lgrpc++ -lprotobuf -lcrypto -lyajl -lz) +target_link_libraries(${EXE} ${GTEST_BOTH_LIBRARIES} ${GMOCK_LIBRARY} ${GMOCK_MAIN_LIBRARY} ${CMAKE_THREAD_LIBS_INIT} ${ISULA_LIBUTILS_LIBRARY} -lpthread -lgrpc++ -lprotobuf -lcrypto -lyajl -lz) diff --git a/test/test.sh b/test/test.sh index 2d6782f..4568fdd 100755 --- a/test/test.sh +++ b/test/test.sh @@ -25,7 +25,7 @@ function usage() echo " -h, --help Print this help, then exit" echo echo "Compile Options:" - echo " -m, --cmake