2727Job = Dict [str , Any ]
2828
2929
30- def name_jobs (jobs : List [Dict ], prefix : str ) -> List [Job ]:
30+ def add_job_properties (jobs : List [Dict ], prefix : str ) -> List [Job ]:
3131 """
32- Add a `name` attribute to each job, based on its image and the given `prefix`.
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.
3334 """
35+ modified_jobs = []
3436 for job in jobs :
35- job ["name" ] = f"{ prefix } - { job ['image' ]} "
36- return jobs
37+ job = dict (job )
38+ job ["image" ] = get_job_image (job )
39+ job ["name" ] = f"{ prefix } - { job ['name' ]} "
40+ modified_jobs .append (job )
41+ return modified_jobs
3742
3843
3944def add_base_env (jobs : List [Job ], environment : Dict [str , str ]) -> List [Job ]:
@@ -118,7 +123,7 @@ def find_run_type(ctx: GitHubCtx) -> Optional[WorkflowRunType]:
118123
119124def calculate_jobs (run_type : WorkflowRunType , job_data : Dict [str , Any ]) -> List [Job ]:
120125 if isinstance (run_type , PRRunType ):
121- return add_base_env (name_jobs (job_data ["pr" ], "PR" ), job_data ["envs" ]["pr" ])
126+ return add_base_env (add_job_properties (job_data ["pr" ], "PR" ), job_data ["envs" ]["pr" ])
122127 elif isinstance (run_type , TryRunType ):
123128 jobs = job_data ["try" ]
124129 custom_jobs = run_type .custom_jobs
@@ -132,7 +137,7 @@ def calculate_jobs(run_type: WorkflowRunType, job_data: Dict[str, Any]) -> List[
132137 jobs = []
133138 unknown_jobs = []
134139 for custom_job in custom_jobs :
135- job = [j for j in job_data ["auto" ] if j ["image " ] == custom_job ]
140+ job = [j for j in job_data ["auto" ] if j ["name " ] == custom_job ]
136141 if not job :
137142 unknown_jobs .append (custom_job )
138143 continue
@@ -142,10 +147,10 @@ def calculate_jobs(run_type: WorkflowRunType, job_data: Dict[str, Any]) -> List[
142147 f"Custom job(s) `{ unknown_jobs } ` not found in auto jobs"
143148 )
144149
145- return add_base_env (name_jobs (jobs , "try" ), job_data ["envs" ]["try" ])
150+ return add_base_env (add_job_properties (jobs , "try" ), job_data ["envs" ]["try" ])
146151 elif isinstance (run_type , AutoRunType ):
147152 return add_base_env (
148- name_jobs (job_data ["auto" ], "auto" ), job_data ["envs" ]["auto" ]
153+ add_job_properties (job_data ["auto" ], "auto" ), job_data ["envs" ]["auto" ]
149154 )
150155
151156 return []
@@ -183,27 +188,34 @@ def format_run_type(run_type: WorkflowRunType) -> str:
183188 raise AssertionError ()
184189
185190
191+ def get_job_image (job ) -> str :
192+ """
193+ By default, the Docker image of a job is based on its name.
194+ However, it can be overridden by its IMAGE environment variable.
195+ """
196+ return job .get ("env" , {}).get ("IMAGE" , job ["name" ])
197+
198+
186199def run_workflow_locally (job_data : Dict [str , Any ], job_name : str ):
187200 DOCKER_DIR = Path (__file__ ).absolute ().parent .parent / "docker"
188201
189202 jobs = list (job_data ["auto" ])
190203 jobs .extend (job_data ["pr" ])
191204
192- jobs = [job for job in jobs if job .get ("image " ) == job_name ]
205+ jobs = [job for job in jobs if job .get ("name " ) == job_name ]
193206 if len (jobs ) == 0 :
194207 raise Exception (f"Job `{ job_name } ` not found" )
195208 job = jobs [0 ]
196209 if "ubuntu" not in job ["os" ]:
197210 raise Exception ("Only Linux jobs can be executed locally" )
198211
199- image = job .get ("env" , {}).get ("IMAGE" , job ["image" ])
200212 custom_env = {}
201213 custom_env ["DEPLOY" ] = "1"
202214 custom_env .update ({k : str (v ) for (k , v ) in job .get ("env" , {}).items ()})
203215
204216 args = [
205217 str (DOCKER_DIR / "run.sh" ),
206- image
218+ get_job_image ( job )
207219 ]
208220 env_formatted = [f"{ k } ={ v } " for (k , v ) in sorted (custom_env .items ())]
209221 print (f"Executing `{ ' ' .join (env_formatted )} { ' ' .join (args )} `" )
0 commit comments