2016-11-19 15:13:32 +07:00
|
|
|
<?php
|
|
|
|
/* (c) Anton Medvedev <anton@medv.io>
|
|
|
|
*
|
|
|
|
* For the full copyright and license information, please view the LICENSE
|
|
|
|
* file that was distributed with this source code.
|
|
|
|
*/
|
|
|
|
|
|
|
|
namespace Deployer;
|
|
|
|
|
|
|
|
use Deployer\Type\Csv;
|
|
|
|
|
|
|
|
set('release_name', function () {
|
|
|
|
$list = get('releases_list');
|
|
|
|
|
|
|
|
// Filter out anything that does not look like a release.
|
|
|
|
$list = array_filter($list, function ($release) {
|
|
|
|
return preg_match('/^[\d\.]+$/', $release);
|
|
|
|
});
|
|
|
|
|
|
|
|
$nextReleaseNumber = 1;
|
|
|
|
if (count($list) > 0) {
|
|
|
|
$nextReleaseNumber = (int)max($list) + 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
return (string)$nextReleaseNumber;
|
|
|
|
}); // name of folder in releases
|
|
|
|
|
|
|
|
/**
|
2017-03-19 22:52:05 +07:00
|
|
|
* Return list of releases on host.
|
2016-11-19 15:13:32 +07:00
|
|
|
*/
|
|
|
|
set('releases_list', function () {
|
|
|
|
cd('{{deploy_path}}');
|
|
|
|
|
|
|
|
// If there is no releases return empty list.
|
2017-08-12 18:06:21 +03:00
|
|
|
if (!test('[ -d releases ] && [ "$(ls -A releases)" ]')) {
|
2016-11-19 15:13:32 +07:00
|
|
|
return [];
|
|
|
|
}
|
|
|
|
|
|
|
|
// Will list only dirs in releases.
|
2017-08-12 18:06:21 +03:00
|
|
|
$list = explode("\n", run('cd releases && ls -t -1 -d */'));
|
2016-11-19 15:13:32 +07:00
|
|
|
|
|
|
|
// Prepare list.
|
|
|
|
$list = array_map(function ($release) {
|
2017-02-21 01:38:38 -08:00
|
|
|
return basename(rtrim(trim($release), '/'));
|
2016-11-19 15:13:32 +07:00
|
|
|
}, $list);
|
|
|
|
|
|
|
|
$releases = []; // Releases list.
|
|
|
|
|
|
|
|
// Collect releases based on .dep/releases info.
|
|
|
|
// Other will be ignored.
|
|
|
|
|
2017-08-12 18:06:21 +03:00
|
|
|
if (test('[ -f .dep/releases ]')) {
|
2016-11-19 15:13:32 +07:00
|
|
|
$keepReleases = get('keep_releases');
|
|
|
|
if ($keepReleases === -1) {
|
|
|
|
$csv = run('cat .dep/releases');
|
|
|
|
} else {
|
2017-01-31 12:59:41 +07:00
|
|
|
// Instead of `tail -n` call here can be `cat` call,
|
2017-03-19 22:52:05 +07:00
|
|
|
// but on hosts with a lot of deploys (more 1k) it
|
2017-01-31 12:59:41 +07:00
|
|
|
// will output a really big list of previous releases.
|
|
|
|
// It spoils appearance of output log, to make it pretty,
|
|
|
|
// we limit it to `n*2 + 5` lines from end of file (15 lines).
|
2017-02-22 08:17:37 +00:00
|
|
|
// Always read as many lines as there are release directories.
|
2017-02-21 23:05:18 -08:00
|
|
|
$csv = run("tail -n " . max(count($releases), ($keepReleases * 2 + 5)) . " .dep/releases");
|
2016-11-19 15:13:32 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
$metainfo = Csv::parse($csv);
|
|
|
|
|
|
|
|
for ($i = count($metainfo) - 1; $i >= 0; --$i) {
|
|
|
|
if (is_array($metainfo[$i]) && count($metainfo[$i]) >= 2) {
|
2017-02-24 23:25:31 +07:00
|
|
|
list(, $release) = $metainfo[$i];
|
2016-11-19 15:13:32 +07:00
|
|
|
$index = array_search($release, $list, true);
|
|
|
|
if ($index !== false) {
|
|
|
|
$releases[] = $release;
|
|
|
|
unset($list[$index]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $releases;
|
|
|
|
});
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return release path.
|
|
|
|
*/
|
|
|
|
set('release_path', function () {
|
2017-08-12 18:06:21 +03:00
|
|
|
$releaseExists = test('[ -h {{deploy_path}}/release ]');
|
2017-01-27 20:03:36 +07:00
|
|
|
if ($releaseExists) {
|
2017-08-12 18:06:21 +03:00
|
|
|
$link = run("readlink {{deploy_path}}/release");
|
2017-01-27 20:03:36 +07:00
|
|
|
return substr($link, 0, 1) === '/' ? $link : get('deploy_path') . '/' . $link;
|
|
|
|
} else {
|
|
|
|
return get('current_path');
|
2016-11-19 15:13:32 +07:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
|
2017-12-08 13:55:38 +01:00
|
|
|
desc('Prepare release. Clean up unfinished releases and prepare next release.');
|
2016-11-19 15:13:32 +07:00
|
|
|
task('deploy:release', function () {
|
|
|
|
cd('{{deploy_path}}');
|
|
|
|
|
2017-05-04 13:00:01 +07:00
|
|
|
// Clean up if there is unfinished release
|
2017-08-12 18:06:21 +03:00
|
|
|
$previousReleaseExist = test('[ -h release ]');
|
2016-11-19 15:13:32 +07:00
|
|
|
|
|
|
|
if ($previousReleaseExist) {
|
2017-05-04 13:00:01 +07:00
|
|
|
run('rm -rf "$(readlink release)"'); // Delete release
|
|
|
|
run('rm release'); // Delete symlink
|
2017-04-08 21:06:15 +07:00
|
|
|
}
|
|
|
|
|
2016-11-19 15:13:32 +07:00
|
|
|
$releaseName = get('release_name');
|
|
|
|
|
2017-05-04 13:00:01 +07:00
|
|
|
// Fix collisions
|
2016-11-19 15:13:32 +07:00
|
|
|
$i = 0;
|
2017-08-12 18:06:21 +03:00
|
|
|
while (test("[ -d {{deploy_path}}/releases/$releaseName ]")) {
|
2016-11-19 15:13:32 +07:00
|
|
|
$releaseName .= '.' . ++$i;
|
|
|
|
set('release_name', $releaseName);
|
|
|
|
}
|
|
|
|
|
|
|
|
$releasePath = parse("{{deploy_path}}/releases/{{release_name}}");
|
2017-12-16 01:40:08 +03:00
|
|
|
$releasesList = get('releases_list');
|
2016-11-19 15:13:32 +07:00
|
|
|
|
|
|
|
// Metainfo.
|
|
|
|
$date = run('date +"%Y%m%d%H%M%S"');
|
|
|
|
|
2017-05-04 13:00:01 +07:00
|
|
|
// Save metainfo about release
|
2016-11-19 15:13:32 +07:00
|
|
|
run("echo '$date,{{release_name}}' >> .dep/releases");
|
|
|
|
|
2017-05-04 13:00:01 +07:00
|
|
|
// Make new release
|
2016-11-19 15:13:32 +07:00
|
|
|
run("mkdir $releasePath");
|
|
|
|
run("{{bin/symlink}} $releasePath {{deploy_path}}/release");
|
2017-05-04 13:00:01 +07:00
|
|
|
|
|
|
|
// Add to releases list
|
|
|
|
array_unshift($releasesList, $releaseName);
|
|
|
|
set('releases_list', $releasesList);
|
|
|
|
|
|
|
|
// Set previous_release
|
|
|
|
if (isset($releasesList[1])) {
|
|
|
|
set('previous_release', "{{deploy_path}}/releases/{$releasesList[1]}");
|
|
|
|
}
|
2016-11-19 15:13:32 +07:00
|
|
|
});
|