ansible-collection-hetzner-.../tests/utils/ci.sh

142 lines
3.1 KiB
Bash
Raw Normal View History

#!/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_PATHS="$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_PATHS"
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