aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Klozik <martinx.klozik@intel.com>2017-02-02 13:43:17 +0000
committerMartin Klozik <martinx.klozik@intel.com>2017-02-16 10:39:47 +0000
commita4a8e7598a82189d16f68a4e113447fc344464c7 (patch)
treee625d51f578eaef924f804609cd50e5ab0c20e34
parentca9c9275ed6d5d852987c69a378e88a3502cb2ab (diff)
ci: Execute pylint checks by VERIFY and MERGE jobs
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>
-rwxr-xr-xcheck71
-rwxr-xr-xci/build-vsperf.sh30
2 files changed, 82 insertions, 19 deletions
diff --git a/check b/check
index f7fca3da..1d67e293 100755
--- 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.
@@ -19,9 +19,10 @@
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 #####
diff --git a/ci/build-vsperf.sh b/ci/build-vsperf.sh
index 24fbb8fa..7771a568 100755
--- a/ci/build-vsperf.sh
+++ b/ci/build-vsperf.sh
@@ -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