From 1b940a31d56b4ec28ed4448b7e1ec577c0eea795 Mon Sep 17 00:00:00 2001 From: Michael J Mulligan Date: Tue, 6 Apr 2021 23:59:07 +0100 Subject: [PATCH] Better Job Name resolution (fewer false positives), increase multi-case pause. --- dist/post_run/index.js | 13 ++++++------- dist/run/index.js | 13 ++++++------- src/run.ts | 12 ++++++------ 3 files changed, 18 insertions(+), 20 deletions(-) diff --git a/dist/post_run/index.js b/dist/post_run/index.js index 4ee21bf..fd95523 100644 --- a/dist/post_run/index.js +++ b/dist/post_run/index.js @@ -6843,24 +6843,23 @@ function resolveCheckRunId() { core.info(`Attempting to resolve current GitHub Job (${ctx.runId})`); const octokit = github.getOctokit(core.getInput(`github-token`, { required: true })); const { data: workflowResponse } = yield octokit.actions - .listJobsForWorkflowRun(Object.assign(Object.assign({}, ctx.repo), { run_id: ctx.runId })) + .listJobsForWorkflowRun(Object.assign(Object.assign({}, ctx.repo), { run_id: ctx.runId, status: "in_progress" })) .catch((e) => { throw `Unable to fetch Workflow Job List: ${e}`; }); if (workflowResponse.jobs.length > 0) { core.info(`resolveCheckRunId() Found ${workflowResponse.jobs.length} Jobs:\n` + util_1.inspect(workflowResponse.jobs)); if (workflowResponse.jobs.length > 1) { - const jobs = workflowResponse.jobs.filter((run) => run.name.includes(ctx.job)); - core.info(`resolveCheckRunId() Found ${jobs.length} Jobs whose name includes '${ctx.job}'`); + const searchRegExp = new RegExp(`/^` + ctx.job.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + `(\\s+\\(|$)/`); + const jobs = workflowResponse.jobs.filter((run) => searchRegExp.test(run.name)); + core.info(`resolveCheckRunId() Found ${jobs.length} Jobs whose base name is '${ctx.job}'`); workflowResponse.jobs = jobs.length ? jobs : workflowResponse.jobs; } if (workflowResponse.jobs.length > 1) { const searchToken = uuid_1.v4(); core.info(`::warning::[ignore] Resolving GitHub Job with Search Token: ${searchToken}`); - yield ((ms) => { - core.info(`resolveCheckRunId() Sleeping for ${ms / 1000} Seconds`); - return new Promise((resolve) => setTimeout(resolve, ms)); - })(2 * 1000); + // Sleep for MS, to allow Annotation to be captured and populated + yield ((ms) => new Promise((resolve) => setTimeout(resolve, ms)))(5 * 1000); for (const job of workflowResponse.jobs) { try { const { data: annotations } = yield octokit.checks.listAnnotations(Object.assign(Object.assign({}, ctx.repo), { check_run_id: job.id })); diff --git a/dist/run/index.js b/dist/run/index.js index bb3909d..1a2727d 100644 --- a/dist/run/index.js +++ b/dist/run/index.js @@ -6853,24 +6853,23 @@ function resolveCheckRunId() { core.info(`Attempting to resolve current GitHub Job (${ctx.runId})`); const octokit = github.getOctokit(core.getInput(`github-token`, { required: true })); const { data: workflowResponse } = yield octokit.actions - .listJobsForWorkflowRun(Object.assign(Object.assign({}, ctx.repo), { run_id: ctx.runId })) + .listJobsForWorkflowRun(Object.assign(Object.assign({}, ctx.repo), { run_id: ctx.runId, status: "in_progress" })) .catch((e) => { throw `Unable to fetch Workflow Job List: ${e}`; }); if (workflowResponse.jobs.length > 0) { core.info(`resolveCheckRunId() Found ${workflowResponse.jobs.length} Jobs:\n` + util_1.inspect(workflowResponse.jobs)); if (workflowResponse.jobs.length > 1) { - const jobs = workflowResponse.jobs.filter((run) => run.name.includes(ctx.job)); - core.info(`resolveCheckRunId() Found ${jobs.length} Jobs whose name includes '${ctx.job}'`); + const searchRegExp = new RegExp(`/^` + ctx.job.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + `(\\s+\\(|$)/`); + const jobs = workflowResponse.jobs.filter((run) => searchRegExp.test(run.name)); + core.info(`resolveCheckRunId() Found ${jobs.length} Jobs whose base name is '${ctx.job}'`); workflowResponse.jobs = jobs.length ? jobs : workflowResponse.jobs; } if (workflowResponse.jobs.length > 1) { const searchToken = uuid_1.v4(); core.info(`::warning::[ignore] Resolving GitHub Job with Search Token: ${searchToken}`); - yield ((ms) => { - core.info(`resolveCheckRunId() Sleeping for ${ms / 1000} Seconds`); - return new Promise((resolve) => setTimeout(resolve, ms)); - })(2 * 1000); + // Sleep for MS, to allow Annotation to be captured and populated + yield ((ms) => new Promise((resolve) => setTimeout(resolve, ms)))(5 * 1000); for (const job of workflowResponse.jobs) { try { const { data: annotations } = yield octokit.checks.listAnnotations(Object.assign(Object.assign({}, ctx.repo), { check_run_id: job.id })); diff --git a/src/run.ts b/src/run.ts index a103dc8..31376aa 100644 --- a/src/run.ts +++ b/src/run.ts @@ -251,6 +251,7 @@ async function resolveCheckRunId(): Promise { .listJobsForWorkflowRun({ ...ctx.repo, run_id: ctx.runId, + status: "in_progress", }) .catch((e: string) => { throw `Unable to fetch Workflow Job List: ${e}` @@ -259,17 +260,16 @@ async function resolveCheckRunId(): Promise { if (workflowResponse.jobs.length > 0) { core.info(`resolveCheckRunId() Found ${workflowResponse.jobs.length} Jobs:\n` + inspect(workflowResponse.jobs)) if (workflowResponse.jobs.length > 1) { - const jobs = workflowResponse.jobs.filter((run) => run.name.includes(ctx.job)) - core.info(`resolveCheckRunId() Found ${jobs.length} Jobs whose name includes '${ctx.job}'`) + const searchRegExp = new RegExp(`/^` + ctx.job.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + `(\\s+\\(|$)/`) + const jobs = workflowResponse.jobs.filter((run) => searchRegExp.test(run.name)) + core.info(`resolveCheckRunId() Found ${jobs.length} Jobs whose base name is '${ctx.job}'`) workflowResponse.jobs = jobs.length ? jobs : workflowResponse.jobs } if (workflowResponse.jobs.length > 1) { const searchToken = uuidv4() core.info(`::warning::[ignore] Resolving GitHub Job with Search Token: ${searchToken}`) - await ((ms): Promise => { - core.info(`resolveCheckRunId() Sleeping for ${ms / 1000} Seconds`) - return new Promise((resolve) => setTimeout(resolve, ms)) - })(2 * 1000) + // Sleep for MS, to allow Annotation to be captured and populated + await ((ms): Promise => new Promise((resolve) => setTimeout(resolve, ms)))(5 * 1000) for (const job of workflowResponse.jobs) { try { const { data: annotations } = await octokit.checks.listAnnotations({