diff --git a/src/main.ts b/src/main.ts index 0b6ae6d..4f4076e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -96,7 +96,7 @@ export async function run(): Promise { try { // Get action inputs const image = getInput('image'); // Image ie gcr.io/... - const service = getInput('service'); // Service name + let service = getInput('service'); // Service name const job = getInput('job'); // Job name const metadata = getInput('metadata'); // YAML file const projectId = getInput('project_id'); @@ -156,6 +156,19 @@ export async function run(): Promise { const contents = await readFile(metadata, 'utf8'); const parsed = parseYAML(contents); + // Extract service name from metadata template + const name = parsed?.metadata?.name; + if (!name) { + throw new Error(`${metadata} is missing 'metadata.name'`); + } + if (service && service != name) { + throw new Error( + `service name in ${metadata} ("${name}") does not match GitHub ` + + `Actions service input ("${service}")`, + ); + } + service = name; + const kind = parsed?.kind; if (kind === 'Service') { deployCmd = ['run', 'services', 'replace', metadata]; diff --git a/tests/unit/main.test.ts b/tests/unit/main.test.ts index 4b2f2a0..a0cac83 100644 --- a/tests/unit/main.test.ts +++ b/tests/unit/main.test.ts @@ -337,6 +337,31 @@ test('#run', { concurrency: true }, async (suite) => { assertMembers(args, ['services', 'replace']); }); + await suite.test('errors if metadata is given and the service names do not match', async (t) => { + defaultMocks(t.mock, { + metadata: 'tests/fixtures/service.yaml', + service: 'not-a-match', + }); + + await assert.rejects( + async () => { + await run(); + }, + { message: /does not match/ }, + ); + }); + + await suite.test('does not error if metadata is given and the service names match', async (t) => { + defaultMocks(t.mock, { + metadata: 'tests/fixtures/service.yaml', + service: 'run-full-yaml', + }); + + await assert.doesNotReject(async () => { + await run(); + }); + }); + await suite.test('sets job metadata if given', async (t) => { const mocks = defaultMocks(t.mock, { metadata: 'tests/fixtures/job.yaml',