I just noticed the last case doesn’t match up with the last usage example - I added in production <> staging and updated the usage text. I also made the site URLs root relative, just for compatibility reasons.
The first case also has ; after DIR="up" whereas the others don’t; I added to make consistent though I’m not sure it actually matters since each statement is just a variable declaration.
#!/bin/sh
DEVDIR="web/app/uploads/"
DEVSITE="//example.dev"
PRODDIR="web@example.com:/srv/www/example.com/shared/uploads/"
PRODSITE="//example.com"
STAGDIR="web@staging.example.com:/srv/www/example.com/shared/uploads/"
STAGSITE="//staging.example.com"
FROM=$1
TO=$2
case "$1-$2" in
development-production) DIR="up"; FROMSITE=$DEVSITE; FROMDIR=$DEVDIR; TOSITE=$PRODSITE; TODIR=$PRODDIR; ;;
development-staging) DIR="up"; FROMSITE=$DEVSITE; FROMDIR=$DEVDIR; TOSITE=$STAGSITE; TODIR=$STAGDIR; ;;
production-development) DIR="down"; FROMSITE=$PRODSITE; FROMDIR=$PRODDIR; TOSITE=$DEVSITE; TODIR=$DEVDIR; ;;
production-staging) DIR="horizontally"; FROMSITE=$PRODSITE; FROMDIR=$PRODDIR; TOSITE=$STAGSITE; TODIR=$STAGDIR; ;;
staging-development) DIR="down"; FROMSITE=$STAGSITE; FROMDIR=$STAGDIR; TOSITE=$DEVSITE; TODIR=$DEVDIR; ;;
*) echo "usage: $0 development production | development staging | production development | production staging | staging development" && exit 1 ;;
esac
read -r -p "Would you really like to reset the $TO database and sync $DIR from $FROM? [y/N] " response
if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]; then
cd ../ &&
wp "@$TO" db export &&
wp "@$FROM" db export - | wp "@$TO" db import - &&
wp "@$TO" search-replace "$FROMSITE" "$TOSITE" &&
rsync -az --progress "$FROMDIR" "$TODIR"
fi
Edit: though I’m still using WP Migrate DB, I figured I’d add in the option to skip syncing uploads, so after the case block I changed to the following:
read -r -p "Would you like to sync the uploads folder as well? [y/N] " uploads
read -r -p "Would you really like to reset the $TO database and sync $DIR from $FROM? [y/N] " response
if [[ "$response" =~ ^([yY][eE][sS]|[yY])$ ]]; then
cd ../ &&
wp "@$TO" db export &&
wp "@$FROM" db export - | wp "@$TO" db import - &&
if [[ "$uploads" =~ ^([yY][eE][sS]|[yY])$ ]]; then
wp "@$TO" search-replace "$FROMSITE" "$TOSITE" &&
rsync -az --progress "$FROMDIR" "$TODIR"
else
wp "@$TO" search-replace "$FROMSITE" "$TOSITE"
fi
fi
I am working on a repo here. Raquelle as author (@cedarstay ) as well as @ben have been mentioned for the script they made and I added there. Thanks so much for sharing this and teaching me more about aliases and shell scripts! README is not quite done yet and tweaks me be needed. Feel free to submit pull requests or clone it.
Actually another pull request by @guilro is in line for automating database and file backups using Stouts.backup Ansible role with Duplicity and is mentioned here: https://github.com/roots/trellis/pull/650 . I think that would be really good to have and can be configured in many different ways.
Just did a run to move stuff from a dev site to a production site. Latter is a demo so worries there. But I ran into an error
./sync-all.sh development production
Would you really like to reset the production database and sync up from development? [y/N] y
mysqldump: Can't create/write to file 'filathlos_imagewize_com_production-a822007.sql' (Errcode: 13 "Permission denied")
Must be a permissions issue. But should did not work using user web?
Well when I used the user web in the wp-cli.yml file it all worked
./sync-all.sh development production
Would you really like to reset the production database and sync up from development? [y/N] y
Success: Exported to 'filathlos_imagewize_com_production-a9ab231.sql'.
Success: Imported from '-'.
I only had a Sage error:
Error: Sage › ErrorAutoloader not found.. You must run composer install from the Sage directory.
, but when I commented out build-before.yml and ran deployment again I solved that too
In my case, I ran sync.sh from within my Trellis-provisioned development vagrant vm and it only worked when I changed the first line from #!/bin/sh to #!/bin/bash. Otherwise it will throw the following error on line 25 of the script:
It looks like the vagrant-triggers plugin has been merged into Vagrant in recent versions, and this vagrant-triggers script (which I ) is not working as is (at least with Vagrant 2.1.0). Anyone else experienced this?
If you want to use this automatic SSH configuration after updating Vagrant > 2.1.0, you can uninstall vagrant-triggers and replace this code in your Vagrantfile:
# Run script to update local SSH config for .dev hostname after `vagrant up`
if Vagrant.has_plugin?('vagrant-triggers')
config.trigger.after :up do
run "./bin/ssh-config-development.sh"
end
else
fail_with_message "vagrant-triggers missing, please install the plugin with this command:\nvagrant plugin install vagrant-triggers"
end
with
config.trigger.after :up do |trigger|
trigger.run = { path: "./bin/ssh-config-development.sh"}
end
I made a few modifications to this, including the change noted by @nickkeenan to automate both the script itself, while removing the hardcoded host name in the script, and creating a wp-cli.local.yml file in the project root so that you can use the @dev alias with wp-cli from anywhere in the project
Put this block in Vagrantfile after config.vm.provision provisioner do |ansible|:
# Run script to update local SSH config for .dev hostname after `vagrant up`
config.trigger.after :up do |trigger|
trigger.run = {
path: "./bin/ssh-config-development.sh",
args: [main_hostname, "#{ANSIBLE_PATH}", trellis_config.wordpress_sites.keys.first]
}
end
And the updated script:
# bin/ssh-config-development.sh
#!/bin/bash
host=$1
path=$2
site=$3
# add ssh-config for vagrant to ~/.ssh/config
sed "/^$/d;s/Host /$NL&/" ~/.ssh/config | sed "/^Host $host$/,/^$/d;"> config &&
cat config > ~/.ssh/config &&
rm config &&
vagrant ssh-config --host $host >> ~/.ssh/config
# add wp-cli.local.yml to project root if it doesn't exist with alias for @dev
cd $path/.. &&
if [ ! -f wp-cli.local.yml ]
then
touch wp-cli.local.yml
fi
if ! grep -Fxq "@dev" wp-cli.local.yml
then
cat << EOF > wp-cli.local.yml
@dev:
ssh: vagrant@$host/srv/www/$site/current
path: web/wp
EOF
fi
A few caveats:
if you have more than one site in your wordpress_sites.yml it only creates an alias for the first one
the script assumes your ssh config is located at ~/.ssh/config
it only checks for the existence of a @dev alias in wp-cli.local.yml so if one already exists, it won’t do anything. this might mean the alias won’t work if you’ve run vagrant up then changed your site name or URL and run vagrant up again
by default, the alias will not work in the site/ directory
– to fix, either add the alias to site/wp-cli.yml, delete site/wp-cli.yml, or add this to the configuration in site/wp-cli.yml: