@@ -228,10 +228,6 @@ def deploy_and_test_pattern(stack_prefix, pattern_config, admin_email, template_
228228 "error" : f"Deployment/testing failed: { str (e )} "
229229 }
230230
231- # Always cleanup the stack regardless of success/failure
232- finally :
233- cleanup_stack (stack_name , pattern_name )
234-
235231 return success_result
236232
237233
@@ -480,7 +476,8 @@ def generate_deployment_summary(deployment_results, stack_prefix, template_url):
480476 Error: Failed to generate AI analysis: { e }
481477 """ )
482478
483- def cleanup_stack (stack_name , pattern_name ):
479+ def cleanup_single_stack (stack_name , pattern_name ):
480+ """Clean up a single stack"""
484481 print (f"[{ pattern_name } ] Cleaning up: { stack_name } " )
485482 try :
486483 # Check stack status first
@@ -539,6 +536,32 @@ def cleanup_stack(stack_name, pattern_name):
539536 print (f"[{ pattern_name } ] ⚠️ Cleanup failed: { e } " )
540537
541538
539+ def cleanup_stacks (deployment_results ):
540+ """Clean up multiple stacks in parallel"""
541+ stacks_to_cleanup = [
542+ (result ["stack_name" ], result ["pattern_name" ])
543+ for result in deployment_results
544+ if result .get ("stack_name" ) and result ["stack_name" ] != "N/A"
545+ ]
546+
547+ if not stacks_to_cleanup :
548+ print ("No stacks to cleanup" )
549+ return
550+
551+ print (f"🧹 Starting parallel cleanup of { len (stacks_to_cleanup )} stacks..." )
552+
553+ with ThreadPoolExecutor (max_workers = len (stacks_to_cleanup )) as executor :
554+ futures = [
555+ executor .submit (cleanup_single_stack , stack_name , pattern_name )
556+ for stack_name , pattern_name in stacks_to_cleanup
557+ ]
558+
559+ for future in as_completed (futures ):
560+ try :
561+ future .result ()
562+ except Exception as e :
563+ print (f"⚠️ Cleanup task failed: { e } " )
564+
542565def main ():
543566 """Main execution function"""
544567 print ("Starting CodeBuild deployment process..." )
@@ -612,7 +635,6 @@ def main():
612635 })
613636
614637 # Step 3: Generate deployment summary using Bedrock (but don't print yet)
615- print ("\n 🤖 Generating deployment summary with Bedrock..." )
616638 ai_summary = None
617639 try :
618640 if not publish_success :
@@ -623,12 +645,10 @@ def main():
623645 ai_summary = f"⚠️ Failed to generate deployment summary: { e } "
624646
625647 # Step 4: Cleanup stacks after analysis
626- print ("\n 🧹 Starting cleanup of deployed stacks..." )
627- for result in deployment_results :
628- if result .get ("stack_name" ) and result ["stack_name" ] != "N/A" :
629- cleanup_stack (result ["stack_name" ], result ["pattern_name" ])
648+ cleanup_stacks (deployment_results )
630649
631650 # Step 5: Print AI analysis results at the end
651+ print ("\n 🤖 Generating deployment summary with Bedrock..." )
632652 if ai_summary :
633653 print (ai_summary )
634654
0 commit comments