@@ -62,12 +62,22 @@ export const HandleJobs = async (event: any = {}): Promise<any> => {
6262 // start the task , don't start the process before processing the notification
6363 const ecsServices = new ECSContainer ( c , consoleLogger ) ;
6464 const res = await ecsServices . execute ( jobId ) ;
65+ if ( res ) {
66+ await saveTaskId ( jobId , res , consoleLogger ) ;
67+ }
6568 consoleLogger . info ( jobId , JSON . stringify ( res ) ) ;
6669 break ;
6770 case JobStatus [ JobStatus . inProgress ] :
6871 queueUrl = c . get ( 'jobUpdatesQueueUrl' ) ;
6972 await NotifyBuildProgress ( jobId ) ;
7073 break ;
74+ case JobStatus [ JobStatus . timedOut ] :
75+ await NotifyBuildSummary ( jobId ) ;
76+ const taskId = body [ 'taskId' ] ;
77+ if ( taskId ) {
78+ await stopECSTask ( taskId , consoleLogger ) ;
79+ }
80+ break ;
7181 case JobStatus [ JobStatus . failed ] :
7282 case JobStatus [ JobStatus . completed ] :
7383 queueUrl = c . get ( 'jobUpdatesQueueUrl' ) ;
@@ -86,6 +96,44 @@ export const HandleJobs = async (event: any = {}): Promise<any> => {
8696 ) ;
8797} ;
8898
99+ export const FailStuckJobs = async ( ) => {
100+ const client = new mongodb . MongoClient ( c . get ( 'dbUrl' ) ) ;
101+ await client . connect ( ) ;
102+ const db = client . db ( c . get ( 'dbName' ) ) ;
103+ const consoleLogger = new ConsoleLogger ( ) ;
104+ const jobRepository = new JobRepository ( db , c , consoleLogger ) ;
105+
106+ try {
107+ const hours = 8 ;
108+ await jobRepository . failStuckJobs ( hours ) ;
109+ } catch ( err ) {
110+ consoleLogger . error ( 'FailStuckJobs' , err ) ;
111+ }
112+ } ;
113+
114+ async function saveTaskId ( jobId : string , taskExecutionRes : any , consoleLogger : ConsoleLogger ) : Promise < void > {
115+ const taskArn = taskExecutionRes ?. tasks [ 0 ] ?. taskArn ;
116+ if ( ! taskArn ) return ;
117+
118+ const client = new mongodb . MongoClient ( c . get ( 'dbUrl' ) ) ;
119+ await client . connect ( ) ;
120+ const db = client . db ( c . get ( 'dbName' ) ) ;
121+ const jobRepository = new JobRepository ( db , c , consoleLogger ) ;
122+
123+ try {
124+ // Only interested in the actual task ID since the whole ARN might have sensitive information
125+ const taskId = taskArn . split ( '/' ) . pop ( ) ;
126+ await jobRepository . addTaskIdToJob ( jobId , taskId ) ;
127+ } catch ( err ) {
128+ consoleLogger . error ( 'saveTaskId' , err ) ;
129+ }
130+ }
131+
132+ async function stopECSTask ( taskId : string , consoleLogger : ConsoleLogger ) {
133+ const ecs = new ECSContainer ( c , consoleLogger ) ;
134+ await ecs . stopZombieECSTask ( taskId ) ;
135+ }
136+
89137async function retry ( message : JobQueueMessage , consoleLogger : ConsoleLogger , url : string ) : Promise < any > {
90138 try {
91139 const tries = message . tries ;
@@ -113,10 +161,6 @@ async function NotifyBuildSummary(jobId: string): Promise<any> {
113161 const jobRepository = new JobRepository ( db , c , consoleLogger ) ;
114162 // TODO: Make fullDocument be of type Job, validate existence
115163 const fullDocument = await jobRepository . getJobById ( jobId ) ;
116- // TODO: Remove unused vars, and validate existing vars
117- const branchesRepo = new BranchRepository ( db , c , consoleLogger ) ;
118- const slackMsgs = fullDocument . comMessage ;
119- const jobTitle = fullDocument . title ;
120164 const repoName = fullDocument . payload . repoName ;
121165 const username = fullDocument . user ;
122166 const slackConnector = new SlackConnector ( consoleLogger , c ) ;
@@ -126,7 +170,7 @@ async function NotifyBuildSummary(jobId: string): Promise<any> {
126170 consoleLogger . error ( username , 'Entitlement failed' ) ;
127171 return ;
128172 }
129- const resp = await slackConnector . sendMessage (
173+ await slackConnector . sendMessage (
130174 await prepSummaryMessage (
131175 env ,
132176 fullDocument ,
0 commit comments