summaryrefslogtreecommitdiffstats
path: root/test/utils/shippable/shippable.sh
blob: 84fc01785e91fe57f7af13f8e331a5bf0d082f35 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#!/bin/bash -eux

set -o pipefail

declare -a args
IFS='/:' read -ra args <<< "${TEST}"

script="${args[0]}"

docker images ansible/ansible
docker ps

if [ -d /home/shippable/cache/ ]; then
    ls -la /home/shippable/cache/
fi

which python
python -V

which pip
pip --version
pip list --disable-pip-version-check

export PATH="test/runner:${PATH}"
export PYTHONIOENCODING='utf-8'

if [ -n "${COVERAGE:-}" ]; then
    # on-demand coverage reporting triggered by setting the COVERAGE environment variable to a non-empty value
    export COVERAGE="--coverage"
elif [[ "${COMMIT_MESSAGE}" =~ ci_coverage ]]; then
    # on-demand coverage reporting triggered by having 'ci_coverage' in the latest commit message
    export COVERAGE="--coverage"
else
    # on-demand coverage reporting disabled (default behavior, always-on coverage reporting remains enabled)
    export COVERAGE=""
fi

if [ -n "${COMPLETE:-}" ]; then
    # disable change detection triggered by setting the COMPLETE environment variable to a non-empty value
    export CHANGED=""
elif [[ "${COMMIT_MESSAGE}" =~ ci_complete ]]; then
    # disable change detection triggered by having 'ci_complete' in the latest commit message
    export CHANGED=""
else
    # enable change detection (default behavior)
    export CHANGED="--changed"
fi

# remove empty core/extras module directories from PRs created prior to the repo-merge
find lib/ansible/modules -type d -empty -print -delete

function cleanup
{
    if find test/results/coverage/ -mindepth 1 -name '.*' -prune -o -print -quit | grep -q .; then
        # for complete on-demand coverage generate a report for all files with no coverage on the "other" job so we only have one copy
        if [ "${COVERAGE}" ] && [ "${CHANGED}" == "" ] && [ "${TEST}" == "other" ]; then
            stub="--stub"
        else
            stub=""
        fi

        # shellcheck disable=SC2086
        ansible-test coverage xml --color -v --requirements --group-by command --group-by version ${stub:+"$stub"}
        cp -a test/results/reports/coverage=*.xml shippable/codecoverage/

        # upload coverage report to codecov.io only when using complete on-demand coverage
        if [ "${COVERAGE}" ] && [ "${CHANGED}" == "" ]; then
            for file in test/results/reports/coverage=*.xml; do
                flags="${file##*/coverage=}"
                flags="${flags%.xml}"
                flags="${flags//=/,}"
                flags="${flags//[^a-zA-Z0-9_,]/_}"

                bash <(curl -s https://codecov.io/bash) \
                    -f "${file}" \
                    -F "${flags}" \
                    -n "${TEST}" \
                    -t 83cd8957-dc76-488c-9ada-210dcea51633 \
                    -X coveragepy \
                    -X gcov \
                    -X fix \
                    -X search \
                    -X xcode \
                || echo "Failed to upload code coverage report to codecov.io: ${file}"
            done
        fi
    fi

    rmdir shippable/testresults/
    cp -a test/results/junit/ shippable/testresults/
    cp -aT test/results/bot/ shippable/testresults/
}

trap cleanup EXIT

"test/utils/shippable/${script}.sh"