New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Optionally cancel all workflows but the latest #35
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -27,6 +27,7 @@ async function main() { | |
const token = core.getInput('access_token', { required: true }); | ||
const workflow_id = core.getInput('workflow_id', { required: false }); | ||
const ignore_sha = core.getInput('ignore_sha', { required: false }) === 'true'; | ||
const all_but_latest = core.getInput('all_but_latest', { required: false }); | ||
console.log(`Found token: ${token ? 'yes' : 'no'}`); | ||
const workflow_ids: string[] = []; | ||
const octokit = github.getOctokit(token); | ||
|
@@ -58,19 +59,22 @@ async function main() { | |
workflow_id, | ||
branch, | ||
}); | ||
console.log(`Found ${data.total_count} runs total.`); | ||
|
||
const branchWorkflows = data.workflow_runs.filter(run => run.head_branch === branch); | ||
console.log(`Found ${branchWorkflows.length} runs for workflow ${workflow_id} on branch ${branch}`); | ||
console.log(branchWorkflows.map(run => `- ${run.html_url}`).join('\n')); | ||
Comment on lines
-62
to
-64
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think the PR would be easier to review if this change was reverted and the filter below was not done in one big combination, but done separately as before. Then this whole part of the diff would disappear and the filter below would be simpler? That said, it doesn't look incorrect |
||
let cancel_before; | ||
if (all_but_latest) { | ||
cancel_before = new Date(data.workflow_runs.reduce((a, b) => Math.max(a.created_at, b.created_at))); | ||
} else { | ||
cancel_before = new Date(current_run.created_at); | ||
} | ||
|
||
const runningWorkflows = branchWorkflows.filter(run => | ||
(ignore_sha || run.head_sha !== headSha) && | ||
run.status !== 'completed' && | ||
new Date(run.created_at) < new Date(current_run.created_at) | ||
const runningWorkflows = data.workflow_runs.filter( | ||
run => run.head_branch === branch && (ignore_sha || run.head_sha !== headSha) && run.status !== 'completed' && | ||
run != current_run && | ||
new Date(run.created_at) < cancel_before | ||
); | ||
console.log(`with ${runningWorkflows.length} runs to cancel.`); | ||
|
||
for (const {id, head_sha, status, html_url} of runningWorkflows) { | ||
console.log(`Found ${runningWorkflows.length} runs to cancel.`); | ||
for (const {id, head_sha, status} of runningWorkflows) { | ||
console.log('Canceling run: ', {id, head_sha, status, html_url}); | ||
const res = await octokit.actions.cancelWorkflowRun({ | ||
owner, | ||
|
@@ -79,6 +83,17 @@ async function main() { | |
}); | ||
console.log(`Cancel run ${id} responded with status ${res.status}`); | ||
} | ||
// Make sure we cancel this run itself if it's out-of-date. | ||
// We postponed canceling this run because otherwise we couldn't cancel the rest. | ||
if (all_but_latest && new Date(current_run.created_at) < cancel_before) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What's the purpose of this There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I can't have a run cancel itself before it has had a chance to cancel others. However, I think https://github.com/styfle/cancel-workflow-action/pull/35/files#diff-a2a171449d862fe29692ce031981047d7ab755ae7f84c707aef80701b3ea0c80R69 is a bit sloppy and might break this action if you're not using There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ah, no, if you're not There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Why would this run cancel itself? Shouldn't it always allow itself to run? Otherwise you would have nothing running, everything would cancel everything. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It should cancel itself if it's not the most recent run |
||
const id = current_run.id; | ||
const res = await octokit.actions.cancelWorkflowRun({ | ||
owner, | ||
repo, | ||
run_id: id | ||
}); | ||
console.log(`Cancel run ${id} responded with status ${res.status}`); | ||
} | ||
} catch (e) { | ||
const msg = e.message || e; | ||
console.log(`Error while canceling workflow_id ${workflow_id}: ${msg}`); | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this should probably no longer have
required:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
yeah it is not actually in 0.8.0? that requirement was removed. Also in the "TIL" department from #59 I learned that YAML won't consider it a string anyway, unless it's in quotes, and the Actions spec says those should be strings. Who knew?