Skip to content

Commit fbfdb57

Browse files
committed
refactor(cli,webapp): simplify instance base image handling
1 parent a8dfe94 commit fbfdb57

5 files changed

Lines changed: 16 additions & 40 deletions

File tree

‎apps/webapp/app/v3/deployBaseImages.server.ts‎

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,10 @@ import { BuildRuntime, DeployBaseImageRef } from "@trigger.dev/core/v3";
22

33
type BaseImageMap = Partial<Record<BuildRuntime, string>>;
44

5-
export type ParsedDeployBaseImages = { images: BaseImageMap; errors: string[] };
6-
75
export function parseDeployBaseImages(
86
value: string | undefined,
97
envVarName: string
10-
): ParsedDeployBaseImages {
8+
): { images: BaseImageMap; errors: string[] } {
119
const images: BaseImageMap = {};
1210
const errors: string[] = [];
1311

@@ -75,12 +73,5 @@ export function resolveDeployBaseImages(
7573
const base = config.base[parsedRuntime.data];
7674
const buildBase = config.buildBase[parsedRuntime.data];
7775

78-
if (!base && !buildBase) {
79-
return undefined;
80-
}
81-
82-
return {
83-
...(base ? { base } : {}),
84-
...(buildBase ? { buildBase } : {}),
85-
};
76+
return base || buildBase ? { base, buildBase } : undefined;
8677
}

‎apps/webapp/test/deployBaseImages.test.ts‎

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ const digestA = `sha256:${"a".repeat(64)}`;
55
const digestB = `sha256:${"b".repeat(64)}`;
66
const digestC = `sha256:${"c".repeat(64)}`;
77

8-
const hex64 = "a".repeat(64);
9-
108
describe("parseDeployBaseImages", () => {
119
it("returns an empty map for undefined and empty values", () => {
1210
const empty = { images: {}, errors: [] };
@@ -31,7 +29,7 @@ describe("parseDeployBaseImages", () => {
3129
});
3230

3331
it("accepts a registry with a port and a tag before the digest", () => {
34-
const image = `registry.example.com:5000/ns/img:tag@sha256:${hex64}`;
32+
const image = `registry.example.com:5000/ns/img:tag@${digestA}`;
3533
expect(parseDeployBaseImages(`node-24=${image}`, "DEPLOY_BASE_IMAGES")).toEqual({
3634
images: { "node-24": image },
3735
errors: [],
@@ -44,9 +42,9 @@ describe("parseDeployBaseImages", () => {
4442
["node alias", `node=acme/node:24@${digestA}`],
4543
["empty image", "node-24="],
4644
["missing digest", "node-24=acme/node:24"],
47-
["flag before image", `node-24=--platform=linux/arm64 acme/node@sha256:${hex64}`],
48-
["bare digest", `node-24=@sha256:${hex64}`],
49-
["newline in image", `node-24=acme/node\nx@sha256:${hex64}`],
45+
["flag before image", `node-24=--platform=linux/arm64 acme/node@${digestA}`],
46+
["bare digest", `node-24=@${digestA}`],
47+
["newline in image", `node-24=acme/node\nx@${digestA}`],
5048
["duplicate runtime", `node-24=acme/a@${digestA},node-24=acme/b@${digestB}`],
5149
])("reports an error naming the env var and segment: %s", (_name, value) => {
5250
const segments = value.split(",");
@@ -84,11 +82,8 @@ describe("resolveDeployBaseImages", () => {
8482
const base = { "node-26": `acme/node-fips:26@${digestA}` } as const;
8583
const buildBase = { "node-26": `acme/node:26-dev@${digestB}` } as const;
8684

87-
it("returns undefined for an unknown runtime", () => {
85+
it("returns undefined for a missing or unknown runtime", () => {
8886
expect(resolveDeployBaseImages("node-23", { base, buildBase })).toBeUndefined();
89-
});
90-
91-
it("returns undefined when the deployment has no runtime", () => {
9287
expect(resolveDeployBaseImages(null, { base, buildBase })).toBeUndefined();
9388
expect(resolveDeployBaseImages(undefined, { base, buildBase })).toBeUndefined();
9489
});

‎packages/cli-v3/src/commands/deploy.ts‎

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,8 +1225,6 @@ async function applyServerBaseImages({
12251225
return;
12261226
}
12271227

1228-
logger.debug("Using base images required by the server", baseImages);
1229-
12301228
const required = [
12311229
baseImages.base ? `base ${baseImages.base}` : undefined,
12321230
baseImages.buildBase ? `build ${baseImages.buildBase}` : undefined,

‎packages/cli-v3/src/deploy/buildImage.test.ts‎

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -292,8 +292,6 @@ describe("generateContainerfile", () => {
292292
expect(buildStage).toContain(
293293
"apt-get install -y --no-install-recommends --allow-downgrades jq"
294294
);
295-
expect(buildStage).toContain("RUN echo first > /etc/first");
296-
expect(buildStage).toContain("RUN echo second > /etc/second");
297295
expect(containerfile.indexOf("RUN echo first > /etc/first")).toBeLessThan(
298296
containerfile.indexOf("AS build")
299297
);
@@ -306,9 +304,6 @@ describe("generateContainerfile", () => {
306304
containerfile.indexOf(buildFrom) - "\n\n".length
307305
);
308306

309-
expect(buildStage.indexOf("RUN echo second > /etc/second")).toBeLessThan(
310-
buildStage.indexOf("apt-get install")
311-
);
312307
expect(containerfile).toContain(`${buildFrom}\n\n${baseEnv}${baseCustomization}\n\n`);
313308
});
314309

‎packages/cli-v3/src/deploy/buildImage.ts‎

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -799,22 +799,19 @@ const parseGenerateOptions = (options: GenerateContainerfileOptions) => {
799799
.filter(Boolean)
800800
.join("\n\n");
801801

802-
const prebuiltBuildStage = `FROM ${options.image?.buildBase ?? BUILD_IMAGE[options.runtime]} AS build
803-
804-
ENV DEBIAN_FRONTEND=noninteractive${
805-
userPackages.length > 0 ? `\n\n${aptInstall(userPackages, { repair: false })}` : ""
806-
}`;
807-
808-
const buildStage = !baseInstructions // FROM base runs instructions once: unbounded downloads
809-
? prebuiltBuildStage
810-
: options.image?.buildBase
811-
? `FROM ${options.image.buildBase} AS build\n\nENV DEBIAN_FRONTEND=noninteractive\n\n${customization}`
812-
: `FROM base AS build
802+
// Instructions run once (FROM base) since their downloads are unbounded;
803+
// package-only projects keep the prebuilt toolchain and repeat the small install
804+
const buildStage =
805+
baseInstructions && !options.image?.buildBase
806+
? `FROM base AS build
813807
814808
RUN apt-get update && \\
815809
apt-get install -y --no-install-recommends ${TOOLCHAIN_PACKAGES} && \\
816810
apt-get clean && \\
817-
rm -rf /var/lib/apt/lists/*`;
811+
rm -rf /var/lib/apt/lists/*`
812+
: `FROM ${options.image?.buildBase ?? BUILD_IMAGE[options.runtime]} AS build
813+
814+
ENV DEBIAN_FRONTEND=noninteractive${customization ? `\n\n${customization}` : ""}`;
818815

819816
return {
820817
baseImage: options.image?.base ?? BASE_IMAGE[options.runtime],

0 commit comments

Comments
 (0)