30
30
def add_job_properties (jobs : List [Dict ], prefix : str ) -> List [Job ]:
31
31
"""
32
32
Modify the `name` attribute of each job, based on its base name and the given `prefix`.
33
- Add an `image` attribute to each job, base don its image.
33
+ Add an `image` attribute to each job, based on its image.
34
34
"""
35
35
modified_jobs = []
36
36
for job in jobs :
@@ -196,15 +196,14 @@ def get_job_image(job) -> str:
196
196
return job .get ("env" , {}).get ("IMAGE" , job ["name" ])
197
197
198
198
199
- def run_workflow_locally (job_data : Dict [str , Any ], job_name : str ):
199
+ def run_workflow_locally (job_data : Dict [str , Any ], job_name : str , pr_jobs : bool ):
200
200
DOCKER_DIR = Path (__file__ ).absolute ().parent .parent / "docker"
201
201
202
- jobs = list (job_data ["auto" ])
203
- jobs .extend (job_data ["pr" ])
204
-
202
+ jobs = job_data ["pr" ] if pr_jobs else job_data ["auto" ]
205
203
jobs = [job for job in jobs if job .get ("name" ) == job_name ]
206
204
if len (jobs ) == 0 :
207
- raise Exception (f"Job `{ job_name } ` not found" )
205
+ raise Exception (f"Job `{ job_name } ` not found in { 'pr' if pr_jobs else 'auto' } jobs" )
206
+ assert len (jobs ) == 1
208
207
job = jobs [0 ]
209
208
if "ubuntu" not in job ["os" ]:
210
209
raise Exception ("Only Linux jobs can be executed locally" )
@@ -222,7 +221,12 @@ def run_workflow_locally(job_data: Dict[str, Any], job_name: str):
222
221
223
222
env = os .environ .copy ()
224
223
env .update (custom_env )
225
- subprocess .run (args , env = env )
224
+
225
+ process = subprocess .Popen (args , env = env )
226
+ try :
227
+ process .wait ()
228
+ except KeyboardInterrupt :
229
+ process .kill ()
226
230
227
231
228
232
if __name__ == "__main__" :
@@ -239,7 +243,16 @@ def run_workflow_locally(job_data: Dict[str, Any], job_name: str):
239
243
subparsers = parser .add_subparsers (help = "Command to execute" , dest = "command" , required = True )
240
244
subparsers .add_parser ("calculate-job-matrix" )
241
245
run_parser = subparsers .add_parser ("run-local" )
242
- run_parser .add_argument ("job_name" , help = "CI job that should be executed" )
246
+ run_parser .add_argument (
247
+ "job_name" ,
248
+ help = "CI job that should be executed. By default, a merge (auto) "
249
+ "job with the given name will be executed"
250
+ )
251
+ run_parser .add_argument (
252
+ "--pr" ,
253
+ action = "store_true" ,
254
+ help = "Run a PR job instead of an auto job"
255
+ )
243
256
args = parser .parse_args ()
244
257
245
258
if args .command == "calculate-job-matrix" :
@@ -265,6 +278,6 @@ def run_workflow_locally(job_data: Dict[str, Any], job_name: str):
265
278
print (f"jobs={ json .dumps (jobs )} " )
266
279
print (f"run_type={ run_type } " )
267
280
elif args .command == "run-local" :
268
- run_workflow_locally (data , args .job_name )
281
+ run_workflow_locally (data , args .job_name , args . pr )
269
282
else :
270
283
raise Exception (f"Unknown command { args .command } " )
0 commit comments