ci: Execute pylint checks by VERIFY and MERGE jobs 95/27995/4
authorMartin Klozik <martinx.klozik@intel.com>
Thu, 2 Feb 2017 13:43:17 +0000 (13:43 +0000)
committerMartin Klozik <martinx.klozik@intel.com>
Thu, 16 Feb 2017 10:39:47 +0000 (10:39 +0000)
Pylint should be executed automatically for every patch
to assure, that new code meets vsperf coding standards.

JIRA: VSPERF-114

Change-Id: Icb1000e207b2d728497ff3d349fb3cb8334baac7
Signed-off-by: Martin Klozik <martinx.klozik@intel.com>
check
ci/build-vsperf.sh

diff --git a/check b/check
index f7fca3d..1d67e29 100755 (executable)
--- a/check
+++ b/check
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-# Copyright 2015 Intel Corporation.
+# Copyright 2017 Intel Corporation.
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
 # you may not use this file except in compliance with the License.
 PYLINT="pylint"
 PYLINT_RC='pylintrc'
 PYLINT_RATING_GATE="10"
-FILE_REGEX="(vsperf|.*\.py)"
-FIND_OPTIONS="-regextype posix-egrep -iregex (./)?$FILE_REGEX"
+PYLINT_RATING_MIN=$PYLINT_RATING_GATE
+FILE_REGEX="(^vsperf|\.py)$"
 FILE_LIST="/tmp/vsperf_check_list.txt"
+BC=`which bc`
 
 # print usage if requested
 function usage() {
@@ -39,8 +40,10 @@ Otherwise gained pylint rating will be displayed.
 
 
     -h, --help                  Script usage
+    -b, --black                 Suppress colours. Output will be black&white.
     -m, --modified              Script will check python files, which have
                                 been modified within current repository.
+
 Examples:
     ./check
 
@@ -64,9 +67,27 @@ EOM
 # compare pylint result with predefined gate
 function rating_is_ok() {
     # bc is not part of basic Centos installation
-    # so let us do integer comparison only
-    int_rating=`echo $1 | sed -e 's/\..*$//'`
-    [ $int_rating -ge $PYLINT_RATING_GATE ]
+    # so let us check if it is available
+    if [ "x$BC" == "x" ] ; then
+        # no bc, so do integer comparison only
+        int_rating=`echo $1 | sed -e 's/\..*$//'`
+        int_rating_min=`echo $PYLINT_RATING_MIN | sed -e 's/\..*$//'`
+        [ $int_rating -lt $int_rating_min ] && PYLINT_RATING_MIN=$int_rating
+        if [ $int_rating -lt $PYLINT_RATING_GATE ] ; then
+            return 1
+        else
+            return 0
+        fi
+    else
+        if (( $(echo "$1<$PYLINT_RATING_MIN" | bc -l) )) ; then
+            PYLINT_RATING_MIN=$1
+        fi
+        if (( $(echo "$1<$PYLINT_RATING_GATE" | bc -l) )) ; then
+            return 1
+        else
+            return 0
+        fi
+    fi
 }
 
 ##### MAIN #####
@@ -76,6 +97,19 @@ if [ "x$1" == "x-h" -o "x$1" == "x--help" ] ; then
     exit 0
 fi
 
+# set colours
+if [ "x$1" == "x-b" -o "x$1" == "x--black" ] ; then
+    shift
+    RED=""
+    GREEN=""
+    BLACK=""
+else
+    RED="\e[31m"
+    GREEN="\e[32m"
+    BLACK="\e[0m"
+fi
+
+
 # check if pylint is available
 if ! which $PYLINT &>/dev/null ; then
     echo "$PYLINT is not available, thus check can't be executed"
@@ -95,14 +129,14 @@ EXCLUDED_MODULES=`grep "^ *EXCLUDE_MODULES" conf/00_common.conf | tr '"' "'"`
 rm $FILE_LIST &> /dev/null
 if [ "x$1" == "x-m" -o "x$1" == "x--modified" ] ; then
     # check of modified files requested
-    git status --porcelain | cut -b4- | egrep -i "^${FILE_REGEX}$" > $FILE_LIST
+    git status --porcelain | cut -b4- | egrep -i "${FILE_REGEX}" | sort > $FILE_LIST
 elif [ "x$*" == "x" ] ; then
     # list is empty, check all python files
-    find . -type f $FIND_OPTIONS > $FILE_LIST
+    git ls-tree --name-only -r HEAD | egrep -i "${FILE_REGEX}" | sort > $FILE_LIST
 else
     for item in $* ; do
         if [ -d $item ] ; then
-            find $item -type f $FIND_OPTIONS >> $FILE_LIST
+            git ls-tree --name-only -r HEAD $item | egrep -i "${FILE_REGEX}" | sort >> $FILE_LIST
         elif [ -f $item ] ; then
             echo $item >> $FILE_LIST
         else
@@ -113,22 +147,26 @@ else
 fi
 
 # check if there is anything to check
+echo "Execution of pylint checks:"
 if [ -s $FILE_LIST ] ; then
     for pyfile in `cat $FILE_LIST | sort` ; do
         # get base name
         pyfile_basename="'"`basename $pyfile .py`"'"
         # and check if it should be excluded or not
         if ( echo $EXCLUDED_MODULES | grep -w $pyfile_basename > /dev/null ) ; then
-            printf "%-70s \e[32m%-6s\e[0m\n" $pyfile "EXCLUDED"
+            printf "    %-70s %-6s\n" $pyfile "EXCLUDED"
             continue
         fi
         # run pylint and extract final rating
         rating=`$PYLINT --rcfile $PYLINT_RC $pyfile 2>/dev/null | tail -n3 | grep rated | sed -e 's/^.*rated at \([0-9.]*\).*$/\1/'`
         # evaluate and display aquired rating
-        if rating_is_ok $rating ; then
-            printf "%-70s \e[32m%-6s\e[0m\n" $pyfile "OK"
+        if [ "x$rating" == "x" ] ; then
+            # rating is not available for files without python statements
+            printf "    %-70s %-6s\n" $pyfile "NA"
+        elif rating_is_ok $rating ; then
+            printf "    %-70s ${GREEN}%-6s${BLACK}\n" $pyfile "OK"
         else
-            printf "%-70s \e[31m%-6s\e[0m\n" $pyfile $rating
+            printf "    %-70s ${RED}%-6s${BLACK}\n" $pyfile $rating
         fi
     done
 else
@@ -139,5 +177,10 @@ fi
 # clean up
 rm $FILE_LIST &> /dev/null
 
-exit 0
+if [ "$PYLINT_RATING_MIN" != "$PYLINT_RATING_GATE" ] ; then
+    echo -e "Pylint check has failed. All files must have score ${PYLINT_RATING_GATE}.\n"
+    exit 1
+else
+    exit 0
+fi
 ##### MAIN end #####
index 24fbb8f..7771a56 100755 (executable)
@@ -27,8 +27,9 @@
 EXIT=0
 EXIT_TC_FAILED=1
 EXIT_SANITY_TC_FAILED=2
-EXIT_NO_RESULTS=10
-EXIT_NO_TEST_REPORT_LOG_DIR=11
+EXIT_PYLINT_FAILED=4
+EXIT_NO_RESULTS=128
+EXIT_NO_TEST_REPORT_LOG_DIR=256
 
 #
 # configuration
@@ -188,7 +189,7 @@ function execute_vsperf() {
         exit $EXIT_NO_RESULTS
     else
         print_results "${RES_DIR}"
-        if [ "$EXIT" -eq "$EXIT_TC_FAILED" ] ; then
+        if [ $(($EXIT & $EXIT_TC_FAILED)) -gt 0 ] ; then
             echo "-------------------------------------------------------------------"
             cat $LOG_FILE
             echo "-------------------------------------------------------------------"
@@ -308,20 +309,28 @@ function execute_vsperf_sanity() {
         echo >> $LOG_FILE
     done
     echo "Sanity log file $LOG_FILE"
-    if [ "$EXIT" -ne "0" ] ; then
+    if [ $(($EXIT & $EXIT_SANITY_TC_FAILED)) -gt 0 ] ; then
         echo "-------------------------------------------------------------------"
         cat $LOG_FILE
         echo "-------------------------------------------------------------------"
     fi
 }
 
+# execute pylint to check code quality
+function execute_vsperf_pylint_check() {
+    if ! ./check -b ; then
+        EXIT=$EXIT_PYLINT_FAILED
+    fi
+}
+
 # check and install required packages at nodes running VERIFY and MERGE jobs
 function dependencies_check() {
     . /etc/os-release
     if [ $ID == "ubuntu" ] ; then
         echo "Dependencies check"
         echo "=================="
-        for PACKAGE in "python3-tk" "sysstat" ; do
+        # install system packages
+        for PACKAGE in "python3-tk" "sysstat" "bc" ; do
             if dpkg -s $PACKAGE &> /dev/null ; then
                 printf "    %-70s %-6s\n" $PACKAGE "OK"
             else
@@ -329,6 +338,15 @@ function dependencies_check() {
                 sudo apt-get install -y $PACKAGE
             fi
         done
+        # install additional python packages into python environment
+        for PACKAGE in "pylint" ; do
+            if pip show $PACKAGE &> /dev/null ; then
+                printf "    %-70s %-6s\n" $PACKAGE "OK"
+            else
+                printf "    %-70s %-6s\n" $PACKAGE "missing"
+                pip install $PACKAGE
+            fi
+        done
         echo
     fi
 }
@@ -386,6 +404,7 @@ case $1 in
         echo "VSPERF verify job"
         echo "================="
 
+        execute_vsperf_pylint_check
         terminate_vsperf
         execute_vsperf_sanity
         terminate_vsperf
@@ -400,6 +419,7 @@ case $1 in
         echo "VSPERF merge job"
         echo "================"
 
+        execute_pylint_check
         terminate_vsperf
         execute_vsperf_sanity
         terminate_vsperf