Skip to content

Commit 73ca836

Browse files
committed
Report silent build command failures
1 parent fee06ee commit 73ca836

5 files changed

Lines changed: 32 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: 8 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') {
@@ -545,14 +550,14 @@ private function getBuildCommands(string $command, string $version): array
545550
return [
546551
'sh',
547552
'-c',
548-
'touch /var/tmp/logs.txt && (' . $command . ') >> /var/tmp/logs.txt 2>&1 && cat /var/tmp/logs.txt'
553+
'touch /var/tmp/logs.txt && (' . $command . ') >> /var/tmp/logs.txt 2>&1; status=$?; cat /var/tmp/logs.txt; if [ $status -ne 0 ] && [ ! -s /var/tmp/logs.txt ]; then echo "Build command exited with code $status."; fi; exit $status'
549554
];
550555
}
551556

552557
return [
553558
'bash',
554559
'-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) . '"'
560+
'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 ] && [ ! -s /tmp/logging/logs.txt ]; then echo "Build command exited with code $status."; fi; exit $status'
556561
];
557562
}
558563

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)