2016-11-19 15:13:32 +07:00
|
|
|
<?php
|
2020-10-09 23:11:30 +02:00
|
|
|
|
2016-11-19 15:13:32 +07:00
|
|
|
namespace Deployer;
|
|
|
|
|
2020-04-25 23:00:08 +03:00
|
|
|
use Deployer\Exception\Exception;
|
2021-09-20 00:32:34 +02:00
|
|
|
use Symfony\Component\Console\Helper\Table;
|
2016-11-19 15:13:32 +07:00
|
|
|
|
2020-04-25 23:00:08 +03:00
|
|
|
/**
|
2021-09-20 00:32:34 +02:00
|
|
|
* The name of the release.
|
2020-04-25 23:00:08 +03:00
|
|
|
*/
|
2016-11-19 15:13:32 +07:00
|
|
|
set('release_name', function () {
|
2021-09-20 00:32:34 +02:00
|
|
|
$latest = run('cat .dep/latest_release || echo 0');
|
|
|
|
return strval(intval($latest) + 1);
|
2020-04-25 23:00:08 +03:00
|
|
|
});
|
2016-11-19 15:13:32 +07:00
|
|
|
|
2020-10-09 23:11:30 +02:00
|
|
|
/**
|
2021-09-20 00:32:34 +02:00
|
|
|
* Holds metainfo about releases from `.dep/releases_metainfo` file.
|
2020-10-09 23:11:30 +02:00
|
|
|
*/
|
|
|
|
set('releases_metainfo', function () {
|
|
|
|
cd('{{deploy_path}}');
|
|
|
|
|
2021-09-20 00:32:34 +02:00
|
|
|
if (!test('[ -f .dep/releases_metainfo ]')) {
|
2020-10-09 23:11:30 +02:00
|
|
|
return [];
|
|
|
|
}
|
|
|
|
|
|
|
|
$keepReleases = get('keep_releases');
|
|
|
|
if ($keepReleases === -1) {
|
2021-09-20 00:32:34 +02:00
|
|
|
$data = run('cat .dep/releases_metainfo');
|
2020-10-09 23:11:30 +02:00
|
|
|
} else {
|
2021-09-20 00:32:34 +02:00
|
|
|
$data = run("tail -n " . ($keepReleases + 5) . " .dep/releases_metainfo");
|
|
|
|
}
|
|
|
|
|
|
|
|
$releasesMetainfo = [];
|
|
|
|
foreach (explode("\n", $data) as $line) {
|
|
|
|
$metainfo = json_decode($line, true);
|
|
|
|
if (!empty($metainfo)) {
|
|
|
|
$releasesMetainfo[] = $metainfo;
|
|
|
|
}
|
2020-10-09 23:11:30 +02:00
|
|
|
}
|
2021-09-20 00:32:34 +02:00
|
|
|
return $releasesMetainfo;
|
2020-10-09 23:11:30 +02:00
|
|
|
});
|
|
|
|
|
2016-11-19 15:13:32 +07:00
|
|
|
/**
|
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.
|
2020-10-09 23:11:30 +02:00
|
|
|
$ll = explode("\n", run('cd releases && ls -t -1 -d */'));
|
|
|
|
$ll = array_map(function ($release) {
|
2017-02-21 01:38:38 -08:00
|
|
|
return basename(rtrim(trim($release), '/'));
|
2020-10-09 23:11:30 +02:00
|
|
|
}, $ll);
|
2016-11-19 15:13:32 +07:00
|
|
|
|
2021-09-20 00:32:34 +02:00
|
|
|
$releasesMetainfo = get('releases_metainfo');
|
2016-11-19 15:13:32 +07:00
|
|
|
|
2020-10-09 23:11:30 +02:00
|
|
|
$releases = [];
|
2021-09-20 00:32:34 +02:00
|
|
|
for ($i = count($releasesMetainfo) - 1; $i >= 0; --$i) {
|
|
|
|
$release = $releasesMetainfo[$i]['release_name'];
|
|
|
|
if (in_array($release, $ll, true)) {
|
|
|
|
$releases[] = $release;
|
2016-11-19 15:13:32 +07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
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 {
|
2020-04-25 23:00:08 +03:00
|
|
|
throw new Exception(parse('The "release_path" ({{deploy_path}}/release) does not exist.'));
|
2016-11-19 15:13:32 +07:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2021-04-03 13:05:45 +01:00
|
|
|
/**
|
|
|
|
* Return the release path during a deployment
|
|
|
|
* but fallback to the current path otherwise.
|
|
|
|
*/
|
|
|
|
set('release_or_current_path', function () {
|
|
|
|
$releaseExists = test('[ -h {{deploy_path}}/release ]');
|
|
|
|
return $releaseExists ? get('release_path') : get('current_path');
|
|
|
|
});
|
2016-11-19 15:13:32 +07:00
|
|
|
|
2017-12-22 14:28:13 +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}}');
|
|
|
|
|
2021-09-20 00:32:34 +02:00
|
|
|
// Clean up if there is unfinished release.
|
2020-10-09 23:11:30 +02:00
|
|
|
if (test('[ -h release ]')) {
|
2021-09-20 00:32:34 +02:00
|
|
|
run('rm -rf "$(readlink release)"'); // Delete release.
|
|
|
|
run('rm release'); // Delete symlink.
|
2017-04-08 21:06:15 +07:00
|
|
|
}
|
|
|
|
|
2017-12-16 20:29:52 +07:00
|
|
|
// We need to get releases_list at same point as release_name,
|
|
|
|
// as standard release_name's implementation depends on it and,
|
2017-12-16 13:30:12 +00:00
|
|
|
// if user overrides it, we need to get releases_list manually.
|
2017-12-16 20:29:52 +07:00
|
|
|
$releasesList = get('releases_list');
|
2016-11-19 15:13:32 +07:00
|
|
|
$releaseName = get('release_name');
|
2021-09-20 00:32:34 +02:00
|
|
|
$releasePath = "releases/$releaseName";
|
2016-11-19 15:13:32 +07:00
|
|
|
|
2021-09-20 00:32:34 +02:00
|
|
|
// Check what there is no such release path.
|
|
|
|
if (test("[ -d $releasePath ]")) {
|
|
|
|
throw new Exception("Release name \"$releaseName\" already exists.");
|
2016-11-19 15:13:32 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
// Metainfo.
|
2021-09-20 00:32:34 +02:00
|
|
|
$timestamp = (new \DateTime('now', new \DateTimeZone('UTC')))->format(\DateTime::ISO8601);
|
|
|
|
$metainfo = [
|
|
|
|
'created_at' => $timestamp,
|
|
|
|
'release_name' => $releaseName,
|
|
|
|
'user' => get('user'),
|
|
|
|
'target' => get('target'),
|
|
|
|
'revision' => "__REVISION__"
|
|
|
|
];
|
|
|
|
|
|
|
|
// Save metainfo about release.
|
|
|
|
$json = json_encode($metainfo);
|
|
|
|
run("echo '$json' >> .dep/releases_metainfo");
|
|
|
|
run("echo '$releaseName' > .dep/latest_release");
|
|
|
|
|
|
|
|
// Make new release.
|
2020-04-25 23:00:08 +03:00
|
|
|
run("mkdir -p $releasePath");
|
2016-11-19 15:13:32 +07:00
|
|
|
run("{{bin/symlink}} $releasePath {{deploy_path}}/release");
|
2017-05-04 13:00:01 +07:00
|
|
|
|
2021-09-20 00:32:34 +02:00
|
|
|
// Add to releases list.
|
2017-05-04 13:00:01 +07:00
|
|
|
array_unshift($releasesList, $releaseName);
|
|
|
|
set('releases_list', $releasesList);
|
|
|
|
|
2021-09-20 00:32:34 +02:00
|
|
|
// Set previous_release.
|
2017-05-04 13:00:01 +07:00
|
|
|
if (isset($releasesList[1])) {
|
|
|
|
set('previous_release', "{{deploy_path}}/releases/{$releasesList[1]}");
|
|
|
|
}
|
2016-11-19 15:13:32 +07:00
|
|
|
});
|
2021-09-20 00:32:34 +02:00
|
|
|
|
|
|
|
desc('Show releases list');
|
|
|
|
task('releases', function () {
|
|
|
|
cd('{{deploy_path}}');
|
|
|
|
|
|
|
|
$releasesMetainfo = get('releases_metainfo');
|
|
|
|
$currentRelease = basename(run('readlink {{current_path}}'));
|
|
|
|
$releasesList = get('releases_list');
|
|
|
|
|
|
|
|
$table = [];
|
|
|
|
foreach ($releasesMetainfo as &$metainfo) {
|
|
|
|
$status = $release = $metainfo['release_name'];
|
|
|
|
if (in_array($release, $releasesList, true)) {
|
|
|
|
if (test("[ -f releases/$release/BAD_RELEASE ]")) {
|
|
|
|
$status = "<error>$release</error> (bad)";
|
|
|
|
} else {
|
|
|
|
$status = "<info>$release</info>";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ($release === $currentRelease) {
|
|
|
|
$status .= ' (current)';
|
|
|
|
}
|
|
|
|
$table[] = [
|
|
|
|
\DateTime::createFromFormat(\DateTime::ISO8601, $metainfo['created_at'])->format("Y-m-d H:i:s"),
|
|
|
|
$status,
|
|
|
|
$metainfo['user'],
|
|
|
|
$metainfo['target'],
|
|
|
|
$metainfo['revision'],
|
|
|
|
];
|
|
|
|
}
|
|
|
|
|
|
|
|
(new Table(output()))
|
|
|
|
->setHeaderTitle(currentHost()->getAlias())
|
|
|
|
->setHeaders(['Date', 'Release', 'Author', 'Target', 'Commit'])
|
|
|
|
->setRows($table)
|
|
|
|
->render();
|
|
|
|
});
|