From a4a8e7598a82189d16f68a4e113447fc344464c7 Mon Sep 17 00:00:00 2001 From: Martin Klozik Date: Thu, 2 Feb 2017 13:43:17 +0000 Subject: 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 --- check | 71 +++++++++++++++++++++++++++++++++++++++++++----------- ci/build-vsperf.sh | 30 +++++++++++++++++++---- 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 -- cgit 1.2.3-korg