bye bye Travis
[plcapi.git] / tests / ci / vm.sh
1 #!/bin/sh
2
3 # @todo support getting the 2 vars as cli options as well as via env vars?
4
5 set -e
6
7 ACTION="${1}"
8
9 # Valid values: 'default', 5.6, 7.0 .. 7.4, 8.0 .. 8.1
10 export PHP_VERSION=${PHP_VERSION:-default}
11 # Valid values: precise (12), trusty (14), xenial (16), bionic (18), focal (20)
12 export UBUNTU_VERSION=${UBUNTU_VERSION:-bionic}
13
14 CONTAINER_USER=docker
15 CONTAINER_BUILD_DIR="/home/${CONTAINER_USER}/build"
16 ROOT_DIR="$(dirname -- "$(dirname -- "$(dirname -- "$(readlink -f "$0")")")")"
17 IMAGE_NAME=phpxmlrpc:${UBUNTU_VERSION}-${PHP_VERSION}
18 CONTAINER_NAME=phpxmlrpc_${UBUNTU_VERSION}_${PHP_VERSION}
19
20 cd "$(dirname -- "$(readlink -f "$0")")"
21
22 help() {
23 printf "Usage: vm.sh [OPTIONS] ACTION [OPTARGS]
24
25 Manages the Test Environment Docker Stack
26
27 Commands:
28     build             build or rebuild the containers and set up the test env
29     cleanup           removes the docker containers and their images
30     enter             enter the test container
31     inspect
32     logs
33     ps
34     runtests [\$suite] execute the test suite using the test container (or a single test scenario eg. tests/1ParsingBugsTest.php)
35     runcoverage       execute the test suite and generate a code coverage report (in build/coverage)
36     start             start the containers
37     stop              stop containers
38     top
39
40 Options:
41     -h                print help
42
43 Environment variables: to be set before the 'build' action
44     PHP_VERSION       default value: 'default', ie. the stock php version from the Ubuntu version in use. Other possible values: 5.6, 7.0 .. 8.1
45     UBUNTU_VERSION    default value: bionic. Other possible values: xenial, focal
46 "
47 }
48
49 build() {
50     stop
51     docker build --build-arg PHP_VERSION --build-arg UBUNTU_VERSION -t "${IMAGE_NAME}" .
52     if docker inspect "${CONTAINER_NAME}" >/dev/null 2>/dev/null; then
53         docker rm "${CONTAINER_NAME}"
54     fi
55     docker run -d \
56         -p 80:80 -p 443:443 -p 8080:8080 \
57         --name "${CONTAINER_NAME}" \
58         --env CONTAINER_USER_UID=$(id -u) --env CONTAINER_USER_GID=$(id -g) \
59         --env TESTS_ROOT_DIR=${CONTAINER_BUILD_DIR} \
60         --env HTTPSERVER=localhost \
61         --env HTTPURI=/demo/server/server.php \
62         --env HTTPSSERVER=localhost \
63         --env HTTPSURI=/demo/server/server.php \
64         --env PROXYSERVER=localhost:8080 \
65         --env HTTPSVERIFYHOST=0 \
66         --env HTTPSIGNOREPEER=1 \
67         --env SSLVERSION=0 \
68         --env DEBUG=0 \
69         -v "${ROOT_DIR}":"${CONTAINER_BUILD_DIR}" \
70          "${IMAGE_NAME}"
71 }
72
73 start() {
74     if docker inspect "${CONTAINER_NAME}" >/dev/null 2>/dev/null; then
75         docker start "${CONTAINER_NAME}"
76     else
77         build
78     fi
79 }
80
81 stop() {
82     if docker inspect "${CONTAINER_NAME}" >/dev/null 2>/dev/null; then
83         docker stop "${CONTAINER_NAME}"
84     fi
85 }
86
87 case "${ACTION}" in
88
89     build)
90         build
91         stop
92         ;;
93
94     cleanup)
95         docker rm "${CONTAINER_NAME}"
96         docker rmi "${IMAGE_NAME}"
97         ;;
98
99     enter | shell | cli)
100         # @todo allow login as root
101         docker exec -it "${CONTAINER_NAME}" su "${CONTAINER_USER}"
102         ;;
103
104     # @todo implement
105     #exec)
106     #    ;;
107
108     restart)
109         stop
110         start
111         ;;
112
113     runcoverage)
114         # @todo clean up /tmp/phpxmlrpc and .phpunit.result.cache
115         if [ ! -d build ]; then mkdir build; fi
116         docker exec -t "${CONTAINER_NAME}" /home/${CONTAINER_USER}/build/tests/ci/setup/setup_code_coverage.sh enable
117         docker exec -it "${CONTAINER_NAME}" su "${CONTAINER_USER}" -c "./vendor/bin/phpunit --coverage-html build/coverage -v tests"
118         docker exec -t "${CONTAINER_NAME}" /home/${CONTAINER_USER}/build/tests/ci/setup/setup_code_coverage.sh disable
119         ;;
120
121     runtests)
122         docker exec -it "${CONTAINER_NAME}" su "${CONTAINER_USER}" -c "./vendor/bin/phpunit -v tests"
123         ;;
124
125     start)
126         start
127         ;;
128
129     #status)
130     #    :
131     #    ;;
132
133     stop)
134         stop
135         ;;
136
137     ps)
138         docker ps --filter "name=${CONTAINER_NAME}"
139         ;;
140
141     diff | inspect | kill | logs | pause | port | stats | top | unpause)
142         docker container "${ACTION}" "${CONTAINER_NAME}"
143         ;;
144
145     *)
146         printf "\n\e[31mERROR:\e[0m unknown action '${ACTION}'\n\n" >&2
147         help
148         exit 1
149         ;;
150 esac