4
4
5
5
import { Octokit } from 'octokit'
6
6
7
- const { DAYS = '1' } = process . env
7
+ const { DAYS = '1' , OCCURRENCES = '1' } = process . env
8
8
9
9
const ONE_DAY = 24 * 60 * 60 * 1000
10
10
@@ -24,6 +24,7 @@ const workflows = [
24
24
]
25
25
26
26
const flaky = { }
27
+ const reported = new Set ( )
27
28
28
29
async function checkWorkflowRuns ( id , page = 1 ) {
29
30
const response = await octokit . rest . actions . listWorkflowRuns ( {
@@ -79,10 +80,15 @@ async function checkWorkflowJobs (id, page = 1) {
79
80
if ( job . conclusion !== 'failure' ) continue
80
81
81
82
const workflow = job . workflow_name
83
+ const name = job . name . split ( ' ' ) [ 0 ] // Merge matrix runs of same job together.
82
84
83
- flaky [ workflow ] = flaky [ workflow ] || { }
84
- flaky [ workflow ] [ job . name ] = flaky [ workflow ] [ job . name ] || [ ]
85
- flaky [ workflow ] [ job . name ] . push ( job . html_url )
85
+ flaky [ workflow ] ??= { }
86
+ flaky [ workflow ] [ name ] ??= [ ]
87
+ flaky [ workflow ] [ name ] . push ( job . html_url )
88
+
89
+ if ( flaky [ workflow ] [ name ] . length >= OCCURRENCES ) {
90
+ reported . add ( workflow )
91
+ }
86
92
}
87
93
88
94
return checkWorkflowJobs ( id , page + 1 )
@@ -92,15 +98,17 @@ await Promise.all(workflows.map(w => checkWorkflowRuns(w)))
92
98
93
99
// TODO: Report this somewhere useful instead.
94
100
if ( Object . keys ( flaky ) . length === 0 ) {
95
- console . log ( `*No flaky jobs seen in the last ${ DAYS > 1 ? `${ DAYS } days` : 'day' } *` )
101
+ console . log ( `*No flaky jobs with at least ${ OCCURRENCES } seen in the last ${ DAYS > 1 ? `${ DAYS } days` : 'day' } *` )
96
102
} else {
97
- console . log ( `*Flaky jobs seen in the last ${ DAYS > 1 ? `${ DAYS } days` : 'day' } *` )
103
+ console . log ( `*Flaky jobs with at least ${ OCCURRENCES } seen in the last ${ DAYS > 1 ? `${ DAYS } days` : 'day' } *` )
98
104
for ( const [ workflow , jobs ] of Object . entries ( flaky ) . sort ( ) ) {
105
+ if ( ! reported . has ( workflow ) ) continue
99
106
console . log ( `* ${ workflow } ` )
100
107
for ( const [ job , urls ] of Object . entries ( jobs ) . sort ( ) ) {
108
+ if ( urls . length < OCCURRENCES ) continue
101
109
console . log ( ` * ${ job } ` )
102
110
for ( const url of urls . sort ( ) ) {
103
- console . log ( ` * ${ url } ` )
111
+ console . log ( ` * [ ${ url . replace ( 'https://github.com/DataDog/' , '' ) } ]( ${ url } ) ` )
104
112
}
105
113
}
106
114
}
0 commit comments