├── .editorconfig ├── .gitignore ├── README.md ├── bin ├── db-pull.sh ├── db-push.sh ├── pull.sh ├── push.sh └── variables.sh ├── config-sample.json ├── pull.sh └── push.sh /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | 14 | [*.{json, yml}] 15 | indent_size = 2 16 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | config.json 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # bash-wp-deploy 2 | 3 | **REQUIRED**: SSH, rsync, WP-CLI, jq 4 | 5 | ## Get started 6 | ### Install WP-CLI and jq (for OSX) 7 | ``` 8 | $ brew install wp-cli jq 9 | ``` 10 | 11 | ### Downloads bash-wp-deploy and Creates config 12 | ``` 13 | $ git clone https://github.com/inc2734/bash-wp-deploy.git 14 | $ cd bash-wp-deploy 15 | $ cp config-sample.json config.json 16 | $ vi config.json 17 | ``` 18 | 19 | ## Downloads 20 | ### All files and database 21 | ``` 22 | $ ./pull.sh -e production -a 23 | ``` 24 | 25 | ### WordPress Core 26 | ``` 27 | $ ./pull.sh -e production -w 28 | ``` 29 | 30 | ### The themes directory 31 | ``` 32 | $ ./pull.sh -e production -t 33 | ``` 34 | 35 | ### The plugins directory 36 | ``` 37 | $ ./pull.sh -e production -p 38 | ``` 39 | 40 | ### The uplaods directory 41 | ``` 42 | $ ./pull.sh -e production -u 43 | ``` 44 | 45 | ### Database 46 | ``` 47 | $ ./pull.sh -e production -d 48 | ``` 49 | 50 | ## Uploads 51 | ### All files and database 52 | ``` 53 | $ ./push.sh -e production -a 54 | ``` 55 | 56 | ### WordPress Core 57 | ``` 58 | $ ./push.sh -e production -w 59 | ``` 60 | 61 | ### The themes directory 62 | ``` 63 | $ ./push.sh -e production -t 64 | ``` 65 | 66 | ### The plugins directory 67 | ``` 68 | $ ./push.sh -e production -p 69 | ``` 70 | 71 | ### The uplaods directory 72 | ``` 73 | $ ./push.sh -e production -u 74 | ``` 75 | 76 | ### Database 77 | ``` 78 | $ ./push.sh -e production -d 79 | ``` 80 | 81 | ## Config file 82 | ``` 83 | $ ./pull.sh -e production -f any_config.json -a 84 | ``` 85 | 86 | ### Local environment name 87 | ``` 88 | $ ./pull.sh -e production -l local_name 89 | ``` 90 | -------------------------------------------------------------------------------- /bin/db-pull.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e; 4 | 5 | ENVIRONMENT=${1} 6 | shift 7 | CONFIG_PATH=${1} 8 | shift 9 | LOCAL=${1} 10 | shift 11 | 12 | ROOT=$(cd $(dirname $0)/../ && pwd) 13 | . ${ROOT}/bin/variables.sh 14 | 15 | cd ${LOCAL_SERVER_PATH} 16 | 17 | echo "===== Check wp-config.php =====" 18 | wp config path || wp config create --dbname=${LOCAL_DB_NAME} --dbuser=${LOCAL_DB_USER} --dbpass=${LOCAL_DB_PASSWORD} --dbhost=${LOCAL_DB_HOST} --dbcharset=${DB_CHARSET} 19 | 20 | echo "===== Exporting local database ==========" 21 | wp db export local.sql 22 | echo $(ls -la local.sql) 23 | 24 | echo "===== Exporting remote database =====" 25 | if [ -n "${SSH_CONFIG}" ]; then 26 | ssh ${SSH_CONFIG} "mysqldump --host=${DB_HOST} --user=${DB_USER} --password=\"${DB_PASSWORD}\" --default-character-set=${DB_CHARSET} --no-tablespaces ${DB_NAME}" > remote.sql 27 | else 28 | ssh ${SSH_USER}@${SSH_HOST} -p ${SSH_PORT} "mysqldump --host=${DB_HOST} --user=${DB_USER} --password=\"${DB_PASSWORD}\" --default-character-set=${DB_CHARSET} --no-tablespaces ${DB_NAME}" > remote.sql 29 | fi 30 | echo $(ls -la remote.sql) 31 | 32 | echo "===== Importing to local database from remote database =====" 33 | wp db check || wp db create 34 | wp db import remote.sql 35 | wp search-replace ${SERVER_URL} ${LOCAL_SERVER_URL} --url=${SERVER_NAME} --network > /dev/null 36 | wp search-replace ${SERVER_NAME} ${LOCAL_SERVER_NAME} --url=${SERVER_NAME} --network > /dev/null 37 | -------------------------------------------------------------------------------- /bin/db-push.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e; 4 | 5 | ENVIRONMENT=${1} 6 | shift 7 | CONFIG_PATH=${1} 8 | shift 9 | LOCAL=${1} 10 | shift 11 | 12 | ROOT=$(cd $(dirname $0)/../ && pwd) 13 | . ${ROOT}/bin/variables.sh 14 | 15 | cd ${LOCAL_SERVER_PATH} 16 | 17 | echo "===== Exporting remote database =====" 18 | if [ -n "${SSH_CONFIG}" ]; then 19 | ssh ${SSH_CONFIG} "mysqldump --host=${DB_HOST} --user=${DB_USER} --password=\"${DB_PASSWORD}\" --default-character-set=${DB_CHARSET} --no-tablespaces ${DB_NAME}" > remote.sql 20 | else 21 | ssh ${SSH_USER}@${SSH_HOST} -p ${SSH_PORT} "mysqldump --host=${DB_HOST} --user=${DB_USER} --password=\"${DB_PASSWORD}\" --default-character-set=${DB_CHARSET} --no-tablespaces ${DB_NAME}" > remote.sql 22 | fi 23 | echo $(ls -la remote.sql) 24 | 25 | echo "===== Exporting local database ==========" 26 | wp db export local.sql 27 | wp search-replace ${LOCAL_SERVER_URL} ${SERVER_URL} --url=${LOCAL_SERVER_NAME} --network > /dev/null 28 | wp search-replace ${LOCAL_SERVER_NAME} ${SERVER_NAME} --url=${LOCAL_SERVER_NAME} --network > /dev/null 29 | wp db export for-remote.sql 30 | echo $(ls -la for-remote.sql) 31 | wp db import local.sql 32 | 33 | echo "===== Importing to remote database from local database ==========" 34 | if [ -n "${SSH_CONFIG}" ]; then 35 | ssh ${SSH_CONFIG} "mysql --host=${DB_HOST} --user=${DB_USER} --password=\"${DB_PASSWORD}\" --default-character-set=${DB_CHARSET} ${DB_NAME}" < for-remote.sql 36 | else 37 | ssh ${SSH_USER}@${SSH_HOST} -p ${SSH_PORT} "mysql --host=${DB_HOST} --user=${DB_USER} --password=\"${DB_PASSWORD}\" --default-character-set=${DB_CHARSET} ${DB_NAME}" < for-remote.sql 38 | fi 39 | -------------------------------------------------------------------------------- /bin/pull.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e; 4 | 5 | ENVIRONMENT=${1} 6 | shift 7 | CONFIG_PATH=${1} 8 | shift 9 | LOCAL=${1} 10 | shift 11 | DIR=${1} 12 | shift 13 | 14 | ROOT=$(cd $(dirname $0)/../ && pwd) 15 | . ${ROOT}/bin/variables.sh 16 | 17 | _EXCLUDES=${@} 18 | IGNORE=$(cat ${CONFIG_PATH} | jq -r ".ignore[]") 19 | _EXCLUDES+=(${IGNORE}) 20 | 21 | EXCLUDES=; 22 | for i in ${_EXCLUDES[@]} 23 | do 24 | EXCLUDES+="--exclude=${i} " 25 | done 26 | 27 | if [ -n "${SSH_CONFIG}" ]; then 28 | rsync -rlptvz --delete ${EXCLUDES} ${SSH_CONFIG}:${SERVER_PATH}${DIR} ${LOCAL_SERVER_PATH}${DIR} 29 | else 30 | rsync -e "ssh -p ${SSH_PORT}" -rlptvz --delete ${EXCLUDES} ${SSH_USER}@${SSH_HOST}:${SERVER_PATH}${DIR} ${LOCAL_SERVER_PATH}${DIR} 31 | fi 32 | -------------------------------------------------------------------------------- /bin/push.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e; 4 | 5 | ENVIRONMENT=${1} 6 | shift 7 | CONFIG_PATH=${1} 8 | shift 9 | LOCAL=${1} 10 | shift 11 | DIR=${1} 12 | shift 13 | 14 | ROOT=$(cd $(dirname $0)/../ && pwd) 15 | . ${ROOT}/bin/variables.sh 16 | 17 | _EXCLUDES=${@} 18 | IGNORE=$(cat ${CONFIG_PATH} | jq -r ".ignore[]") 19 | _EXCLUDES+=(${IGNORE}) 20 | 21 | EXCLUDES=; 22 | for i in ${_EXCLUDES[@]} 23 | do 24 | EXCLUDES+="--exclude=${i} " 25 | done 26 | 27 | if [ -n "${SSH_CONFIG}" ]; then 28 | rsync -rlptvz --delete ${EXCLUDES} ${LOCAL_SERVER_PATH}${DIR} ${SSH_CONFIG}:${SERVER_PATH}${DIR} 29 | else 30 | rsync -e "ssh -p ${SSH_PORT}" -rlptvz --delete ${EXCLUDES} ${LOCAL_SERVER_PATH}${DIR} ${SSH_USER}@${SSH_HOST}:${SERVER_PATH}${DIR} 31 | fi 32 | -------------------------------------------------------------------------------- /bin/variables.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e; 4 | 5 | # Encoding 6 | DB_CHARSET=$(cat ${CONFIG_PATH} | jq -r ".db_charset") 7 | if [ "${DB_CHARSET}" = "null" ]; then 8 | DB_CHARSET="utf8" 9 | fi 10 | 11 | # Remote 12 | DB_HOST=$(cat ${CONFIG_PATH} | jq -r ".${ENVIRONMENT}.mysql.host") 13 | DB_NAME=$(cat ${CONFIG_PATH} | jq -r ".${ENVIRONMENT}.mysql.name") 14 | DB_USER=$(cat ${CONFIG_PATH} | jq -r ".${ENVIRONMENT}.mysql.user") 15 | DB_PASSWORD=$(cat ${CONFIG_PATH} | jq -r ".${ENVIRONMENT}.mysql.password") 16 | 17 | SSH_USER=$(cat ${CONFIG_PATH} | jq -r ".${ENVIRONMENT}.ssh.user") 18 | SSH_HOST=$(cat ${CONFIG_PATH} | jq -r ".${ENVIRONMENT}.ssh.host") 19 | SSH_PORT=$(cat ${CONFIG_PATH} | jq -r ".${ENVIRONMENT}.ssh.port") 20 | SSH_CONFIG=$(cat ${CONFIG_PATH} | jq -r ".${ENVIRONMENT}.ssh.config") 21 | 22 | SERVER_PATH=$(cat ${CONFIG_PATH} | jq -r ".${ENVIRONMENT}.server.path") 23 | SERVER_HOST=$(cat ${CONFIG_PATH} | jq -r ".${ENVIRONMENT}.server.host") 24 | SERVER_PORT=$(cat ${CONFIG_PATH} | jq -r ".${ENVIRONMENT}.server.port") 25 | SERVER_PROTOCOL=$(cat ${CONFIG_PATH} | jq -r ".${ENVIRONMENT}.server.protocol") 26 | SERVER_URL="${SERVER_PROTOCOL}://${SERVER_HOST}" 27 | if [ -n "${SERVER_PORT}" ]; then 28 | SERVER_URL="${SERVER_URL}:${SERVER_PORT}" 29 | fi 30 | SERVER_NAME=${SERVER_HOST} 31 | if [ -n "${SERVER_PORT}" ]; then 32 | SERVER_NAME="${SERVER_HOST}:${SERVER_PORT}" 33 | fi 34 | 35 | # Local 36 | LOCAL_DB_HOST=$(cat ${CONFIG_PATH} | jq -r ".${LOCAL}.mysql.host") 37 | LOCAL_DB_NAME=$(cat ${CONFIG_PATH} | jq -r ".${LOCAL}.mysql.name") 38 | LOCAL_DB_USER=$(cat ${CONFIG_PATH} | jq -r ".${LOCAL}.mysql.user") 39 | LOCAL_DB_PASSWORD=$(cat ${CONFIG_PATH} | jq -r ".${LOCAL}.mysql.password") 40 | 41 | LOCAL_SERVER_PATH=$(cat ${CONFIG_PATH} | jq -r ".${LOCAL}.server.path") 42 | LOCAL_SERVER_HOST=$(cat ${CONFIG_PATH} | jq -r ".${LOCAL}.server.host") 43 | LOCAL_SERVER_PORT=$(cat ${CONFIG_PATH} | jq -r ".${LOCAL}.server.port") 44 | LOCAL_SERVER_PROTOCOL=$(cat ${CONFIG_PATH} | jq -r ".${LOCAL}.server.protocol") 45 | LOCAL_SERVER_URL="${LOCAL_SERVER_PROTOCOL}://${LOCAL_SERVER_HOST}" 46 | if [ -n "${LOCAL_SERVER_PORT}" ]; then 47 | LOCAL_SERVER_URL="${LOCAL_SERVER_URL}:${LOCAL_SERVER_PORT}" 48 | fi 49 | LOCAL_SERVER_NAME=${LOCAL_SERVER_HOST} 50 | if [ -n "${LOCAL_SERVER_PORT}" ]; then 51 | LOCAL_SERVER_NAME="${LOCAL_SERVER_HOST}:${LOCAL_SERVER_PORT}" 52 | fi 53 | -------------------------------------------------------------------------------- /config-sample.json: -------------------------------------------------------------------------------- 1 | { 2 | "db_charset": "utf8", 3 | "production": { 4 | "mysql": { 5 | "host": "localhost", 6 | "name": "", 7 | "user": "", 8 | "password": "" 9 | }, 10 | "server": { 11 | "path": "/var/www/html", 12 | "host": "example.com", 13 | "port": "", 14 | "protocol": "http" 15 | }, 16 | "ssh": { 17 | "user": "user", 18 | "host": "example.com", 19 | "port": "22", 20 | "config": "" 21 | } 22 | }, 23 | "local": { 24 | "mysql": { 25 | "host": "localhost", 26 | "name": "wp", 27 | "user": "root", 28 | "password": "" 29 | }, 30 | "server": { 31 | "path": "/Users/inc/htdocs/2inc.dev/www", 32 | "host": "127.0.0.1", 33 | "port": "8080", 34 | "protocol": "http" 35 | } 36 | }, 37 | "ignore": [ 38 | ".git/", 39 | ".gitignore", 40 | ".sass-cache/", 41 | "wp-config.php", 42 | "node_modules/", 43 | ".DS_Store", 44 | "*.sql", 45 | ".ht*", 46 | "*.log" 47 | ] 48 | } 49 | -------------------------------------------------------------------------------- /pull.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e; 4 | 5 | ROOT=$(cd $(dirname $0) && pwd) 6 | 7 | if [ ! -e "`which jq`" ]; then 8 | echo "jq is not installed" 9 | exit 0; 10 | fi 11 | 12 | if [ ! -e "`which wp`" ]; then 13 | echo "WP-CLI is not installed" 14 | exit 0; 15 | fi 16 | 17 | while getopts awdtpue:f:l: opt 18 | do 19 | case $opt in 20 | a) a=1 21 | ;; 22 | w) w=1 23 | ;; 24 | d) d=1 25 | ;; 26 | t) t=1 27 | ;; 28 | p) p=1 29 | ;; 30 | u) u=1 31 | ;; 32 | e) e=1 33 | ENVIRONMENT=$OPTARG 34 | ;; 35 | f) f=1 36 | CONFIG_FILE=$OPTARG 37 | ;; 38 | l) l=1 39 | LOCAL=$OPTARG 40 | ;; 41 | esac 42 | done 43 | 44 | if [ "$f" = 1 ]; then 45 | CONFIG_PATH=${CONFIG_FILE} 46 | else 47 | CONFIG_PATH=${ROOT}/config.json 48 | fi 49 | if [ ! -e ${CONFIG_PATH} ]; then 50 | echo "config.json is not found" 51 | exit 0; 52 | fi 53 | 54 | if [ ! -n "${ENVIRONMENT}" ]; then 55 | echo "Please specify -e option" 56 | exit 0; 57 | fi 58 | 59 | if [ "$l" != 1 ]; then 60 | LOCAL=local 61 | fi 62 | 63 | if [ $(cat ${CONFIG_PATH} | jq ".${LOCAL} | length") -eq 0 ]; then 64 | echo "'${LOCAL}' configuration is not found" 65 | exit 0; 66 | fi 67 | 68 | . ${ROOT}/bin/variables.sh 69 | 70 | MYSQLADMIN_PING="mysqladmin ping -u ${LOCAL_DB_USER}"; 71 | if [ -n "${LOCAL_DB_PASSWORD}" ]; then 72 | MYSQLADMIN_PING+=" -p${LOCAL_DB_PASSWORD}" 73 | fi 74 | 75 | if [ ! -e "`which mysqladmin`" ] || [ "`${MYSQLADMIN_PING}`" != "mysqld is alive" ]; then 76 | echo "MySQL not started." 77 | exit 0 78 | fi 79 | 80 | if [ "$a" = 1 ] ; then 81 | bash ${ROOT}/bin/pull.sh ${ENVIRONMENT} ${CONFIG_PATH} ${LOCAL} / 82 | bash ${ROOT}/bin/db-pull.sh ${ENVIRONMENT} ${CONFIG_PATH} ${LOCAL} 83 | fi 84 | 85 | if [ "${w}" = 1 ] ; then 86 | echo "===== Downloading WordPress Core =====" 87 | EXCLUDES=(wp-content) 88 | bash ${ROOT}/bin/pull.sh ${ENVIRONMENT} ${CONFIG_PATH} ${LOCAL} / ${EXCLUDES} 89 | fi 90 | 91 | if [ "${d}" = 1 ] ; then 92 | bash ${ROOT}/bin/db-pull.sh ${ENVIRONMENT} ${CONFIG_PATH} ${LOCAL} 93 | fi 94 | 95 | if [ "${t}" = 1 ] ; then 96 | echo "===== Downloading themes =====" 97 | bash ${ROOT}/bin/pull.sh ${ENVIRONMENT} ${CONFIG_PATH} ${LOCAL} /wp-content/themes/ 98 | fi 99 | 100 | if [ "${p}" = 1 ] ; then 101 | echo "===== Downloading plugins =====" 102 | bash ${ROOT}/bin/pull.sh ${ENVIRONMENT} ${CONFIG_PATH} ${LOCAL} /wp-content/plugins/ 103 | fi 104 | 105 | if [ "${u}" = 1 ] ; then 106 | echo "===== Downloading uploads =====" 107 | bash ${ROOT}/bin/pull.sh ${ENVIRONMENT} ${CONFIG_PATH} ${LOCAL} /wp-content/uploads/ 108 | fi 109 | -------------------------------------------------------------------------------- /push.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | set -e; 4 | 5 | ROOT=$(cd $(dirname $0) && pwd) 6 | 7 | if [ ! -e "`which jq`" ]; then 8 | echo "jq is not installed" 9 | exit 0; 10 | fi 11 | 12 | if [ ! -e "`which wp`" ]; then 13 | echo "WP-CLI is not installed" 14 | exit 0; 15 | fi 16 | 17 | while getopts awdtpue:f:l: opt 18 | do 19 | case $opt in 20 | a) a=1 21 | ;; 22 | w) w=1 23 | ;; 24 | d) d=1 25 | ;; 26 | t) t=1 27 | ;; 28 | p) p=1 29 | ;; 30 | u) u=1 31 | ;; 32 | e) e=1 33 | ENVIRONMENT=$OPTARG 34 | ;; 35 | f) f=1 36 | CONFIG_FILE=$OPTARG 37 | ;; 38 | l) l=1 39 | LOCAL=$OPTARG 40 | ;; 41 | esac 42 | done 43 | 44 | if [ "$f" = 1 ]; then 45 | CONFIG_PATH=${CONFIG_FILE} 46 | else 47 | CONFIG_PATH=${ROOT}/config.json 48 | fi 49 | if [ ! -e ${CONFIG_PATH} ]; then 50 | echo "config.json is not found" 51 | exit 0; 52 | fi 53 | 54 | if [ ! -n "${ENVIRONMENT}" ]; then 55 | echo "Please specify -e option" 56 | exit 0; 57 | fi 58 | 59 | if [ "$l" != 1 ]; then 60 | LOCAL=local 61 | fi 62 | 63 | if [ $(cat ${CONFIG_PATH} | jq ".${LOCAL} | length") -eq 0 ]; then 64 | echo "'${LOCAL}' configuration is not found" 65 | exit 0; 66 | fi 67 | 68 | . ${ROOT}/bin/variables.sh 69 | 70 | MYSQLADMIN_PING="mysqladmin ping -u ${LOCAL_DB_USER}"; 71 | if [ -n "${LOCAL_DB_PASSWORD}" ]; then 72 | MYSQLADMIN_PING+=" -p${LOCAL_DB_PASSWORD}" 73 | fi 74 | 75 | if [ ! -e "`which mysqladmin`" ] || [ "`${MYSQLADMIN_PING}`" != "mysqld is alive" ]; then 76 | echo "MySQL not started." 77 | exit 0 78 | fi 79 | 80 | if [ "$a" = 1 ] ; then 81 | bash ${ROOT}/bin/push.sh ${ENVIRONMENT} ${CONFIG_PATH} ${LOCAL} / 82 | bash ${ROOT}/bin/db-push.sh ${ENVIRONMENT} ${CONFIG_PATH} ${LOCAL} 83 | fi 84 | 85 | if [ "${w}" = 1 ] ; then 86 | echo "===== Uploading WordPress Core =====" 87 | EXCLUDES=(wp-content) 88 | bash ${ROOT}/bin/push.sh ${ENVIRONMENT} ${CONFIG_PATH} ${LOCAL} / ${EXCLUDES} 89 | fi 90 | 91 | if [ "${d}" = 1 ] ; then 92 | bash ${ROOT}/bin/db-push.sh ${ENVIRONMENT} ${CONFIG_PATH} ${LOCAL} 93 | fi 94 | 95 | if [ "${t}" = 1 ] ; then 96 | echo "===== Uploading themes =====" 97 | bash ${ROOT}/bin/push.sh ${ENVIRONMENT} ${CONFIG_PATH} ${LOCAL} /wp-content/themes/ 98 | fi 99 | 100 | if [ "${p}" = 1 ] ; then 101 | echo "===== Uploading plugins =====" 102 | bash ${ROOT}/bin/push.sh ${ENVIRONMENT} ${CONFIG_PATH} ${LOCAL} /wp-content/plugins/ 103 | fi 104 | 105 | if [ "${u}" = 1 ] ; then 106 | echo "===== Uploading uploads =====" 107 | bash ${ROOT}/bin/push.sh ${ENVIRONMENT} ${CONFIG_PATH} ${LOCAL} /wp-content/uploads/ 108 | fi 109 | --------------------------------------------------------------------------------