@@ -4,36 +4,39 @@ import {
44 fetchWorkflowRunFailedJobs ,
55 fetchWorkflowRunState ,
66 retryOnError ,
7+ } from "./api.ts" ;
8+ import {
79 WorkflowRunConclusion ,
810 WorkflowRunStatus ,
9- } from "./api.ts" ;
10- import type { Result } from "./types.ts" ;
11+ type Result ,
12+ type WorkflowRunConclusionResult ,
13+ type WorkflowRunStatusResult ,
14+ } from "./types.ts" ;
1115import { sleep } from "./utils.ts" ;
1216
1317export function getWorkflowRunStatusResult (
1418 status : WorkflowRunStatus | null ,
1519 attemptNo : number ,
16- ) : Result < WorkflowRunStatus > {
20+ ) : WorkflowRunStatusResult {
1721 if ( status === WorkflowRunStatus . Completed ) {
18- core . debug ( "Run has completed" ) ;
1922 return { success : true , value : status } ;
2023 }
2124
2225 if ( status === WorkflowRunStatus . Queued ) {
2326 core . debug ( `Run is queued to begin, attempt ${ attemptNo } ...` ) ;
24- return { success : false , reason : "inconclusive" } ;
27+ return { success : false , reason : "pending" , value : status } ;
2528 } else if ( status === WorkflowRunStatus . InProgress ) {
2629 core . debug ( `Run is in progress, attempt ${ attemptNo } ...` ) ;
27- return { success : false , reason : "inconclusive" } ;
30+ return { success : false , reason : "pending" , value : status } ;
2831 }
2932
30- core . debug ( `Run has returned an unsupported status : ${ status } ` ) ;
31- return { success : false , reason : "unsupported" } ;
33+ core . debug ( `Run status is unsupported: ${ status } ` ) ;
34+ return { success : false , reason : "unsupported" , value : status ?? "null" } ;
3235}
3336
34- function getWorkflowRunConclusionResult (
37+ export function getWorkflowRunConclusionResult (
3538 conclusion : WorkflowRunConclusion | null ,
36- ) : Result < WorkflowRunConclusion > {
39+ ) : WorkflowRunConclusionResult {
3740 switch ( conclusion ) {
3841 case WorkflowRunConclusion . Success :
3942 return { success : true , value : conclusion } ;
@@ -42,13 +45,19 @@ function getWorkflowRunConclusionResult(
4245 case WorkflowRunConclusion . Failure :
4346 case WorkflowRunConclusion . Neutral :
4447 case WorkflowRunConclusion . Skipped :
45- case WorkflowRunConclusion . TimedOut :
4648 core . error ( `Run has failed with conclusion: ${ conclusion } ` ) ;
47- return { success : false , reason : "timeout" } ;
49+ return { success : false , reason : "inconclusive" , value : conclusion } ;
50+ case WorkflowRunConclusion . TimedOut :
51+ core . error ( "Run has timeout out" ) ;
52+ return { success : false , reason : "timeout" , value : conclusion } ;
4853 default :
4954 core . error ( `Run has failed with unsupported conclusion: ${ conclusion } ` ) ;
5055 core . info ( "Please open an issue with this conclusion value" ) ;
51- return { success : false , reason : "unsupported" } ;
56+ return {
57+ success : false ,
58+ reason : "unsupported" ,
59+ value : conclusion ?? "null" ,
60+ } ;
5261 }
5362}
5463
@@ -95,7 +104,10 @@ export async function getWorkflowRunResult({
95104 runTimeoutMs,
96105 pollIntervalMs,
97106} : RunOpts ) : Promise <
98- Result < { status : WorkflowRunStatus ; conclusion : WorkflowRunConclusion } >
107+ Result <
108+ | { status : WorkflowRunStatus . Completed ; conclusion : WorkflowRunConclusion }
109+ | { status : WorkflowRunStatus ; conclusion ?: WorkflowRunConclusion }
110+ >
99111> {
100112 let attemptNo = 0 ;
101113 let elapsedTime = Date . now ( ) - startTime ;
@@ -107,26 +119,31 @@ export async function getWorkflowRunResult({
107119 400 ,
108120 "fetchWorkflowRunState" ,
109121 ) ;
110- if ( fetchWorkflowRunStateResult . success ) {
122+ if ( ! fetchWorkflowRunStateResult . success ) {
123+ core . debug ( `Failed to fetch run state, attempt ${ attemptNo } ...` ) ;
124+ } else {
111125 const { status, conclusion } = fetchWorkflowRunStateResult . value ;
112126 const statusResult = getWorkflowRunStatusResult ( status , attemptNo ) ;
113127 if ( statusResult . success ) {
128+ // We only get a conclusion should the status resolve, otherwise it is null.
114129 const conclusionResult = getWorkflowRunConclusionResult ( conclusion ) ;
115130
116- if ( conclusionResult . success ) {
117- return {
118- success : true ,
119- value : {
120- status : statusResult . value ,
121- conclusion : conclusionResult . value ,
122- } ,
123- } ;
124- } else {
125- return conclusionResult ;
126- }
131+ return {
132+ success : true ,
133+ value : {
134+ status : statusResult . value ,
135+ conclusion : conclusionResult . success
136+ ? conclusionResult . value
137+ : undefined ,
138+ } ,
139+ } ;
140+ }
141+
142+ // If the status is unsupported, we can't guarantee it will ever
143+ // resolve. Alert to raise this so we can handle it properly.
144+ if ( statusResult . reason === "unsupported" ) {
145+ return statusResult ;
127146 }
128- } else {
129- core . debug ( `Run has not yet been identified, attempt ${ attemptNo } ...` ) ;
130147 }
131148
132149 await sleep ( pollIntervalMs ) ;
0 commit comments