Skip to content

Commit 3ea3e0c

Browse files
committed
Report silent build command failures
1 parent fee06ee commit 3ea3e0c

5 files changed

Lines changed: 44 additions & 3 deletions

File tree

app/config/errors.php

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,14 @@
2424
'message' => 'You are not authorized to access this resource.',
2525
'code' => 401,
2626
],
27+
/* Build */
28+
Exception::BUILD_FAILED => [
29+
'name' => Exception::BUILD_FAILED,
30+
'short' => 'Build failed',
31+
'message' => 'Build failed.',
32+
'code' => 400,
33+
'publish' => false,
34+
],
2735
/* Runtime */
2836
Exception::RUNTIME_FAILED => [
2937
'name' => Exception::RUNTIME_FAILED,

src/Executor/Exception.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ class Exception extends \RuntimeException
2424

2525
public const string EXECUTION_BAD_JSON = 'execution_bad_json';
2626

27+
public const string BUILD_FAILED = 'build_failed';
28+
2729
public const string RUNTIME_NOT_FOUND = 'runtime_not_found';
2830

2931
public const string RUNTIME_CONFLICT = 'runtime_conflict';

src/Executor/Runner/Docker.php

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,12 @@ public function createRuntime(
386386
);
387387

388388
if (!$status) {
389-
throw new ExecutorException(ExecutorException::RUNTIME_FAILED, 'Failed to create runtime: ' . $stdout);
389+
$message = \trim($stdout);
390+
391+
throw new ExecutorException(
392+
ExecutorException::BUILD_FAILED,
393+
$message === '' ? 'Build command failed.' : $message
394+
);
390395
}
391396

392397
if ($version === 'v2') {
@@ -398,6 +403,14 @@ public function createRuntime(
398403
} elseif (!$cacheEnabled) {
399404
$output = Logs::get($runtimeName);
400405
}
406+
} catch (ExecutorException $err) {
407+
throw $err;
408+
} catch (OrchestrationException $err) {
409+
throw new ExecutorException(
410+
ExecutorException::BUILD_FAILED,
411+
'Build command failed.',
412+
previous: $err
413+
);
401414
} catch (Throwable $err) {
402415
throw new ExecutorException(ExecutorException::RUNTIME_FAILED, $err->getMessage(), null, $err);
403416
}
@@ -511,6 +524,10 @@ public function createRuntime(
511524
$message .= $chunk['content'];
512525
}
513526

527+
if ($throwable instanceof ExecutorException) {
528+
throw new ExecutorException($throwable->getType(), $message, $throwable->getCode(), $throwable);
529+
}
530+
514531
throw new \Exception($message, $throwable->getCode() ?: 500, $throwable);
515532
}
516533

@@ -545,14 +562,14 @@ private function getBuildCommands(string $command, string $version): array
545562
return [
546563
'sh',
547564
'-c',
548-
'touch /var/tmp/logs.txt && (' . $command . ') >> /var/tmp/logs.txt 2>&1 && cat /var/tmp/logs.txt'
565+
'touch /var/tmp/logs.txt && (' . $command . ') >> /var/tmp/logs.txt 2>&1; status=$?; cat /var/tmp/logs.txt; if [ $status -ne 0 ]; then echo "Build command exited with code $status."; fi; exit $status'
549566
];
550567
}
551568

552569
return [
553570
'bash',
554571
'-c',
555-
'mkdir -p /tmp/logging && touch /tmp/logging/timings.txt && touch /tmp/logging/logs.txt && script --log-out /tmp/logging/logs.txt --flush --log-timing /tmp/logging/timings.txt --return --quiet --command "' . \str_replace('"', '\"', $command) . '"'
572+
'mkdir -p /tmp/logging && touch /tmp/logging/timings.txt && touch /tmp/logging/logs.txt && script --log-out /tmp/logging/logs.txt --flush --log-timing /tmp/logging/timings.txt --return --quiet --command "' . \str_replace('"', '\"', $command) . '"; status=$?; if [ $status -ne 0 ]; then echo "Build command exited with code $status."; fi; exit $status'
556573
];
557574
}
558575

tests/e2e/ExecutorTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ public function testBuild(): void
299299

300300
$response = $this->client->call(Client::METHOD_POST, '/runtimes', [], $params);
301301
$this->assertEquals(400, $response['headers']['status-code']);
302+
$this->assertEquals('build_failed', $response['body']['type']);
302303

303304
/** Invalid cache key */
304305
$params = [

tests/unit/Executor/Runner/DockerTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,19 @@ public function testNoCacheLifecycleShellCommandsAreGenerated(): void
4444
$this->assertStringNotContainsString('build-cache-save.sh', $command);
4545
}
4646

47+
public function testBuildCommandsReportSilentNonZeroExit(): void
48+
{
49+
$docker = $this->createDocker();
50+
51+
foreach (['v2', 'v5'] as $version) {
52+
$commands = $this->invokeGetBuildCommands($docker, 'exit 1', $version);
53+
$command = \implode(' ', $commands);
54+
55+
$this->assertStringContainsString('Build command exited with code $status.', $command);
56+
$this->assertStringContainsString('exit $status', $command);
57+
}
58+
}
59+
4760
public function testInvalidBuildCacheKeyIsRejected(): void
4861
{
4962
$this->expectException(\Exception::class);

0 commit comments

Comments
 (0)