IgorPI
@IgorPI

Последовательное выполнение команд php exec?

Коллеги, приветствую!

Настраиваю непрерывное развертывание для тестирования в 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);
}
  • Вопрос задан
  • 224 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
# man bash
...
Commands separated by a ; are executed sequentially; the shell waits for each command
to terminate in turn.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
но exec() не ждет

Ждёт.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы