@@ -56,6 +56,7 @@ parser.add_argument(
5656 type = str ,
5757 help = "The pipeline to preview" ,
5858 choices = pipeline_metadata_map .keys (),
59+ nargs = "+" ,
5960)
6061
6162parser .add_argument (
@@ -70,14 +71,75 @@ parser.add_argument(
7071 "-q" , "--quiet" , action = "store_true" , help = "Suppress YAML output" , default = False
7172)
7273
74+ parser .add_argument (
75+ "--parallel" ,
76+ action = "store_true" ,
77+ help = "Preview pipelines in parallel" ,
78+ )
79+
7380args = parser .parse_args ()
7481
82+ if args .parallel and not args .quiet :
83+ parser .error ("--parallel requires --quiet (-q)" )
84+
85+
86+ def check_pipeline (pipeline_name : str , selected_branch : str , quiet : bool = False ):
87+ pipeline_metadata = pipeline_metadata_map [pipeline_name ]
88+
89+ if pipeline_metadata .id == - 1 :
90+ raise Exception (f"Pipeline '{ pipeline_name } ' is not defined in the script" )
91+
92+ print (
93+ f"Checking pipeline '{ pipeline_name } ' with ID '{ pipeline_metadata .id } ' on branch '{ selected_branch } '" ,
94+ file = sys .stderr ,
95+ )
96+
97+ payload = {
98+ "previewRun" : True ,
99+ "resources" : {"repositories" : {"self" : {"refName" : selected_branch }}},
100+ }
101+
102+ if pipeline_metadata .parameters :
103+ payload ["templateParameters" ] = pipeline_metadata .parameters
104+
105+ with tempfile .NamedTemporaryFile () as payload_file :
106+ payload_file .write (json .dumps (payload ).encode ("utf-8" ))
107+ payload_file .flush ()
108+
109+ cmd = [
110+ "az" ,
111+ "devops" ,
112+ "invoke" ,
113+ "--org" ,
114+ "https://dev.azure.com/mariner-org" ,
115+ "--api-version" ,
116+ "7.0" ,
117+ "--area" ,
118+ "pipelines" ,
119+ "--resource" ,
120+ "runs" ,
121+ "--route-parameters" ,
122+ f"project={ pipeline_metadata .project } " ,
123+ f"pipelineId={ pipeline_metadata .id } " ,
124+ "--http-method" ,
125+ "POST" ,
126+ "--in-file" ,
127+ payload_file .name ,
128+ ]
129+ output = subprocess .run (
130+ cmd ,
131+ capture_output = True ,
132+ )
133+
134+ if output .returncode != 0 :
135+ raise Exception (f"Pipeline preview failed: { output .stderr .decode ('utf-8' )} " )
136+
137+ print (f"Pipeline '{ pipeline_name } ' previewed successfully" , file = sys .stderr )
75138
76- pipeline_metadata = pipeline_metadata_map [args .pipeline ]
139+ if not quiet :
140+ out_json = json .loads (output .stdout .decode ("utf-8" ))
141+ print (out_json ["finalYaml" ])
77142
78- if pipeline_metadata .id == - 1 :
79- print ("Pipeline does not exist yet" , file = sys .stderr )
80- exit (2 )
81143
82144if args .branch :
83145 selected_branch = args .branch
@@ -93,55 +155,32 @@ else:
93155 .strip ()
94156 )
95157
96- print (
97- f"Checking pipeline '{ args .pipeline } ' with ID '{ pipeline_metadata .id } ' on branch '{ selected_branch } '" ,
98- file = sys .stderr ,
99- )
100-
101- payload = {
102- "previewRun" : True ,
103- "resources" : {"repositories" : {"self" : {"refName" : selected_branch }}},
104- }
105-
106- if pipeline_metadata .parameters :
107- payload ["templateParameters" ] = pipeline_metadata .parameters
108-
109- with tempfile .NamedTemporaryFile () as payload_file :
110- payload_file .write (json .dumps (payload ).encode ("utf-8" ))
111- payload_file .flush ()
112-
113- cmd = [
114- "az" ,
115- "devops" ,
116- "invoke" ,
117- "--org" ,
118- "https://dev.azure.com/mariner-org" ,
119- "--api-version" ,
120- "7.0" ,
121- "--area" ,
122- "pipelines" ,
123- "--resource" ,
124- "runs" ,
125- "--route-parameters" ,
126- f"project={ pipeline_metadata .project } " ,
127- f"pipelineId={ pipeline_metadata .id } " ,
128- "--http-method" ,
129- "POST" ,
130- "--in-file" ,
131- payload_file .name ,
132- ]
133- output = subprocess .run (
134- cmd ,
135- capture_output = True ,
136- )
137-
138- if output .returncode != 0 :
139- print ("Failed to preview pipeline:" , file = sys .stderr )
140- print (output .stderr .decode ("utf-8" ), file = sys .stderr )
141- exit (1 )
142-
143- print ("Pipeline previewed successfully" , file = sys .stderr )
144-
145- if not args .quiet :
146- out_json = json .loads (output .stdout .decode ("utf-8" ))
147- print (out_json ["finalYaml" ])
158+ if args .parallel :
159+ import concurrent .futures
160+
161+ with concurrent .futures .ThreadPoolExecutor () as executor :
162+ futures = {
163+ executor .submit (check_pipeline , name , selected_branch ): name
164+ for name in args .pipeline
165+ }
166+ failures = []
167+ for future in concurrent .futures .as_completed (futures ):
168+ name = futures [future ]
169+ try :
170+ future .result ()
171+ except Exception as e :
172+ print (f"Error previewing pipeline '{ name } ': { e } " , file = sys .stderr )
173+ failures .append (name )
174+ if failures :
175+ print (
176+ f"Failed pipelines: { ', ' .join (failures )} " ,
177+ file = sys .stderr ,
178+ )
179+ exit (1 )
180+ else :
181+ for pipeline_name in args .pipeline :
182+ try :
183+ check_pipeline (pipeline_name , selected_branch , args .quiet )
184+ except Exception as e :
185+ print (f"Error previewing pipeline '{ pipeline_name } ': { e } " , file = sys .stderr )
186+ exit (1 )
0 commit comments