-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathentrypoint.sh
executable file
·161 lines (141 loc) · 4.19 KB
/
entrypoint.sh
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
#!/bin/bash -l
set -e
# Validate the required environment variables
validate() {
: ${SERVER_TYPE:?"SERVER_TYPE variable missing from environment variables."}
: ${SSH_PRIVATE_KEY:?"SSH_PRIVATE_KEY variable missing from environment variables."}
: ${SERVER_ID:?"SERVER_ID variable missing from environment variables."}
REMOTE_PATH="${REMOTE_PATH:-""}"
SRC_PATH="${SRC_PATH:-"."}"
FLAGS="${FLAGS:-"-azvrhi --inplace --exclude='.*'"}"
PHP_LINT="${PHP_LINT:-"false"}"
CACHE_CLEAR="${CACHE_CLEAR:-"false"}"
SCRIPT="${SCRIPT:-""}"
}
# Set up environment variables
init() {
case "${SERVER_TYPE^^}" in
PRESSABLE)
SSH_HOST="ssh.pressable.com"
SERVER_BASE_PATH="~/htdocs"
;;
WPENGINE)
SSH_HOST="${SERVER_ID}.ssh.wpengine.net"
SERVER_BASE_PATH="sites/${SERVER_ID}"
;;
*)
echo "❌ Unknown SERVER_TYPE: ${SERVER_TYPE}"
exit 1
;;
esac
SSH_USER="${SERVER_ID}@${SSH_HOST}"
SERVER_DEST="${SSH_USER}:${SERVER_BASE_PATH}/${REMOTE_PATH}"
parse_flags "$FLAGS"
print_info
setup_ssh
check_lint
}
# Print deployment info
print_info() {
echo "--- DEPLOYMENT INFO ---"
echo "* Deploying to: ${SERVER_TYPE}"
echo "* Server ID: ${SERVER_ID}"
echo "* Source path: ${SRC_PATH}"
echo "* Destination path: ${SERVER_DEST}"
echo "* Flags: ${FLAGS_ARRAY[@]}"
echo "* PHP linting: ${PHP_LINT}"
echo "* Cache clear: ${CACHE_CLEAR}"
echo "* Post-deploy script: ${SCRIPT}"
echo "-----------------------"
}
# Parse flags into an array
parse_flags() {
local flags="$1"
FLAGS_ARRAY=()
while IFS= read -r -d '' flag; do FLAGS_ARRAY+=("$flag"); done < <(echo "$flags" | xargs printf '%s\0')
}
# Set up SSH keys based on the provided private key
setup_ssh() {
echo "Setting SSH path..."
SSH_PATH="${HOME}/.ssh"
if [ ! -d "${HOME}/.ssh" ]; then
mkdir "${HOME}/.ssh"
mkdir "${SSH_PATH}/ctl/"
chmod -R 700 "$SSH_PATH"
fi
SSH_KEY_PATH="${SSH_PATH}/deploy_key"
umask 077
echo "${SSH_PRIVATE_KEY}" >"${SSH_KEY_PATH}"
chmod 600 "${SSH_KEY_PATH}"
KNOWN_HOSTS_PATH="${SSH_PATH}/known_hosts"
ssh-keyscan -t rsa "${SSH_HOST}" >>"${KNOWN_HOSTS_PATH}"
chmod 644 "${KNOWN_HOSTS_PATH}"
}
# Check PHP linting
check_lint() {
if [ "${PHP_LINT^^}" == "TRUE" ]; then
echo "Starting PHP linting..."
find "${SRC_PATH}" -name "*.php" -type f -print0 | while IFS= read -r -d '' file; do
php -l "$file"
status=$?
if [ $status -ne 0 ]; then
echo "FAILURE: Linting failed - $file"
exit 1
fi
done
echo "PHP linting completed successfully."
else
echo "Skipping PHP linting."
fi
}
# Sync files to the server using rsync and execute post-deploy script
sync_files() {
SSH_SETTINGS="-v -p 22 -i ${SSH_KEY_PATH} -o StrictHostKeyChecking=no -o ControlPath='${SSH_PATH}/ctl/%C'"
#create multiplex connection
ssh -nNf ${SSH_SETTINGS} -o ControlMaster=yes "${SSH_USER}"
echo "Multiplex SSH connection established."
# Sync files to Server
set -x
rsync --rsh="ssh ${SSH_SETTINGS}" \
"${FLAGS_ARRAY[@]}" --chmod=D775,F664 \
"${SRC_PATH}/" "${SERVER_DEST}"
set +x
check_script
check_cache
# Execute post-deploy script
ssh ${SSH_SETTINGS} "${SSH_USER}" "${SCRIPT_COMMAND} ${CACHE_COMMAND}"
# Close SSH multiplex connection
ssh -O exit -o ControlPath="${SSH_PATH}/ctl/%C" "${SSH_USER}"
echo "✅ Site has been deployed!"
}
# Check if post-deploy script exists and set permissions
check_script() {
if [ -n "${SCRIPT}" ]; then
SCRIPT_PATH="${SERVER_BASE_PATH}/${REMOTE_PATH}/${SCRIPT}"
SCRIPT_COMMAND="bash ${SCRIPT_PATH}"
echo "Script command: " ${SCRIPT_COMMAND}
# Set permissions
ssh ${SSH_SETTINGS} "${SSH_USER}" "chmod +x ${SCRIPT_PATH}"
# Does file exist?
ssh ${SSH_SETTINGS} "${SSH_USER}" "if [ -f ${SCRIPT_PATH} ]; then echo 'Script file found'; else echo 'Script file not found'; fi"
fi
}
# Check cache clearing command
check_cache() {
if [ "${CACHE_CLEAR^^}" == "TRUE" ]; then
if [ "${SERVER_TYPE^^}" == "PRESSABLE" ]; then
CACHE_COMMAND="&& wp --skip-plugins --skip-themes cache flush"
elif [ "${SERVER_TYPE^^}" == "WPENGINE" ]; then
CACHE_COMMAND="&& wp --skip-plugins --skip-themes page-cache flush && wp --skip-plugins --skip-themes cdn-cache flush"
else
CACHE_COMMAND=""
fi
echo "Cache command: " ${CACHE_COMMAND}
else
CACHE_COMMAND=""
fi
}
# Main execution
validate
init
sync_files