Skip to content

Commit 9f735e5

Browse files
committed
feat(runners): add origin property to runner parameters and update related logic
1 parent 391a65f commit 9f735e5

6 files changed

Lines changed: 71 additions & 1 deletion

File tree

lambdas/functions/control-plane/src/aws/runners.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,5 @@ export interface RunnerInputParameters {
4444
amiIdSsmParameterName?: string;
4545
tracingEnabled?: boolean;
4646
onDemandFailoverOnError?: string[];
47+
origin?: string;
4748
}

lambdas/functions/control-plane/src/aws/runners.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,10 @@ async function createInstances(
256256
{ Key: 'ghr:Owner', Value: runnerParameters.runnerOwner },
257257
];
258258

259+
if (runnerParameters.origin) {
260+
tags.push({ Key: 'ghr:origin', Value: runnerParameters.origin });
261+
}
262+
259263
if (runnerParameters.tracingEnabled) {
260264
const traceId = tracer.getRootXrayTraceId();
261265
tags.push({ Key: 'ghr:trace_id', Value: traceId! });

lambdas/functions/control-plane/src/scale-runners/job-retry.test.ts

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,7 @@ describe(`Test job retry check`, () => {
168168
expect(publishMessage).toHaveBeenCalledWith(
169169
JSON.stringify({
170170
...message,
171+
origin: 'job-retry',
171172
}),
172173
'https://sqs.eu-west-1.amazonaws.com/123456789/webhook_events_workflow_job_queue',
173174
);
@@ -206,6 +207,7 @@ describe(`Test job retry check`, () => {
206207
expect(publishMessage).toHaveBeenCalledWith(
207208
JSON.stringify({
208209
...message,
210+
origin: 'job-retry',
209211
}),
210212
'https://sqs.eu-west-1.amazonaws.com/123456789/webhook_events_workflow_job_queue',
211213
);
@@ -270,6 +272,41 @@ describe(`Test job retry check`, () => {
270272
// assert
271273
expect(publishMessage).not.toHaveBeenCalled();
272274
});
275+
276+
it('should set origin to job-retry when publishing message for retry', async () => {
277+
// setup
278+
mockOctokit.actions.getJobForWorkflowRun.mockImplementation(() => ({
279+
data: {
280+
status: 'queued',
281+
},
282+
}));
283+
284+
const message: ActionRequestMessageRetry = {
285+
eventType: 'workflow_job',
286+
id: 0,
287+
installationId: 0,
288+
repositoryName: 'test',
289+
repositoryOwner: 'github-aws-runners',
290+
repoOwnerType: 'Organization',
291+
retryCounter: 0,
292+
};
293+
process.env.ENABLE_ORGANIZATION_RUNNERS = 'true';
294+
process.env.RUNNER_NAME_PREFIX = 'test';
295+
process.env.JOB_QUEUE_SCALE_UP_URL =
296+
'https://sqs.eu-west-1.amazonaws.com/123456789/webhook_events_workflow_job_queue';
297+
298+
// act
299+
await checkAndRetryJob(message);
300+
301+
// assert
302+
expect(publishMessage).toHaveBeenCalledWith(
303+
JSON.stringify({
304+
...message,
305+
origin: 'job-retry',
306+
}),
307+
'https://sqs.eu-west-1.amazonaws.com/123456789/webhook_events_workflow_job_queue',
308+
);
309+
});
273310
});
274311

275312
describe('Test job retry handler (batch processing)', () => {

lambdas/functions/control-plane/src/scale-runners/job-retry.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,9 @@ export async function checkAndRetryJob(payload: ActionRequestMessageRetry): Prom
6464

6565
// check job is still queued
6666
if (await isJobQueued(ghClient, payload)) {
67-
await publishMessage(JSON.stringify(payload), jobQueueUrl);
67+
// Set the origin to 'job-retry' when publishing back to the scale-up queue
68+
const retryPayload = { ...payload, origin: 'job-retry' };
69+
await publishMessage(JSON.stringify(retryPayload), jobQueueUrl);
6870
createMetric(enableMetrics, environment, payload);
6971
logger.info(`Job is still queued, message published to build queue and will be handled by scale-up.`, { payload });
7072
} else {

lambdas/functions/control-plane/src/scale-runners/scale-up.test.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ const EXPECTED_RUNNER_PARAMS: RunnerInputParameters = {
105105
subnets: ['subnet-123'],
106106
tracingEnabled: false,
107107
onDemandFailoverOnError: [],
108+
origin: 'build-queue',
108109
};
109110
let expectedRunnerParams: RunnerInputParameters;
110111

@@ -187,6 +188,27 @@ describe('scaleUp with GHES', () => {
187188
expect(listEC2Runners).not.toBeCalled();
188189
});
189190

191+
it('creates a runner with origin set to build-queue when no origin is provided', async () => {
192+
process.env.ENABLE_ORGANIZATION_RUNNERS = 'true';
193+
await scaleUpModule.scaleUp('aws:sqs', TEST_DATA);
194+
expect(createRunner).toBeCalledWith(
195+
expect.objectContaining({
196+
origin: 'build-queue',
197+
}),
198+
);
199+
});
200+
201+
it('creates a runner with origin from payload when provided', async () => {
202+
process.env.ENABLE_ORGANIZATION_RUNNERS = 'true';
203+
const testDataWithOrigin = { ...TEST_DATA, origin: 'job-retry' };
204+
await scaleUpModule.scaleUp('aws:sqs', testDataWithOrigin);
205+
expect(createRunner).toBeCalledWith(
206+
expect.objectContaining({
207+
origin: 'job-retry',
208+
}),
209+
);
210+
});
211+
190212
describe('on org level', () => {
191213
beforeEach(() => {
192214
process.env.ENABLE_ORGANIZATION_RUNNERS = 'true';

lambdas/functions/control-plane/src/scale-runners/scale-up.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export interface ActionRequestMessage {
2929
installationId: number;
3030
repoOwnerType: string;
3131
retryCounter?: number;
32+
origin?: string;
3233
}
3334

3435
export interface ActionRequestMessageSQS extends ActionRequestMessage {
@@ -62,6 +63,7 @@ interface CreateEC2RunnerConfig {
6263
amiIdSsmParameterName?: string;
6364
tracingEnabled?: boolean;
6465
onDemandFailoverOnError?: string[];
66+
origin?: string;
6567
}
6668

6769
function generateRunnerServiceConfig(githubRunnerConfig: CreateGitHubRunnerConfig, token: string) {
@@ -301,6 +303,7 @@ export async function scaleUp(payloads: ActionRequestMessageSQS[]): Promise<stri
301303
}
302304

303305
const key = enableOrgLevel ? payload.repositoryOwner : `${payload.repositoryOwner}/${payload.repositoryName}`;
306+
const origin = payload.origin || 'build-queue';
304307

305308
let entry = validMessages.get(key);
306309

@@ -431,6 +434,7 @@ export async function scaleUp(payloads: ActionRequestMessageSQS[]): Promise<stri
431434
amiIdSsmParameterName,
432435
tracingEnabled,
433436
onDemandFailoverOnError,
437+
origin,
434438
},
435439
newRunners,
436440
githubInstallationClient,

0 commit comments

Comments
 (0)