Коллеги, приветствую!
Настраиваю непрерывное развертывание для тестирования в production
Известно, что
&& логическое AND
Вторая команда выполнится в том случае если первая завершилась без ошибок.
Но проблема в том, что ряд команд выдают ошибки, но при этом она завершается успешно.
Например:
/usr/local/bin/docker-compose -f docker-compose-epsyteam.yml exec app composer install
Может завершиться ErrorCode > 0
Но это не значит, что не нужно дальше выполнять команды.
Далее команды не выполняются.
Пробовал в цикле каждую команду выполнить, но exec() не ждет.
<?php
define('GITHUB_SECRET', '***********');
set_time_limit(3600);
header('Content-Type', 'text/plain');
// Ensure signature exists
if (!isset($_SERVER['HTTP_X_HUB_SIGNATURE'])) {
http_response_code(403);
die('Missing signature');
}
// Ensure that signature is formed as expected
$signature = explode('=', $_SERVER['HTTP_X_HUB_SIGNATURE']);
if (2 !== count($signature)) {
http_response_code(400);
die('Malformed signature');
}
// Parse signature
$algos = hash_algos();
list($algo, $hash) = $signature;
if (!in_array($algo, $algos)) {
http_response_code(400);
die("Unknown hashing algo: $algo");
}
// Load payload
$payload = file_get_contents('php://input');
// Check signature
$expectedHash = hash_hmac($algo, $payload, GITHUB_SECRET);
if ($expectedHash !== $hash) {
http_response_code(403);
die('Invalid signature');
}
// Parse data
$data = json_decode($payload, true);
// Configure commands
$commands = [
"epsy-me/epsy-api" => [
"cd /var/www/epsyteam/data/epsy-api/",
"pwd",
"git reset --hard",
"git pull origin develop",
"/usr/local/bin/docker-compose -f docker-compose-epsyteam.yml kill",
"/usr/local/bin/docker-compose -f docker-compose-epsyteam.yml down",
"/usr/local/bin/docker-compose -f docker-compose-epsyteam.yml up -d --build",
"/usr/local/bin/docker-compose -f docker-compose-epsyteam.yml exec app composer install",
"/usr/local/bin/docker-compose -f docker-compose-epsyteam.yml exec app composer dump-env prod",
"/usr/local/bin/docker-compose -f docker-compose-epsyteam.yml exec app php bin/console doctrine:schema:update --dump-sql --force"
]
];
// Run
$repo = $data['repository']['full_name'];
if (isset($commands[$repo])) {
$command = implode(' && ', $commands[$repo]);
$output = [];
$output[] = $repo;
$output[] = "================================================";
exec($command, $output, $returnCode);
mailTo("dev@epsy.me", implode("\n - ", $output), "EPSY DEPLOYMENT");
} else {
http_response_code(400);
$message = "Repository not configured: $repo\n";
mailTo("dev@epsy.me", $message, "EPSY DEPLOYMENT ERROR");
die($message);
}
function mailTo($to, $message, $subject)
{
$headers = "From: dev@epsyteam.ru" . "\r\n" .
'X-Mailer: PHP/' . phpversion();
mail($to, $subject, $message, $headers);
}