summaryrefslogtreecommitdiffstats
path: root/ansible_collections/hetzner/hcloud/tests/utils/ci.sh
diff options
context:
space:
mode:
Diffstat (limited to 'ansible_collections/hetzner/hcloud/tests/utils/ci.sh')
-rwxr-xr-xansible_collections/hetzner/hcloud/tests/utils/ci.sh141
1 files changed, 141 insertions, 0 deletions
diff --git a/ansible_collections/hetzner/hcloud/tests/utils/ci.sh b/ansible_collections/hetzner/hcloud/tests/utils/ci.sh
new file mode 100755
index 000000000..e5d73912a
--- /dev/null
+++ b/ansible_collections/hetzner/hcloud/tests/utils/ci.sh
@@ -0,0 +1,141 @@
+#!/usr/bin/env bash
+
+set -o pipefail -eux
+
+error() {
+ echo >&2 "error: $*"
+ exit 1
+}
+
+retry() {
+ local exit_code=1
+
+ for _ in 1 2 3; do
+ set +e
+ "$@"
+ exit_code=$?
+ set -e
+ if [ $exit_code == 0 ]; then
+ return $exit_code
+ fi
+ done
+
+ echo "Command '$*' failed 3 times!"
+ exit $exit_code
+}
+
+declare -a entry_point_args
+IFS='/:' read -ra entry_point_args <<< "$1"
+
+# Explode entry point args, for example '2.16/integration/3.10/2' or '2.16/sanity'
+ansible_version="${entry_point_args[0]}"
+test_name="${entry_point_args[1]}"
+python_version="${entry_point_args[2]:-}"
+test_group="${entry_point_args[3]:-}"
+
+export PYTHONIOENCODING="utf-8"
+export PIP_DISABLE_PIP_VERSION_CHECK=true
+export PIP_NO_WARN_SCRIPT_LOCATION=false # Negative options are a bit weird: https://pip.pypa.io/en/stable/topics/configuration/#boolean-options
+export ANSIBLE_COLLECTIONS_PATH="$PWD/../.."
+
+command -v python
+python -V
+
+command -v pip
+pip --version
+pip list
+
+if [ "$ansible_version" == "devel" ]; then
+ pip install "https://github.com/ansible/ansible/archive/devel.tar.gz"
+else
+ pip install "https://github.com/ansible/ansible/archive/stable-$ansible_version.tar.gz"
+fi
+command -v ansible
+ansible --version
+
+# Prepare coverage args
+if $COVERAGE; then
+ coverage_args="--coverage"
+elif [[ "$COMMIT_MESSAGE" =~ ci_coverage ]]; then
+ coverage_args="--coverage"
+else
+ coverage_args="--coverage-check"
+fi
+
+# Prepare changed args
+if $COMPLETE; then
+ changed_args=""
+elif [[ "$COMMIT_MESSAGE" =~ ci_complete ]]; then
+ changed_args=""
+else
+ changed_args="--changed"
+fi
+
+# Prepare unstable args
+if $IS_PULL_REQUEST; then
+ unstable_args="--allow-unstable-changed"
+else
+ unstable_args=""
+fi
+
+# Install dependencies
+pip install rstcheck
+
+# Ensure we can write other collections to this dir
+sudo chown "$(whoami)" "$ANSIBLE_COLLECTIONS_PATH"
+
+pip install -r tests/integration/requirements.txt -c tests/constraints.txt
+ansible-galaxy -vvv collection install -r tests/requirements.yml
+
+# Dump env and set timeout
+timeout=45
+if $COVERAGE; then
+ timeout=60
+fi
+
+ansible-test env --color -v --dump --show --timeout "$timeout"
+
+# Run tests
+case "$test_name" in
+ sanity)
+ # shellcheck disable=SC2086
+ ansible-test sanity --color -v \
+ --exclude plugins/module_utils/vendor/ \
+ --exclude scripts/ \
+ --exclude tests/utils/ \
+ --docker default \
+ --junit \
+ $coverage_args \
+ $changed_args \
+ --allow-disabled
+ ;;
+
+ units)
+ # shellcheck disable=SC2086
+ ansible-test units --color -v \
+ --docker default \
+ --python "$python_version" \
+ $coverage_args \
+ $changed_args
+ ;;
+
+ integration)
+ # shellcheck disable=SC2086
+ ansible-test integration --color -v \
+ --remote-terminate always \
+ --remote-stage prod \
+ --docker default \
+ --python "$python_version" \
+ --retry-on-error \
+ $coverage_args \
+ $changed_args \
+ --changed-all-target none \
+ --changed-all-mode include \
+ $unstable_args \
+ "azp/group$test_group/"
+ ;;
+
+ *)
+ error "found invalid test_name: $test_name"
+ ;;
+esac