Skip to content

Instantly share code, notes, and snippets.

@MakoTano
Last active August 29, 2015 14:03
Show Gist options
  • Save MakoTano/48824c372ad5e15897ad to your computer and use it in GitHub Desktop.
Save MakoTano/48824c372ad5e15897ad to your computer and use it in GitHub Desktop.
sample config about cakephp deployment using altax. (But I use it in real)
<?php
// Altax - http://kohkimakimoto.github.io/altax/
// Autoloading for plugin command classes.
if (is_file(__DIR__ . '/vendor/autoload.php')) require_once __DIR__ . '/vendor/autoload.php';
// ***************************************************************
// Server definition. - change here.
// ***************************************************************
Server::nodesFromSSHConfigHosts();
CONST PRODUCTION_SERVER_SSH_STRING = "name_of_ssh_config";
CONST BASE_PATH = "/var/www/html";
$env['release'] = BASE_PATH."/releases";
$env['publish'] = BASE_PATH."/current";
$env['logs'] = BASE_PATH."/cake_logs";
$env['repository'] = "git@github.com:user_name/repository_name.git";
$env['prod_configs'] = array('database.php', 'core.php');
$env['locale'] = 'Asia/Tokyo';
// ***************************************************************
// Task definition.
// ***************************************************************
Task::register('deploy', function($task) use ($env){
$task->exec(function($process) use ($env){
date_default_timezone_set($env['locale']);
$now = date('Y_m_d_His');
$env['release'] = "{$env['release']}/{$now}";
$process->run("git clone {$env['repository']} {$env['release']}");
generate_sybolic_links($process, $env);
clear_cake_caches($process, $env);
switch_to_production_config($process, $env);
switch_to_production_environment($process, $env);
echo "Finish deploying.\n";
}, array(PRODUCTION_SERVER_SSH_STRING));
})->description("Deploy master repogitory.");
function generate_sybolic_links($process, $env){
$process->run( array(
"cd {$env['release']}/app/tmp/",
"rm -rf logs",
"ln -s {$env['logs']}/logs logs"
)
);
return;
}
function clear_cake_caches($process, $env){
$process->run( array(
"chmod -R 0777 {$env['release']}/app/tmp",
"rm -rf {$env['release']}/app/tmp/cache/models/myapp_*",
"rm -rf {$env['release']}/app/tmp/cache/persistent/myapp_*",
"rm -rf {$env['release']}/app/tmp/cache/views/myapp_*",
)
);
return;
}
function switch_to_production_config($process, $env){
foreach ($env['prod_configs'] as $config) {
$process->run( array(
"cd {$env['release']}/app/Config",
"rm -rf {$config}",
"ln -s prod/{$config} {$config}"
)
);
}
return;
}
function switch_to_production_environment($process, $env){
$process->run("rm -f {$env['publish']}; ln -s {$env['release']} {$env['publish']}");
return;
}
Task::register('rollback', function($task) use ($env){
$task->exec(function($process) use ($env){
// the latest version, which you want to rollback
$latest = get_latest($env);
echo 'latest version: ' . $latest . "\n";
// the previous version, which you want to activate
$prev = get_prev($env, $latest);
if (empty($prev)) {
echo "There's no previous version. finished.\n";
exit;
}
echo 'previous version: ' . $prev . "\n";
// switch to previous version.
date_default_timezone_set($env['locale']);
$env_lastest = "{$env['release']}/{$latest}";
$env['release'] = "{$env['release']}/{$prev}";
generate_sybolic_links($process, $env);
clear_cake_caches($process, $env);
switch_to_production_config($process, $env);
switch_to_production_environment($process, $env);
// delete the latest version. -- it has troubles.
$process->run("rm -rf {$env_lastest}");
echo "Finisih rollbacking.\n";
}, array(PRODUCTION_SERVER_SSH_STRING));
})->description("Rollback to previous version.");
function get_latest($env){
$str = $process->run("readlink {$env['publish']}");
$str = str_replace("{$env['release']}/", '', $str);
$str = str_replace("\n", '', $str);
return $str;
}
function get_prev($env, $latest){
$releases = $process->run("ls -t {$env['release']}");
$releases = explode("\n", $releases);
$found = false;
$prev = null;
foreach ($releases as $release) {
$release = trim($release);
if ($found) {
$prev = $release;
break;
}
if ($release == $latest) $found = true;
}
return $prev;
}
Task::register('hist', function($task) use ($env){
$task->exec(function($process) use ($env){
echo "The List of deployed folders.\n";
$releases = $process->run("ls -t {$env['release']}");
}, array(PRODUCTION_SERVER_SSH_STRING));
})->description("Show the folder names which in release folder.");
Task::register('clean', function($task) use ($env){
$task->exec(function($process) use ($env){
$releases = $process->run("ls -t {$env['release']}");
$releases = rtrim($releases, "\n");
$releases = explode("\n", $releases);
foreach ($releases as $key => $release) {
if ($key > 4) {
$release = trim($release);
$process->run("rm -rf {$env['release']}/{$release}");
}
}
}, array(PRODUCTION_SERVER_SSH_STRING));
})->description("Clean release directory without 5 histories.");
@MakoTano
Copy link
Author

Please tell me bugs, miss-spellings, your opinion here.

@MakoTano
Copy link
Author

32: $process->run("git clone {$env['repository']} {$env['release']}");

$process->run("git clone --depth 1 {$env['repository']} {$env['release']}");

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment