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 """
3435 for job in jobs :
35- job ["name" ] = f"{ prefix } - { job ['image' ]} "
36+ job ["name" ] = f"{ prefix } - { job ['name' ]} "
37+ job ["image" ] = get_job_image (job )
3638 return jobs
3739
3840
@@ -118,7 +120,7 @@ def find_run_type(ctx: GitHubCtx) -> Optional[WorkflowRunType]:
118120
119121def calculate_jobs (run_type : WorkflowRunType , job_data : Dict [str , Any ]) -> List [Job ]:
120122 if isinstance (run_type , PRRunType ):
121- return add_base_env (name_jobs (job_data ["pr" ], "PR" ), job_data ["envs" ]["pr" ])
123+ return add_base_env (add_job_properties (job_data ["pr" ], "PR" ), job_data ["envs" ]["pr" ])
122124 elif isinstance (run_type , TryRunType ):
123125 jobs = job_data ["try" ]
124126 custom_jobs = run_type .custom_jobs
@@ -132,7 +134,7 @@ def calculate_jobs(run_type: WorkflowRunType, job_data: Dict[str, Any]) -> List[
132134 jobs = []
133135 unknown_jobs = []
134136 for custom_job in custom_jobs :
135- job = [j for j in job_data ["auto" ] if j ["image " ] == custom_job ]
137+ job = [j for j in job_data ["auto" ] if j ["name " ] == custom_job ]
136138 if not job :
137139 unknown_jobs .append (custom_job )
138140 continue
@@ -142,10 +144,10 @@ def calculate_jobs(run_type: WorkflowRunType, job_data: Dict[str, Any]) -> List[
142144 f"Custom job(s) `{ unknown_jobs } ` not found in auto jobs"
143145 )
144146
145- return add_base_env (name_jobs (jobs , "try" ), job_data ["envs" ]["try" ])
147+ return add_base_env (add_job_properties (jobs , "try" ), job_data ["envs" ]["try" ])
146148 elif isinstance (run_type , AutoRunType ):
147149 return add_base_env (
148- name_jobs (job_data ["auto" ], "auto" ), job_data ["envs" ]["auto" ]
150+ add_job_properties (job_data ["auto" ], "auto" ), job_data ["envs" ]["auto" ]
149151 )
150152
151153 return []
@@ -183,27 +185,34 @@ def format_run_type(run_type: WorkflowRunType) -> str:
183185 raise AssertionError ()
184186
185187
188+ def get_job_image (job ) -> str :
189+ """
190+ By default, the Docker image of a job is based on its name.
191+ However, it can be overridden by its IMAGE environment variable.
192+ """
193+ return job .get ("env" , {}).get ("IMAGE" , job ["name" ])
194+
195+
186196def run_workflow_locally (job_data : Dict [str , Any ], job_name : str ):
187197 DOCKER_DIR = Path (__file__ ).absolute ().parent .parent / "docker"
188198
189199 jobs = list (job_data ["auto" ])
190200 jobs .extend (job_data ["pr" ])
191201
192- jobs = [job for job in jobs if job .get ("image " ) == job_name ]
202+ jobs = [job for job in jobs if job .get ("name " ) == job_name ]
193203 if len (jobs ) == 0 :
194204 raise Exception (f"Job `{ job_name } ` not found" )
195205 job = jobs [0 ]
196206 if "ubuntu" not in job ["os" ]:
197207 raise Exception ("Only Linux jobs can be executed locally" )
198208
199- image = job .get ("env" , {}).get ("IMAGE" , job ["image" ])
200209 custom_env = {}
201210 custom_env ["DEPLOY" ] = "1"
202211 custom_env .update ({k : str (v ) for (k , v ) in job .get ("env" , {}).items ()})
203212
204213 args = [
205214 str (DOCKER_DIR / "run.sh" ),
206- image
215+ get_job_image ( job )
207216 ]
208217 env_formatted = [f"{ k } ={ v } " for (k , v ) in sorted (custom_env .items ())]
209218 print (f"Executing `{ ' ' .join (env_formatted )} { ' ' .join (args )} `" )
0 commit comments