Skip to content

Commit d762368

Browse files
committed
Add Docker and Git configuration
1 parent be215cb commit d762368

File tree

8 files changed

+380
-0
lines changed

8 files changed

+380
-0
lines changed

.env

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
PLUGIN_NAME=plugin
2+
BASE_PATH=/opt/projects/wp-oop/plugin
3+
PROJECT_MOUNT_PATH=/var/www/html/wp-content/plugins/plugin
4+
DOCROOT_PATH=/var/www/html
5+
BUILD_ROOT_PATH=/app/
6+
PROJECT_NAME=me_plugin
7+
8+
PHP_BUILD_VERSION=7.1
9+
PHP_TEST_VERSION=7.4
10+
11+
DB_ROOT_PASSWORD=am@n0fData
12+
DB_NAME=wordpress
13+
DB_USER_NAME=wordpress
14+
DB_USER_PASSWORD=UDG@F!oy8g37921f
15+
16+
WP_DOMAIN=plugin.myhost
17+
WP_TITLE="plugin Test"
18+
19+
ADMIN_USER=admin
20+
ADMIN_PASS=admin
21+
ADMIN_EMAIL=me@my.com

.env.example

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
PLUGIN_NAME=plugin
2+
BASE_PATH=./
3+
PROJECT_MOUNT_PATH=/var/www/html/wp-content/plugins/plugin
4+
DOCROOT_PATH=/var/www/html
5+
BUILD_ROOT_PATH=/app/
6+
PROJECT_NAME=me_plugin
7+
8+
PHP_BUILD_VERSION=7.1
9+
PHP_TEST_VERSION=7.4
10+
11+
DB_ROOT_PASSWORD=
12+
DB_NAME=wordpress
13+
DB_USER_NAME=wordpress
14+
DB_USER_PASSWORD=H(EH0238fry2
15+
16+
WP_DOMAIN=plugin.myhost
17+
WP_TITLE="plugin Test"
18+
19+
ADMIN_USER=admin
20+
ADMIN_PASS=admin
21+
ADMIN_EMAIL=me@my.com
22+

.gitattributes

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
test export-ignore
2+
nbproject export-ignore
3+
.idea export-ignore
4+
.codeclimate.yml export-ignore
5+
.php_cs export-ignore
6+
phpcs.xml export-ignore
7+
phpcs.xml.dist export-ignore
8+
psalm.xml export-ignore
9+
psalm.xml.dist export-ignore
10+
.travis.yml export-ignore
11+
.gitattributes export-ignore
12+
.gitignore export-ignore
13+
composer.lock export-ignore
14+
phpunit.xml export-ignore
15+
phpunit.xml.dist export-ignore
16+
docker export-ignore

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/vendor/
2+
/build/
3+
/.idea/workspace.xml
4+
/.idea/codeStyles/
5+
/.idea/inspectionProfiles/
6+
/.idea/misc.xml

docker-compose.yml

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
version: '3.4'
2+
services:
3+
wp_dev:
4+
build:
5+
context: ./
6+
dockerfile: docker/Dockerfile_wp
7+
target: dev
8+
args:
9+
PHP_BUILD_VERSION: $PHP_BUILD_VERSION
10+
PHP_TEST_VERSION: $PHP_TEST_VERSION
11+
PROJECT_MOUNT_PATH: $PROJECT_MOUNT_PATH
12+
BUILD_ROOT_PATH: $BUILD_ROOT_PATH
13+
DOCROOT_PATH: $DOCROOT_PATH
14+
container_name: "${PROJECT_NAME}_wp_dev"
15+
depends_on:
16+
- db
17+
restart: unless-stopped
18+
environment:
19+
WORDPRESS_DB_HOST: db:3306
20+
WORDPRESS_DB_NAME: $DB_NAME
21+
WORDPRESS_DB_USER: $DB_USER_NAME
22+
WORDPRESS_DB_PASSWORD: $DB_USER_PASSWORD
23+
WORDPRESS_DEBUG: 1
24+
DOCROOT_PATH: ${DOCROOT_PATH}
25+
PLUGIN_NAME: ${PLUGIN_NAME}
26+
ADMIN_USER: ${ADMIN_USER}
27+
ADMIN_PASS: ${ADMIN_PASS}
28+
ADMIN_EMAIL: ${ADMIN_EMAIL}
29+
WP_DOMAIN: ${WP_DOMAIN}
30+
WP_TITLE: ${WP_TITLE}
31+
volumes:
32+
- wordpress:${DOCROOT_PATH}
33+
- ${BASE_PATH}:${PROJECT_MOUNT_PATH}
34+
ports:
35+
- 80:80
36+
37+
db:
38+
image: mariadb:latest
39+
container_name: "${PROJECT_NAME}_db"
40+
restart: unless-stopped
41+
environment:
42+
MYSQL_ROOT_PASSWORD: $DB_ROOT_PASSWORD
43+
MYSQL_DATABASE: $DB_NAME
44+
MYSQL_USER: $DB_USER_NAME
45+
MYSQL_PASSWORD: $DB_USER_PASSWORD
46+
ports:
47+
- 3306:3306
48+
volumes:
49+
- db:/var/lib/mysql
50+
51+
build:
52+
build:
53+
context: ./
54+
dockerfile: docker/Dockerfile_wp
55+
target: build
56+
args:
57+
PHP_BUILD_VERSION: $PHP_BUILD_VERSION
58+
BUILD_ROOT_PATH: $BUILD_ROOT_PATH
59+
container_name: "${PROJECT_NAME}_build"
60+
volumes:
61+
- ${BASE_PATH}:${BUILD_ROOT_PATH}
62+
63+
volumes:
64+
wordpress:
65+
db:

docker/Dockerfile_wp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
ARG PHP_BUILD_VERSION
2+
ARG PHP_TEST_VERSION
3+
4+
# Composer on correct PHP version
5+
FROM php:${PHP_BUILD_VERSION}-cli as build
6+
7+
ARG BUILD_ROOT_PATH
8+
9+
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
10+
RUN apt-get update
11+
RUN apt-get install -y zip unzip curl git
12+
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
13+
RUN php composer-setup.php --install-dir=/usr/bin --filename=composer
14+
RUN php -r "unlink('composer-setup.php');"
15+
16+
WORKDIR ${BUILD_ROOT_PATH}
17+
COPY . ./
18+
19+
20+
# Install PHP dev dependencies
21+
FROM build as vendor-dev
22+
23+
ARG BUILD_ROOT_PATH
24+
25+
WORKDIR ${BUILD_ROOT_PATH}
26+
RUN composer install
27+
28+
29+
# WordPress for development
30+
FROM wordpress:5-php${PHP_TEST_VERSION}-apache as dev
31+
32+
ARG PROJECT_MOUNT_PATH
33+
ARG BUILD_ROOT_PATH
34+
ARG DOCROOT_PATH
35+
ARG WP_DOMAIN
36+
37+
COPY docker/wp-entrypoint.sh /usr/local/bin
38+
COPY docker/wait-for-it.sh /usr/local/bin
39+
40+
RUN curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar \
41+
&& chmod +x wp-cli.phar \
42+
&& mv wp-cli.phar /usr/local/bin/wp
43+
RUN sed -i 's|#ServerName www.example.com|ServerName ${WP_DOMAIN}|' /etc/apache2/sites-available/*.conf
44+
45+
WORKDIR ${DOCROOT_PATH}
46+
COPY --from=vendor-dev ${BUILD_ROOT_PATH} ${PROJECT_MOUNT_PATH}
47+
48+
ENTRYPOINT ["wp-entrypoint.sh"]
49+
CMD ["apache2-foreground"]

docker/wait-for-it.sh

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
#!/usr/bin/env bash
2+
# Use this script to test if a given TCP host/port are available
3+
4+
WAITFORIT_cmdname=${0##*/}
5+
6+
echoerr() { if [[ $WAITFORIT_QUIET -ne 1 ]]; then echo "$@" 1>&2; fi }
7+
8+
usage()
9+
{
10+
cat << USAGE >&2
11+
Usage:
12+
$WAITFORIT_cmdname host:port [-s] [-t timeout] [-- command args]
13+
-h HOST | --host=HOST Host or IP under test
14+
-p PORT | --port=PORT TCP port under test
15+
Alternatively, you specify the host and port as host:port
16+
-s | --strict Only execute subcommand if the test succeeds
17+
-q | --quiet Don't output any status messages
18+
-t TIMEOUT | --timeout=TIMEOUT
19+
Timeout in seconds, zero for no timeout
20+
-- COMMAND ARGS Execute command with args after the test finishes
21+
USAGE
22+
exit 1
23+
}
24+
25+
wait_for()
26+
{
27+
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
28+
echoerr "$WAITFORIT_cmdname: waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
29+
else
30+
echoerr "$WAITFORIT_cmdname: waiting for $WAITFORIT_HOST:$WAITFORIT_PORT without a timeout"
31+
fi
32+
WAITFORIT_start_ts=$(date +%s)
33+
while :
34+
do
35+
if [[ $WAITFORIT_ISBUSY -eq 1 ]]; then
36+
nc -z $WAITFORIT_HOST $WAITFORIT_PORT
37+
WAITFORIT_result=$?
38+
else
39+
(echo > /dev/tcp/$WAITFORIT_HOST/$WAITFORIT_PORT) >/dev/null 2>&1
40+
WAITFORIT_result=$?
41+
fi
42+
if [[ $WAITFORIT_result -eq 0 ]]; then
43+
WAITFORIT_end_ts=$(date +%s)
44+
echoerr "$WAITFORIT_cmdname: $WAITFORIT_HOST:$WAITFORIT_PORT is available after $((WAITFORIT_end_ts - WAITFORIT_start_ts)) seconds"
45+
break
46+
fi
47+
sleep 1
48+
done
49+
return $WAITFORIT_result
50+
}
51+
52+
wait_for_wrapper()
53+
{
54+
# In order to support SIGINT during timeout: http://unix.stackexchange.com/a/57692
55+
if [[ $WAITFORIT_QUIET -eq 1 ]]; then
56+
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --quiet --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
57+
else
58+
timeout $WAITFORIT_BUSYTIMEFLAG $WAITFORIT_TIMEOUT $0 --child --host=$WAITFORIT_HOST --port=$WAITFORIT_PORT --timeout=$WAITFORIT_TIMEOUT &
59+
fi
60+
WAITFORIT_PID=$!
61+
trap "kill -INT -$WAITFORIT_PID" INT
62+
wait $WAITFORIT_PID
63+
WAITFORIT_RESULT=$?
64+
if [[ $WAITFORIT_RESULT -ne 0 ]]; then
65+
echoerr "$WAITFORIT_cmdname: timeout occurred after waiting $WAITFORIT_TIMEOUT seconds for $WAITFORIT_HOST:$WAITFORIT_PORT"
66+
fi
67+
return $WAITFORIT_RESULT
68+
}
69+
70+
# process arguments
71+
while [[ $# -gt 0 ]]
72+
do
73+
case "$1" in
74+
*:* )
75+
WAITFORIT_hostport=(${1//:/ })
76+
WAITFORIT_HOST=${WAITFORIT_hostport[0]}
77+
WAITFORIT_PORT=${WAITFORIT_hostport[1]}
78+
shift 1
79+
;;
80+
--child)
81+
WAITFORIT_CHILD=1
82+
shift 1
83+
;;
84+
-q | --quiet)
85+
WAITFORIT_QUIET=1
86+
shift 1
87+
;;
88+
-s | --strict)
89+
WAITFORIT_STRICT=1
90+
shift 1
91+
;;
92+
-h)
93+
WAITFORIT_HOST="$2"
94+
if [[ $WAITFORIT_HOST == "" ]]; then break; fi
95+
shift 2
96+
;;
97+
--host=*)
98+
WAITFORIT_HOST="${1#*=}"
99+
shift 1
100+
;;
101+
-p)
102+
WAITFORIT_PORT="$2"
103+
if [[ $WAITFORIT_PORT == "" ]]; then break; fi
104+
shift 2
105+
;;
106+
--port=*)
107+
WAITFORIT_PORT="${1#*=}"
108+
shift 1
109+
;;
110+
-t)
111+
WAITFORIT_TIMEOUT="$2"
112+
if [[ $WAITFORIT_TIMEOUT == "" ]]; then break; fi
113+
shift 2
114+
;;
115+
--timeout=*)
116+
WAITFORIT_TIMEOUT="${1#*=}"
117+
shift 1
118+
;;
119+
--)
120+
shift
121+
WAITFORIT_CLI=("$@")
122+
break
123+
;;
124+
--help)
125+
usage
126+
;;
127+
*)
128+
echoerr "Unknown argument: $1"
129+
usage
130+
;;
131+
esac
132+
done
133+
134+
if [[ "$WAITFORIT_HOST" == "" || "$WAITFORIT_PORT" == "" ]]; then
135+
echoerr "Error: you need to provide a host and port to test."
136+
usage
137+
fi
138+
139+
WAITFORIT_TIMEOUT=${WAITFORIT_TIMEOUT:-15}
140+
WAITFORIT_STRICT=${WAITFORIT_STRICT:-0}
141+
WAITFORIT_CHILD=${WAITFORIT_CHILD:-0}
142+
WAITFORIT_QUIET=${WAITFORIT_QUIET:-0}
143+
144+
# Check to see if timeout is from busybox?
145+
WAITFORIT_TIMEOUT_PATH=$(type -p timeout)
146+
WAITFORIT_TIMEOUT_PATH=$(realpath $WAITFORIT_TIMEOUT_PATH 2>/dev/null || readlink -f $WAITFORIT_TIMEOUT_PATH)
147+
148+
WAITFORIT_BUSYTIMEFLAG=""
149+
if [[ $WAITFORIT_TIMEOUT_PATH =~ "busybox" ]]; then
150+
WAITFORIT_ISBUSY=1
151+
# Check if busybox timeout uses -t flag
152+
# (recent Alpine versions don't support -t anymore)
153+
if timeout &>/dev/stdout | grep -q -e '-t '; then
154+
WAITFORIT_BUSYTIMEFLAG="-t"
155+
fi
156+
else
157+
WAITFORIT_ISBUSY=0
158+
fi
159+
160+
if [[ $WAITFORIT_CHILD -gt 0 ]]; then
161+
wait_for
162+
WAITFORIT_RESULT=$?
163+
exit $WAITFORIT_RESULT
164+
else
165+
if [[ $WAITFORIT_TIMEOUT -gt 0 ]]; then
166+
wait_for_wrapper
167+
WAITFORIT_RESULT=$?
168+
else
169+
wait_for
170+
WAITFORIT_RESULT=$?
171+
fi
172+
fi
173+
174+
if [[ $WAITFORIT_CLI != "" ]]; then
175+
if [[ $WAITFORIT_RESULT -ne 0 && $WAITFORIT_STRICT -eq 1 ]]; then
176+
echoerr "$WAITFORIT_cmdname: strict mode, refusing to execute subprocess"
177+
exit $WAITFORIT_RESULT
178+
fi
179+
exec "${WAITFORIT_CLI[@]}"
180+
else
181+
exit $WAITFORIT_RESULT
182+
fi

docker/wp-entrypoint.sh

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#!/bin/bash -xv
2+
set -e
3+
4+
if wait-for-it.sh "${WORDPRESS_DB_HOST}" -t 60; then
5+
docker-entrypoint.sh apache2 -v
6+
wp core install \
7+
--allow-root \
8+
--title="${WP_TITLE}" \
9+
--admin_user="${ADMIN_USER}" \
10+
--admin_password="${ADMIN_PASS}" \
11+
--url="${WP_DOMAIN}" \
12+
--admin_email="${ADMIN_EMAIL}" \
13+
--skip-email
14+
wp plugin is-installed akismet --allow-root && wp plugin uninstall akismet --allow-root --path="${DOCROOT_PATH}"
15+
wp plugin is-installed hello --allow-root && wp plugin uninstall hello --allow-root --path="${DOCROOT_PATH}"
16+
wp plugin activate "${PLUGIN_NAME}" --allow-root --path="${DOCROOT_PATH}"
17+
fi
18+
19+
exec "$@"

0 commit comments

Comments
 (0)