Automating tasks and routines is very important. If you are doing deployments manually you really need to consider making an automated way of doing it. A good tool that is Ruby based is capistrano. The one thing I noticed about capistrano though was the tool was kind of heavy. I wanted something a little more lightweight that I understood the entire process. So even though capistrano would have got the job done I didn’t need such a heavy tool. So I decided to create my own tool. This is just a single PHP script that you could store in your commands directory. Then you just execute it.
php commands/release_test.php
You could also pass in an environment variable if you don’t want to have a separate command for each environment. For me I wanted it as a separate command so I didn’t have to think about it on release. Here is the script in detail hopefully it’s useful to other Yii projects.
<?php // This is a simple script that can be used to release code to the test environment $server_location = ‘[234.343.343.343]’; $env = ‘[testing]’; $server_username = ‘[USERNAME]’; $production_location = ‘[PRODUCTION_LOCATION] i.e. /Users/whatever/location…’; $project_assets_location = ‘[ASSETS]’; $git_upstream_name = ‘[upstream]’; $git_branch_name = ‘[branch_name]’; // connect to the server $connection = ssh2_connect($server_location, 22); echo “Enter password: “; $password = preg_replace(’/\r?\n$/’, ‘’, `stty -echo; head -n1 ; stty echo`); echo “\n”; ssh2_auth_password($connection, $server_username, trim($password)); // update the remote repository $updateResponse = ssh2_exec($connection, ‘cd ‘.$production_location.’; git remote update’); stream_set_blocking($updateResponse, true); $updateResponseOutput = stream_get_contents($updateResponse); echo $updateResponseOutput.”\n”; // pull in the latest code $pullResponse = ssh2_exec($connection, ‘cd ‘.$production_location.’; git pull ‘.$git_upstream_name.’ ‘.$git_branch_name); stream_set_blocking($pullResponse, true); $pullResponseOutput = stream_get_contents($pullResponse); echo $pullResponseOutput.”\n”; // run the migrations $migrations = ssh2_exec($connection, ‘YII_ENVIRONMENT=’.$env.’ ‘.$production_location.’/yiic migrate —interactive=0’); stream_set_blocking($migrations, true); $migrationsOutput = stream_get_contents($migrations); echo $migrationsOutput.”\n”;// check to see if we want assets rebuild echo “Do you want to rebuild assets? Type ‘yes’ to rebuild assets: “; $handle = fopen (“php://stdin”, “r”); $line = fgets($handle); if (trim($line) == ‘yes’) { $cleanAssets = ssh2_exec($connection, ‘rm -r ‘.$project_assets_location.’/*’); stream_set_blocking($cleanAssets, true); $cleanAssetsOutput = stream_get_contents($cleanAssets); echo $cleanAssetsOutput.”\n”; } // close the connection // exit the ssh2 connection ssh2_exec($connection, ‘exit’);