@@ -55,25 +55,49 @@ jobs:
5555 WEBSITE_SSH_PORT : ${{ secrets.WEBSITE_SSH_PORT || '22' }}
5656 WEBSITE_SSH_USER : ${{ secrets.WEBSITE_SSH_USER }}
5757 WEBSITE_DEPLOY_PATH : ${{ secrets.WEBSITE_DEPLOY_PATH }}
58+ WEBSITE_RSYNC_USE_SUDO : ${{ secrets.WEBSITE_RSYNC_USE_SUDO || 'false' }}
5859 run : |
5960 set -euo pipefail
6061
61- for variable in WEBSITE_SSH_HOST WEBSITE_SSH_PORT WEBSITE_SSH_USER WEBSITE_DEPLOY_PATH; do
62+ for variable in WEBSITE_SSH_HOST WEBSITE_SSH_PORT WEBSITE_SSH_USER WEBSITE_DEPLOY_PATH WEBSITE_RSYNC_USE_SUDO ; do
6263 if [ -z "${!variable}" ]; then
6364 echo "Missing ${variable} secret" >&2
6465 exit 1
6566 fi
6667 done
6768
68- ssh -i ~/.ssh/deploy_key \
69- -p "${WEBSITE_SSH_PORT}" \
70- -o IdentitiesOnly=yes \
71- -o StrictHostKeyChecking=yes \
72- "${WEBSITE_SSH_USER}@${WEBSITE_SSH_HOST}" \
73- "mkdir -p '${WEBSITE_DEPLOY_PATH}'"
69+ if [ "${WEBSITE_RSYNC_USE_SUDO}" != "true" ] && [ "${WEBSITE_RSYNC_USE_SUDO}" != "false" ]; then
70+ echo "WEBSITE_RSYNC_USE_SUDO must be either 'true' or 'false'" >&2
71+ exit 1
72+ fi
73+
74+ remote_path="$(printf '%q' "${WEBSITE_DEPLOY_PATH}")"
75+ ssh_options=(
76+ -i ~/.ssh/deploy_key
77+ -p "${WEBSITE_SSH_PORT}"
78+ -o IdentitiesOnly=yes
79+ -o StrictHostKeyChecking=yes
80+ )
81+ rsync_options=(
82+ -az
83+ --delete
84+ --itemize-changes
85+ --chmod=Du=rwx,Dgo=rx,Fu=rw,Fgo=r
86+ -e "ssh -i ~/.ssh/deploy_key -p ${WEBSITE_SSH_PORT} -o IdentitiesOnly=yes -o StrictHostKeyChecking=yes"
87+ )
88+
89+ if [ "${WEBSITE_RSYNC_USE_SUDO}" = "true" ]; then
90+ ssh "${ssh_options[@]}" "${WEBSITE_SSH_USER}@${WEBSITE_SSH_HOST}" "sudo mkdir -p ${remote_path}"
91+ rsync_options+=(--rsync-path="sudo rsync")
92+ else
93+ ssh "${ssh_options[@]}" "${WEBSITE_SSH_USER}@${WEBSITE_SSH_HOST}" "mkdir -p ${remote_path}"
94+ ssh "${ssh_options[@]}" "${WEBSITE_SSH_USER}@${WEBSITE_SSH_HOST}" "test -w ${remote_path}" || {
95+ echo "Deploy path is not writable by ${WEBSITE_SSH_USER}: ${WEBSITE_DEPLOY_PATH}" >&2
96+ echo "Fix by chowning the deploy path to ${WEBSITE_SSH_USER}, or set WEBSITE_RSYNC_USE_SUDO=true and allow passwordless sudo for rsync/mkdir." >&2
97+ exit 1
98+ }
99+ fi
74100
75- rsync -az --delete \
76- --chmod=Du=rwx,Dgo=rx,Fu=rw,Fgo=r \
77- -e "ssh -i ~/.ssh/deploy_key -p ${WEBSITE_SSH_PORT} -o IdentitiesOnly=yes -o StrictHostKeyChecking=yes" \
101+ rsync "${rsync_options[@]}" \
78102 website/ \
79103 "${WEBSITE_SSH_USER}@${WEBSITE_SSH_HOST}:${WEBSITE_DEPLOY_PATH}/"
0 commit comments