From 258889cdea2eac0321a021e4f6258c40b4178af5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Morav=C4=8D=C3=ADk?= Date: Sun, 11 Jan 2026 19:03:01 +0100 Subject: [PATCH 1/3] fix: use `contextName` to generate container name --- packages/k8s/src/hooks/prepare-job.ts | 4 +- packages/k8s/src/k8s/utils.ts | 10 ++--- packages/k8s/tests/k8s-utils-test.ts | 56 ++++++++++++++++++-------- packages/k8s/tests/prepare-job-test.ts | 2 +- 4 files changed, 47 insertions(+), 25 deletions(-) diff --git a/packages/k8s/src/hooks/prepare-job.ts b/packages/k8s/src/hooks/prepare-job.ts index 28453c17..70c18d10 100644 --- a/packages/k8s/src/hooks/prepare-job.ts +++ b/packages/k8s/src/hooks/prepare-job.ts @@ -62,7 +62,7 @@ export async function prepareJob( services = args.services.map(service => { return createContainerSpec( service, - generateContainerName(service.image), + generateContainerName(service), false, extension ) @@ -193,7 +193,7 @@ function generateResponseFile( if (args.services?.length) { const serviceContainerNames = - args.services?.map(s => generateContainerName(s.image)) || [] + args.services?.map(s => generateContainerName(s)) || [] response.context['services'] = appPod?.spec?.containers ?.filter(c => serviceContainerNames.includes(c.name)) diff --git a/packages/k8s/src/k8s/utils.ts b/packages/k8s/src/k8s/utils.ts index ebb5a238..855dcdce 100644 --- a/packages/k8s/src/k8s/utils.ts +++ b/packages/k8s/src/k8s/utils.ts @@ -5,7 +5,7 @@ import * as core from '@actions/core' import { v1 as uuidv4 } from 'uuid' import { CONTAINER_EXTENSION_PREFIX } from '../hooks/constants' import * as shlex from 'shlex' -import { Mount } from 'hooklib' +import { Mount, ServiceContainerInfo } from 'hooklib' export const DEFAULT_CONTAINER_ENTRY_POINT_ARGS = [`-f`, `/dev/null`] export const DEFAULT_CONTAINER_ENTRY_POINT = 'tail' @@ -156,15 +156,15 @@ function scriptEnv(envs?: { [key: string]: string }): string { return `env ${envBuffer.join(' ')} ` } -export function generateContainerName(image: string): string { - const nameWithTag = image.split('/').pop() +export function generateContainerName(service: ServiceContainerInfo): string { + const nameWithTag = service.image.split('/').pop() const name = nameWithTag?.split(':')[0] if (!name) { - throw new Error(`Image definition '${image}' is invalid`) + throw new Error(`Image definition '${service.image}' is invalid`) } - return name + return `${service.contextName}_${name}` } // Overwrite or append based on container options diff --git a/packages/k8s/tests/k8s-utils-test.ts b/packages/k8s/tests/k8s-utils-test.ts index bfb6c453..f78e451b 100644 --- a/packages/k8s/tests/k8s-utils-test.ts +++ b/packages/k8s/tests/k8s-utils-test.ts @@ -201,30 +201,52 @@ describe('k8s utils', () => { }) describe('generate container name', () => { - it('should return the container name from image string', () => { + it('should return the container name from "contextName" and "image" strings combined', () => { expect( - generateContainerName('public.ecr.aws/localstack/localstack') - ).toEqual('localstack') + generateContainerName({ + contextName: 'localstack', + image: 'public.ecr.aws/localstack/localstack' + }) + ).toEqual('localstack_localstack') expect( - generateContainerName( - 'public.ecr.aws/url/with/multiple/slashes/postgres:latest' - ) - ).toEqual('postgres') - expect(generateContainerName('postgres')).toEqual('postgres') - expect(generateContainerName('postgres:latest')).toEqual('postgres') - expect(generateContainerName('localstack/localstack')).toEqual( - 'localstack' - ) - expect(generateContainerName('localstack/localstack:latest')).toEqual( - 'localstack' - ) + generateContainerName({ + contextName: 'postgres', + image: 'public.ecr.aws/url/with/multiple/slashes/postgres:latest' + }) + ).toEqual('postgres_postgres') + expect( + generateContainerName({ contextName: 'postgres1', image: 'postgres' }) + ).toEqual('postgres1_postgres') + expect( + generateContainerName({ + contextName: 'postgres', + image: 'postgres:latest' + }) + ).toEqual('postgres_postgres') + expect( + generateContainerName({ + contextName: 'localstack1', + image: 'localstack/localstack' + }) + ).toEqual('localstack1_localstack') + expect( + generateContainerName({ + contextName: 'localstack2', + image: 'localstack/localstack:latest' + }) + ).toEqual('localstack2_localstack') }) it('should throw on invalid image string', () => { expect(() => - generateContainerName('localstack/localstack/:latest') + generateContainerName({ + contextName: 'invalid', + image: 'localstack/localstack/:latest' + }) + ).toThrow() + expect(() => + generateContainerName({ contextName: 'invalid', image: ':latest' }) ).toThrow() - expect(() => generateContainerName(':latest')).toThrow() }) }) diff --git a/packages/k8s/tests/prepare-job-test.ts b/packages/k8s/tests/prepare-job-test.ts index f73ee93b..c531279e 100644 --- a/packages/k8s/tests/prepare-job-test.ts +++ b/packages/k8s/tests/prepare-job-test.ts @@ -128,7 +128,7 @@ describe('Prepare job', () => { it('should not set command + args for service container if not passed in args', async () => { const services = prepareJobData.args.services.map(service => { - return createContainerSpec(service, generateContainerName(service.image)) + return createContainerSpec(service, generateContainerName(service)) }) as [V1Container] expect(services[0].command).toBe(undefined) From 904b832a1be2c7cb09dad8d7ad30ec8a7fcac523 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Morav=C4=8D=C3=ADk?= Date: Sun, 11 Jan 2026 19:09:17 +0100 Subject: [PATCH 2/3] fix: better variable name --- packages/k8s/src/k8s/utils.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/k8s/src/k8s/utils.ts b/packages/k8s/src/k8s/utils.ts index 855dcdce..5e979baa 100644 --- a/packages/k8s/src/k8s/utils.ts +++ b/packages/k8s/src/k8s/utils.ts @@ -157,14 +157,14 @@ function scriptEnv(envs?: { [key: string]: string }): string { } export function generateContainerName(service: ServiceContainerInfo): string { - const nameWithTag = service.image.split('/').pop() - const name = nameWithTag?.split(':')[0] + const imageNameWithTag = service.image.split('/').pop() + const imageName = imageNameWithTag?.split(':')[0] - if (!name) { + if (!imageName) { throw new Error(`Image definition '${service.image}' is invalid`) } - return `${service.contextName}_${name}` + return `${service.contextName}_${imageName}` } // Overwrite or append based on container options From 6e8f250ff27ec3f15060c69fb9eeb85bdbce7b33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20Morav=C4=8D=C3=ADk?= Date: Sun, 11 Jan 2026 21:15:25 +0100 Subject: [PATCH 3/3] fix: underscore -> hyphen --- packages/k8s/src/k8s/utils.ts | 2 +- packages/k8s/tests/k8s-utils-test.ts | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/k8s/src/k8s/utils.ts b/packages/k8s/src/k8s/utils.ts index 5e979baa..e8412c3a 100644 --- a/packages/k8s/src/k8s/utils.ts +++ b/packages/k8s/src/k8s/utils.ts @@ -164,7 +164,7 @@ export function generateContainerName(service: ServiceContainerInfo): string { throw new Error(`Image definition '${service.image}' is invalid`) } - return `${service.contextName}_${imageName}` + return `${service.contextName}-${imageName}` } // Overwrite or append based on container options diff --git a/packages/k8s/tests/k8s-utils-test.ts b/packages/k8s/tests/k8s-utils-test.ts index f78e451b..01d62b9f 100644 --- a/packages/k8s/tests/k8s-utils-test.ts +++ b/packages/k8s/tests/k8s-utils-test.ts @@ -207,34 +207,34 @@ describe('k8s utils', () => { contextName: 'localstack', image: 'public.ecr.aws/localstack/localstack' }) - ).toEqual('localstack_localstack') + ).toEqual('localstack-localstack') expect( generateContainerName({ contextName: 'postgres', image: 'public.ecr.aws/url/with/multiple/slashes/postgres:latest' }) - ).toEqual('postgres_postgres') + ).toEqual('postgres-postgres') expect( generateContainerName({ contextName: 'postgres1', image: 'postgres' }) - ).toEqual('postgres1_postgres') + ).toEqual('postgres1-postgres') expect( generateContainerName({ contextName: 'postgres', image: 'postgres:latest' }) - ).toEqual('postgres_postgres') + ).toEqual('postgres-postgres') expect( generateContainerName({ contextName: 'localstack1', image: 'localstack/localstack' }) - ).toEqual('localstack1_localstack') + ).toEqual('localstack1-localstack') expect( generateContainerName({ contextName: 'localstack2', image: 'localstack/localstack:latest' }) - ).toEqual('localstack2_localstack') + ).toEqual('localstack2-localstack') }) it('should throw on invalid image string', () => {