@@ -4,45 +4,21 @@ import * as artifact from "@actions/artifact";
4
4
import * as core from "@actions/core" ;
5
5
import type { Context } from "@actions/github/lib/context" ;
6
6
import type { GitHub } from "@actions/github/lib/utils" ;
7
- import type { components } from "@octokit/openapi-types" ;
8
7
import JSZip from "jszip" ;
9
8
10
9
type Octokit = InstanceType < typeof GitHub > ;
11
- type WorkflowRunJob = components [ "schemas" ] [ "job" ] ;
12
10
13
- type WorkflowArtifactMap = {
14
- [ job : string ] : {
15
- [ step : string ] : WorkflowArtifactDownload ;
16
- } ;
17
- } ;
18
-
19
- type WorkflowArtifactDownload = {
20
- jobName : string ;
21
- stepName : string ;
22
- path : string ;
23
- } ;
24
-
25
- type WorkflowArtifactLookup = ( jobName : string , stepName : string ) => WorkflowArtifactDownload | undefined ;
11
+ type JobName = string ;
12
+ type StepName = string ;
13
+ type ArtifactPath = string ;
26
14
27
- async function listWorkflowRunArtifacts (
28
- context : Context ,
29
- octokit : Octokit ,
30
- runId : number ,
31
- ) : Promise < WorkflowArtifactLookup > {
32
- let artifactsLookup : WorkflowArtifactMap = { } ;
15
+ type StepArtifactMap = Map < StepName , ArtifactPath > ;
16
+ type JobArtifactMap = Map < JobName , StepArtifactMap > ;
33
17
34
- if ( runId === context . runId ) {
35
- artifactsLookup = await getSelfArtifactMap ( ) ;
36
- } else {
37
- artifactsLookup = await getWorkflowRunArtifactMap ( context , octokit , runId ) ;
38
- }
39
- return ( jobName : string , stepName : string ) => {
40
- try {
41
- return artifactsLookup [ jobName ] [ stepName ] ;
42
- } catch ( _e ) {
43
- return undefined ;
44
- }
45
- } ;
18
+ async function listWorkflowRunArtifacts ( context : Context , octokit : Octokit , runId : number ) {
19
+ return runId === context . runId
20
+ ? await getSelfArtifactMap ( )
21
+ : await getWorkflowRunArtifactMap ( context , octokit , runId ) ;
46
22
}
47
23
48
24
const artifactNameRegex = / \{ (?< jobName > .* ) \} \{ (?< stepName > .* ) \} / ;
@@ -54,15 +30,14 @@ async function getWorkflowRunArtifactMap(context: Context, octokit: Octokit, run
54
30
per_page : 100 ,
55
31
} ) ;
56
32
57
- const artifactsLookup : WorkflowArtifactMap = await artifacts . reduce ( async ( resultP , artifact ) => {
58
- const result = await resultP ;
33
+ return await artifacts . reduce ( async ( resultP : Promise < JobArtifactMap > , artifact ) => {
34
+ const next = await resultP ;
59
35
const match = artifact . name . match ( artifactNameRegex ) ;
60
- const next : WorkflowArtifactMap = { ...result } ;
61
36
if ( match ?. groups ?. [ "jobName" ] && match ?. groups ?. [ "stepName" ] ) {
62
37
const { jobName, stepName } = match . groups ;
63
38
core . debug ( `Found Artifact for Job<${ jobName } > Step<${ stepName } >` ) ;
64
- if ( ! ( jobName in next ) ) {
65
- next [ jobName ] = { } ;
39
+ if ( ! next . has ( jobName ) ) {
40
+ next . set ( jobName , new Map ( ) ) ;
66
41
}
67
42
68
43
const downloadResponse = await octokit . rest . actions . downloadArtifact ( {
@@ -77,11 +52,7 @@ async function getWorkflowRunArtifactMap(context: Context, octokit: Octokit, run
77
52
// useful for testing because the artifact url expires after 1 minute
78
53
if ( fs . existsSync ( `${ artifact . name } .log` ) ) {
79
54
core . debug ( `Artifact ${ artifact . name } already exists, skipping download` ) ;
80
- next [ jobName ] [ stepName ] = {
81
- jobName,
82
- stepName,
83
- path : filename ,
84
- } ;
55
+ next . get ( jobName ) ?. set ( stepName , filename ) ;
85
56
return next ;
86
57
}
87
58
@@ -93,86 +64,54 @@ async function getWorkflowRunArtifactMap(context: Context, octokit: Octokit, run
93
64
zip . files [ Object . keys ( zip . files ) [ 0 ] ] . nodeStream ( ) . pipe ( writeStream ) ;
94
65
await new Promise ( ( fulfill ) => writeStream . on ( "finish" , fulfill ) ) ;
95
66
core . debug ( `Downloaded Artifact ${ writeStream . path . toString ( ) } ` ) ;
96
- next [ jobName ] [ stepName ] = {
97
- jobName,
98
- stepName,
99
- path : writeStream . path . toString ( ) ,
100
- } ;
67
+ next . get ( jobName ) ?. set ( stepName , writeStream . path . toString ( ) ) ;
101
68
} finally {
102
69
writeStream . close ( ) ;
103
70
}
104
71
}
105
72
106
73
return next ;
107
- } , Promise . resolve ( { } ) ) ;
108
- return artifactsLookup ;
74
+ } , Promise . resolve ( new Map ( ) ) ) ;
109
75
}
110
76
111
77
async function getSelfArtifactMap ( ) {
112
78
const client = artifact . create ( ) ;
113
79
const responses = await client . downloadAllArtifacts ( ) ;
114
- const artifactsMap : WorkflowArtifactMap = responses . reduce ( ( result , { artifactName, downloadPath } ) => {
115
- const next : WorkflowArtifactMap = { ...result } ;
80
+
81
+ return responses . reduce ( ( result : JobArtifactMap , { artifactName, downloadPath } ) => {
82
+ const next = result ;
116
83
const match = artifactName . match ( artifactNameRegex ) ;
117
84
if ( match ?. groups ?. [ "jobName" ] && match ?. groups ?. [ "stepName" ] ) {
118
85
const { jobName, stepName } = match . groups ;
119
86
core . debug ( `Found Artifact for Job<${ jobName } > Step<${ stepName } >` ) ;
120
- if ( ! ( jobName in next ) ) {
121
- next [ jobName ] = { } ;
87
+ if ( ! next . has ( jobName ) ) {
88
+ next . set ( jobName , new Map ( ) ) ;
122
89
}
90
+
123
91
const artifactDirFiles = fs . readdirSync ( downloadPath ) ;
124
- if ( artifactDirFiles && artifactDirFiles . length > 0 ) {
125
- next [ jobName ] [ stepName ] = {
126
- jobName,
127
- stepName,
128
- path : path . join ( downloadPath , artifactDirFiles [ 0 ] ) ,
129
- } ;
92
+ if ( artifactDirFiles . length > 0 ) {
93
+ next . get ( jobName ) ?. set ( stepName , path . join ( downloadPath , artifactDirFiles [ 0 ] ) ) ;
130
94
}
131
95
}
132
96
return next ;
133
- } , { } ) ;
134
-
135
- return artifactsMap ;
97
+ } , new Map ( ) ) ;
136
98
}
137
99
138
- async function listJobsForWorkflowRun ( context : Context , octokit : Octokit , runId : number ) {
139
- return await octokit . paginate ( octokit . rest . actions . listJobsForWorkflowRun , {
100
+ async function getWorkflowRun ( context : Context , octokit : Octokit , runId : number ) {
101
+ const res = await octokit . rest . actions . getWorkflowRun ( {
140
102
...context . repo ,
141
103
run_id : runId ,
142
- filter : "latest" , // risk of missing a run if re-run happens between Action trigger and this query
143
- per_page : 100 ,
144
104
} ) ;
105
+ return res . data ;
145
106
}
146
107
147
- type WorkflowRunJobs = {
148
- workflowRun : components [ "schemas" ] [ "workflow-run" ] ;
149
- jobs : WorkflowRunJob [ ] ;
150
- workflowRunArtifacts : WorkflowArtifactLookup ;
151
- } ;
152
-
153
- async function getWorkflowRunJobs ( context : Context , octokit : Octokit , runId : number ) {
154
- const getWorkflowRunResponse = await octokit . rest . actions . getWorkflowRun ( {
108
+ async function listJobsForWorkflowRun ( context : Context , octokit : Octokit , runId : number ) {
109
+ return await octokit . paginate ( octokit . rest . actions . listJobsForWorkflowRun , {
155
110
...context . repo ,
156
111
run_id : runId ,
112
+ filter : "latest" , // risk of missing a run if re-run happens between Action trigger and this query
113
+ per_page : 100 ,
157
114
} ) ;
158
-
159
- const workflowRunArtifacts = await listWorkflowRunArtifacts ( context , octokit , runId ) ;
160
- const jobs = await listJobsForWorkflowRun ( context , octokit , runId ) ;
161
-
162
- const workflowRunJobs : WorkflowRunJobs = {
163
- workflowRun : getWorkflowRunResponse . data ,
164
- jobs,
165
- workflowRunArtifacts,
166
- } ;
167
- return workflowRunJobs ;
168
- }
169
-
170
- async function getPRLabels ( context : Context , octokit : Octokit , prNumber : number ) {
171
- const labelResponse = await octokit . rest . issues . listLabelsOnIssue ( {
172
- ...context . repo ,
173
- issue_number : prNumber ,
174
- } ) ;
175
- return labelResponse . data . map ( ( l ) => l . name ) ;
176
115
}
177
116
178
117
async function getPRsLabels ( context : Context , octokit : Octokit , prNumbers : number [ ] ) {
@@ -184,14 +123,24 @@ async function getPRsLabels(context: Context, octokit: Octokit, prNumbers: numbe
184
123
return labels ;
185
124
}
186
125
126
+ async function getPRLabels ( context : Context , octokit : Octokit , prNumber : number ) {
127
+ return await octokit . paginate (
128
+ octokit . rest . issues . listLabelsOnIssue ,
129
+ {
130
+ ...context . repo ,
131
+ issue_number : prNumber ,
132
+ } ,
133
+ ( response ) => response . data . map ( ( issue ) => issue . name ) ,
134
+ ) ;
135
+ }
136
+
187
137
export {
188
- getWorkflowRunJobs ,
138
+ getWorkflowRun ,
189
139
listWorkflowRunArtifacts ,
140
+ listJobsForWorkflowRun ,
190
141
getPRLabels ,
191
142
getPRsLabels ,
192
143
type Octokit ,
193
- type WorkflowArtifactDownload ,
194
- type WorkflowArtifactLookup ,
195
- type WorkflowRunJob ,
196
- type WorkflowRunJobs ,
144
+ type StepArtifactMap ,
145
+ type JobArtifactMap ,
197
146
} ;
0 commit comments