diff --git a/lambdas/functions/control-plane/src/aws/runners.d.ts b/lambdas/functions/control-plane/src/aws/runners.d.ts index 3a1b31b1cf..2eb0770528 100644 --- a/lambdas/functions/control-plane/src/aws/runners.d.ts +++ b/lambdas/functions/control-plane/src/aws/runners.d.ts @@ -43,4 +43,5 @@ export interface RunnerInputParameters { amiIdSsmParameterName?: string; tracingEnabled?: boolean; onDemandFailoverOnError?: string[]; + workflowUrl?: string; } diff --git a/lambdas/functions/control-plane/src/aws/runners.ts b/lambdas/functions/control-plane/src/aws/runners.ts index dfe4d99fcf..cddb104868 100644 --- a/lambdas/functions/control-plane/src/aws/runners.ts +++ b/lambdas/functions/control-plane/src/aws/runners.ts @@ -244,6 +244,10 @@ async function createInstances( tags.push({ Key: 'ghr:trace_id', Value: traceId! }); } + if (runnerParameters.workflowUrl) { + tags.push({ Key: 'ghr:workflow_url', Value: runnerParameters.workflowUrl }); + } + let fleet: CreateFleetResult; try { // see for spec https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet.html diff --git a/lambdas/functions/control-plane/src/scale-runners/scale-up.ts b/lambdas/functions/control-plane/src/scale-runners/scale-up.ts index 08d16d682a..20b04ded35 100644 --- a/lambdas/functions/control-plane/src/scale-runners/scale-up.ts +++ b/lambdas/functions/control-plane/src/scale-runners/scale-up.ts @@ -31,6 +31,7 @@ export interface ActionRequestMessage { installationId: number; repoOwnerType: string; retryCounter?: number; + workflowUrl?: string; } export interface ActionRequestMessageRetry extends ActionRequestMessage { @@ -49,6 +50,7 @@ interface CreateGitHubRunnerConfig { disableAutoUpdate: boolean; ssmTokenPath: string; ssmConfigPath: string; + jobId?: number; } interface CreateEC2RunnerConfig { @@ -60,6 +62,7 @@ interface CreateEC2RunnerConfig { amiIdSsmParameterName?: string; tracingEnabled?: boolean; onDemandFailoverOnError?: string[]; + workflowUrl?: string; } function generateRunnerServiceConfig(githubRunnerConfig: CreateGitHubRunnerConfig, token: string) { @@ -217,6 +220,7 @@ export async function createRunners( runnerType: githubRunnerConfig.runnerType, runnerOwner: githubRunnerConfig.runnerOwner, numberOfRunners: 1, + githubJobId: githubRunnerConfig.jobId?.toString(), ...ec2RunnerConfig, }); if (instances.length !== 0) { @@ -225,7 +229,9 @@ export async function createRunners( } export async function scaleUp(eventSource: string, payload: ActionRequestMessage): Promise { - logger.info(`Received ${payload.eventType} from ${payload.repositoryOwner}/${payload.repositoryName}`); + logger.info( + `Received ${payload.eventType} from ${payload.repositoryOwner}/${payload.repositoryName} Workflow URL: ${payload.workflowUrl}`, + ); if (eventSource !== 'aws:sqs') throw Error('Cannot handle non-SQS events!'); const enableOrgLevel = yn(process.env.ENABLE_ORGANIZATION_RUNNERS, { default: true }); @@ -321,6 +327,7 @@ export async function scaleUp(eventSource: string, payload: ActionRequestMessage disableAutoUpdate, ssmTokenPath, ssmConfigPath, + jobId: payload.id, }, { ec2instanceCriteria: { @@ -335,6 +342,7 @@ export async function scaleUp(eventSource: string, payload: ActionRequestMessage amiIdSsmParameterName, tracingEnabled, onDemandFailoverOnError, + workflowUrl: payload.workflowUrl, }, githubInstallationClient, ); diff --git a/lambdas/functions/webhook/src/runners/dispatch.ts b/lambdas/functions/webhook/src/runners/dispatch.ts index a7a3a0307c..e4d28acebd 100644 --- a/lambdas/functions/webhook/src/runners/dispatch.ts +++ b/lambdas/functions/webhook/src/runners/dispatch.ts @@ -37,7 +37,7 @@ async function handleWorkflowJob( }); for (const queue of matcherConfig) { if (canRunJob(body.workflow_job.labels, queue.matcherConfig.labelMatchers, queue.matcherConfig.exactMatch)) { - await sendActionRequest({ + const actionRequest = { id: body.workflow_job.id, repositoryName: body.repository.name, repositoryOwner: body.repository.owner.login, @@ -45,7 +45,11 @@ async function handleWorkflowJob( installationId: body.installation?.id ?? 0, queueId: queue.id, repoOwnerType: body.repository.owner.type, - }); + workflowUrl: body.workflow_job.run_url, + }; + logger.info(`Action request: ${JSON.stringify(actionRequest)}`); + await sendActionRequest(actionRequest); + logger.info(`Successfully dispatched job for ${body.repository.full_name} to the queue ${queue.id}`); return { statusCode: 201, diff --git a/lambdas/functions/webhook/src/sqs/index.ts b/lambdas/functions/webhook/src/sqs/index.ts index a028d7dcc4..cf9e836583 100644 --- a/lambdas/functions/webhook/src/sqs/index.ts +++ b/lambdas/functions/webhook/src/sqs/index.ts @@ -12,6 +12,7 @@ export interface ActionRequestMessage { installationId: number; queueId: string; repoOwnerType: string; + workflowUrl?: string; } export interface MatcherConfig {