From 80762c5bc55029354b607e8f892f027dbdb6ff21 Mon Sep 17 00:00:00 2001 From: alexz Date: Tue, 20 Sep 2016 17:15:57 +0300 Subject: [PATCH] Add linters tests * add shellcheck - fix setupFlannelNode.sh * add yamllint * add murano-pkg-check Change-Id: I25a29dbaec756ebce23fd5affd0abbd777b5cf30 --- .../Resources/scripts/setupFlannelNode.sh | 2 +- tools/jenkins/shellcheck.sh | 69 +++++++++++++++++++ tools/jenkins/yamllint.sh | 64 +++++++++++++++++ tox.ini | 37 +++++++++- 4 files changed, 170 insertions(+), 2 deletions(-) create mode 100755 tools/jenkins/shellcheck.sh create mode 100755 tools/jenkins/yamllint.sh diff --git a/Kubernetes/KubernetesCluster/package/Resources/scripts/setupFlannelNode.sh b/Kubernetes/KubernetesCluster/package/Resources/scripts/setupFlannelNode.sh index 5113984..a814eac 100644 --- a/Kubernetes/KubernetesCluster/package/Resources/scripts/setupFlannelNode.sh +++ b/Kubernetes/KubernetesCluster/package/Resources/scripts/setupFlannelNode.sh @@ -28,7 +28,7 @@ done ip link set dev docker0 down brctl delbr docker0 -echo DOCKER_OPTS=\"-H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU}\" > /etc/default/docker +echo DOCKER_OPTS=\"-H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock --bip="${FLANNEL_SUBNET}" --mtu="${FLANNEL_MTU}"\" > /etc/default/docker echo post-up iptables -t nat -A POSTROUTING -s 10.200.0.0/16 ! -d 10.200.0.0/16 -j MASQUERADE >> /etc/network/interfaces.d/eth0.cfg iptables -t nat -A POSTROUTING -s 10.200.0.0/16 ! -d 10.200.0.0/16 -j MASQUERADE diff --git a/tools/jenkins/shellcheck.sh b/tools/jenkins/shellcheck.sh new file mode 100755 index 0000000..60bf448 --- /dev/null +++ b/tools/jenkins/shellcheck.sh @@ -0,0 +1,69 @@ +#!/bin/bash + +WORKSPACE="${WORKSPACE:-${1}}" +APP_DIRS="${APP_DIRS:-${2}}" +# SC2001: See if you can use ${variable//search/replace} instead. +# Occasionally a more complex sed substitution is required, so lets igone +# this warning +skip_list='SC2001' + +function help_m() { + cat <<-EOF + *********************************************************************** + Shellcheck script help message: + Scripts work with files under \${WORKSPACE}/\${APP_DIRS} + Please use env variable: + - Set directory for scan: + export WORKSPACE='/dir/with/sh/files/to/scan' + export APP_DIRS="Applications DockerInterfacesLibrary DockerStandaloneHost Kubernetes" + - or directly: + ./shellcheck.sh "/dir/with/sh/files/to/scan" "Applications DockerInterfacesLibrary DockerStandaloneHost Kubernetes" + *********************************************************************** + EOF +} + +function run_check() { + local e_count=0 + + for w_dir in ${APP_DIRS}; do + cat <<-EOF + *********************************************************************** + * + * Starting shellcheck against dir:"${WORKSPACE}/${w_dir}" + * + *********************************************************************** + EOF + while read -d '' -r script; do + unset RESULT + shellcheck "${script}" -e "${skip_list}" + RESULT=$? + if [ ${RESULT} != 0 ]; then + ((e_count++)) + fi + done < <(find "${WORKSPACE}/${w_dir}" -name '*.sh' -print0) + done + cat <<-EOF + *********************************************************************** + * + * shellcheck finished with ${e_count} errors. + * + *********************************************************************** + EOF + if [ "${e_count}" -gt 0 ] ; then + exit 1 + fi +} + +### Body: + +if [[ -z "${WORKSPACE}" ]]; then + echo 'ERROR: WORKSPACE variable is not set!' + help_m + exit 1 +fi +if [[ -z "${APP_DIRS}" ]]; then + echo 'ERROR: APP_DIRS variable is not set!' + help_m + exit 1 +fi +run_check diff --git a/tools/jenkins/yamllint.sh b/tools/jenkins/yamllint.sh new file mode 100755 index 0000000..aac011c --- /dev/null +++ b/tools/jenkins/yamllint.sh @@ -0,0 +1,64 @@ +#!/bin/bash + +WORKSPACE="${WORKSPACE:-${1}}" +APP_DIRS="${APP_DIRS:-${2}}" +function help_m() { + cat <<-EOF + *********************************************************************** + Yamllint script help message: + Scripts work with files under \${WORKSPACE}/\${APP_DIRS} + Please use env variable: + - Set directory for scan: + export WORKSPACE='/dir/with/sh/files/to/scan' + export APP_DIRS="Applications DockerInterfacesLibrary DockerStandaloneHost Kubernetes" + - or directly: + ./yamllint.sh "/dir/with/sh/files/to/scan" "Applications DockerInterfacesLibrary DockerStandaloneHost Kubernetes" + *********************************************************************** + EOF +} + +function run_check() { + local e_count=0 + + for w_dir in ${APP_DIRS}; do + cat <<-EOF + *********************************************************************** + * + * Starting yamllint against dir:"${WORKSPACE}/${w_dir}" + * + *********************************************************************** + EOF + while read -d '' -r y_file; do + unset RESULT + yamllint -d relaxed "${y_file}" + RESULT=$? + if [ ${RESULT} != 0 ]; then + ((e_count++)) + fi + done < <(find "${WORKSPACE}/${w_dir}" -name '*.yaml' -print0) + done + cat <<-EOF + *********************************************************************** + * + * yamllint finished with ${e_count} errors. + * + *********************************************************************** + EOF + if [ "${e_count}" -gt 0 ] ; then + exit 1 + fi +} + +### Body: + +if [[ -z "${WORKSPACE}" ]]; then + echo 'ERROR: WORKSPACE variable is not set!' + help_m + exit 1 +fi +if [[ -z "${APP_DIRS}" ]]; then + echo 'ERROR: APP_DIRS variable is not set!' + help_m + exit 1 +fi +run_check diff --git a/tox.ini b/tox.ini index cc3a64b..dc633d8 100644 --- a/tox.ini +++ b/tox.ini @@ -8,7 +8,9 @@ setenv = VIRTUAL_ENV={envdir} LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=C -passenv = OS_* MURANO* *ENDPOINT* +# to be used in yamllint.sh and shellcheck.sh + APP_DIRS=Applications DockerInterfacesLibrary DockerStandaloneHost Kubernetes +passenv = OS_* MURANO* *ENDPOINT* APPS_DIRS deps= -r{toxinidir}/test-requirements.txt distribute = false @@ -18,3 +20,36 @@ commands = {posargs:} [testenv:deploy_scale_k8s] commands = python -m unittest tests.test_k8s_app.MuranoK8sTest.test_deploy_scale_k8s + +[testenv:shellcheck] +# 'shellcheck' is not an Python package, so it can be run w\o +# virtual env. But tox is a usable wrapper to run any kind of tests - +# let's use it for common test-run as well - for unification purposes. +whitelist_externals = shellcheck +commands = {toxinidir}/tools/jenkins/shellcheck.sh {toxinidir} + +[testenv:yaml-syntaxcheck] +deps = yamllint +commands = {toxinidir}/tools/jenkins/yamllint.sh {toxinidir} + +[testenv:linters] +# linters env - it's a combination of check's (usually syntax) +# for aggregate non-destructive run's. Used only in openstack-infra ci for +# decrease resource usage. +# Current duplicate list: +# shellcheck +# yaml-syntaxcheck +# +# We need to suppress exit code from 'command1', to be able run 'command2'; +# Otherwise, if some command failed - exit code from tox itself will be 1 +ignore_errors=True +deps = yamllint + murano-pkg-check +whitelist_externals = shellcheck +commands = {toxinidir}/tools/jenkins/shellcheck.sh {toxinidir} + {toxinidir}/tools/jenkins/yamllint.sh {toxinidir} + murano-pkg-check --verbose --debug --discover {toxinidir} + +[testenv:murano-pkg-check] +deps = murano-pkg-check +commands = murano-pkg-check --verbose --debug --discover {toxinidir}