Skip to content

Commit 1e24564

Browse files
committed
ci(e2e): forbid rebuild fallback for prebuilt images
1 parent 22d4c58 commit 1e24564

2 files changed

Lines changed: 43 additions & 1 deletion

File tree

packages/lib/src/usecases/projects-up.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ const syncManagedProjectFiles = (
5050
yield* _(ensureCodexConfigFile(projectDir, template.codexAuthPath))
5151
})
5252

53+
const hasPrebuiltProjectImage = (template: TemplateConfig): boolean => (template.imageName?.trim().length ?? 0) > 0
54+
5355
const claudeCliSelfHealScript = `set -eu
5456
if command -v claude >/dev/null 2>&1; then
5557
exit 0
@@ -222,7 +224,10 @@ const runProjectComposeUp = (
222224
? runDockerComposeUp(projectDir)
223225
: runDockerComposeUp(projectDir, { buildMode: "reuse" }).pipe(
224226
Effect.catchTag("DockerCommandError", (error) => {
225-
if (gpuModeAfterDockerFailure(template.gpu, error.details) !== template.gpu) {
227+
if (
228+
gpuModeAfterDockerFailure(template.gpu, error.details) !== template.gpu ||
229+
hasPrebuiltProjectImage(template)
230+
) {
226231
return Effect.fail(error)
227232
}
228233

packages/lib/tests/usecases/projects-up.test.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,4 +488,41 @@ describe("runDockerComposeUpWithPortCheck", () => {
488488
expect(recorded.some((entry) => isDockerComposeUpWithBuild(entry))).toBe(false)
489489
})
490490
).pipe(Effect.provide(NodeContext.layer)))
491+
492+
it.effect("does not rebuild when prebuilt-image reuse compose up fails", () =>
493+
withTempDir((root) =>
494+
Effect.gen(function*(_) {
495+
const path = yield* _(Path.Path)
496+
const outDir = path.join(root, "project")
497+
const targetDir = "/home/dev/workspaces/org/repo"
498+
const globalConfig = makeTemplateConfig(root, outDir, path, targetDir)
499+
const projectConfig: TemplateConfig = {
500+
...makeTemplateConfig(root, outDir, path, targetDir),
501+
imageName: "docker-git-e2e-project:latest"
502+
}
503+
const recorded: Array<RecordedCommand> = []
504+
const executor = makeFakeExecutor(recorded, { failGpuComposeUp: true })
505+
506+
yield* _(
507+
prepareProjectFiles(outDir, root, globalConfig, projectConfig, {
508+
force: false,
509+
forceEnv: false
510+
})
511+
)
512+
513+
const result = yield* _(
514+
runDockerComposeUpWithPortCheck(outDir, {
515+
buildMode: "reuse",
516+
waitForPostStart: false
517+
}).pipe(
518+
Effect.provideService(CommandExecutor.CommandExecutor, executor),
519+
Effect.either
520+
)
521+
)
522+
523+
expect(result._tag).toBe("Left")
524+
expect(recorded.filter((entry) => isDockerComposeUpReuse(entry)).length).toBe(1)
525+
expect(recorded.some((entry) => isDockerComposeUpWithBuild(entry))).toBe(false)
526+
})
527+
).pipe(Effect.provide(NodeContext.layer)))
491528
})

0 commit comments

Comments
 (0)