Improve offline-installer-review.sh logic to only run relevant tests
Main CI wrapper script refactored so that it runs tests in a more
granulated manner, i.e. matching between changed files and relevant
tests to run was optimised.
Change-Id: I09086099d7d16c52e29da2fe19440bcfd79ad295
Signed-off-by: Bartek Grzybowski <b.grzybowski@partner.samsung.com>
Issue-ID: OOM-1853
diff --git a/offline-installer-review.sh b/offline-installer-review.sh
index 3530d8f..3e011ea 100755
--- a/offline-installer-review.sh
+++ b/offline-installer-review.sh
@@ -1,7 +1,7 @@
-#! /usr/bin/env bash
+#!/usr/bin/env bash
# COPYRIGHT NOTICE STARTS HERE
#
-# Copyright 2018 © Samsung Electronics Co., Ltd.
+# Copyright 2018-2020 © Samsung Electronics Co., Ltd.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -50,25 +50,67 @@
# MAIN #$
#######################################################################$
FAILED_ROLES=()
+ALL_PLAYBOOKS=(`ls -d ansible/test/play-*`) # enumerate all playbook tests for later usage
-#if ansible role was changed$$
-ROLE_CHANGES=(`git diff HEAD^ HEAD --name-only | grep "ansible/role" | cut -f 1-3 -d "/" | sort -u`)
+# Check for changes in Ansible roles
+ROLE_CHANGES=(`git diff HEAD^ HEAD --name-only ansible/roles | cut -f 1-3 -d "/" | sort -u`)
if [ -z "${ROLE_CHANGES}" ]; then
echo "NO ANSIBLE ROLE TESTS REQUIRED"
else
run_molecule "${ROLE_CHANGES[@]}"
fi
-#if ansible was changed
-
-if `git diff HEAD^ HEAD --name-only | grep -q "ansible/test"`; then
- PLAYBOOKS=(`find ansible/test -name "play-*"`)
- run_molecule "${PLAYBOOKS[@]}"
-else
- echo "NO FULL ANSIBLE TEST REQUIRED";
+# Check for changes in Molecule tests
+if ! $(git diff HEAD^ HEAD --exit-code --quiet ansible/test); then
+ # If there are any changes in ansible/test area
+ MOLECULE_CHANGES=(`git diff HEAD^ HEAD --name-only ansible/test | grep -v "ansible/test/play-.*/"`)
+ if [ ${#MOLECULE_CHANGES[@]} -gt 0 ]; then
+ # If detected changes that affect all playbook tests - run all
+ run_molecule "${ALL_PLAYBOOKS[@]}"
+ # memorize already tested playbooks
+ TESTED_PLAYBOOKS=${ALL_PLAYBOOKS[@]}
+ else
+ # Changes only in ansible/test/play-* area - run tests only for changed playbook tests
+ PLAYBOOKS=(`git diff HEAD^ HEAD --name-only ansible/test | cut -f 1-3 -d "/" | sort -u`)
+ run_molecule "${PLAYBOOKS[@]}"
+ # memorize already tested playbooks
+ TESTED_PLAYBOOKS=${PLAYBOOKS[@]}
+ fi
fi
-#if build was changed
+# Check for changes in Ansible playbooks
+PLAYBOOK_CHANGES=(`git diff HEAD^ HEAD --name-only --relative=ansible ansible/*yml | cut -f 1 -d "."`)
+if [ ${#PLAYBOOK_CHANGES[@]} -gt 0 ]; then
+ for playbook in ${PLAYBOOK_CHANGES[@]};
+ do
+ if [ -d ansible/test/play-${playbook} ]; then
+ # If tests for this playbook are defined
+ if [[ ! ${TESTED_PLAYBOOKS[*]} =~ ${playbook} ]]; then
+ # AND weren't already run
+ run_molecule "ansible/test/play-${playbook}"
+ fi
+ else
+ # Warn that no tests are defined for this playbook
+ echo "[WARNING] ---------- THERE ARE NO TESTS DEFINED FOR ${playbook}.yml PLAYBOOK ----------"
+ fi
+ done
+fi
+
+# Check for changes in Ansible group_vars or libraries
+if ! $(git diff HEAD^ HEAD --exit-code --quiet --relative=ansible/group_vars) || \
+ ! $(git diff HEAD^ HEAD --exit-code --quiet --relative=ansible/library); then
+ # If there are any changes in ansible/{group_vars,libraries}
+ # then run all playbook tests except those that've been
+ # already run
+ for playbook in ${ALL_PLAYBOOKS[@]};
+ do
+ if [[ ! ${TESTED_PLAYBOOKS[*]} =~ ${playbook} ]]; then
+ run_molecule "${playbook}"
+ fi
+ done
+fi
+
+# if build was changed
if `git diff HEAD^ HEAD --name-only | grep -q "build"`; then
echo "TO DO: BUILD TEST" ;
@@ -76,7 +118,7 @@
echo "NO BUILD TEST REQUIRED"
fi
-#if documentation was changed
+# if documentation was changed
if `git diff HEAD^ HEAD --name-only | grep -q "docs"`; then
echo "TO DO: DOC TEST";
@@ -84,7 +126,7 @@
echo "NO DOC TEST REQUIRED"
fi
-#SUMMARY RESULTS
+# SUMMARY RESULTS
if [ -z ${FAILED_ROLES} ]; then
echo "All verification steps passed"
@@ -92,4 +134,3 @@
echo "Verification failed for ${FAILED_ROLES[*]}"
exit 1
fi
-