27
27
Job = Dict [str , Any ]
28
28
29
29
30
- def name_jobs (jobs : List [Dict ], prefix : str ) -> List [Job ]:
30
+ def add_job_properties (jobs : List [Dict ], prefix : str ) -> List [Job ]:
31
31
"""
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.
33
34
"""
34
35
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 )
36
38
return jobs
37
39
38
40
@@ -118,7 +120,7 @@ def find_run_type(ctx: GitHubCtx) -> Optional[WorkflowRunType]:
118
120
119
121
def calculate_jobs (run_type : WorkflowRunType , job_data : Dict [str , Any ]) -> List [Job ]:
120
122
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" ])
122
124
elif isinstance (run_type , TryRunType ):
123
125
jobs = job_data ["try" ]
124
126
custom_jobs = run_type .custom_jobs
@@ -132,7 +134,7 @@ def calculate_jobs(run_type: WorkflowRunType, job_data: Dict[str, Any]) -> List[
132
134
jobs = []
133
135
unknown_jobs = []
134
136
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 ]
136
138
if not job :
137
139
unknown_jobs .append (custom_job )
138
140
continue
@@ -142,10 +144,10 @@ def calculate_jobs(run_type: WorkflowRunType, job_data: Dict[str, Any]) -> List[
142
144
f"Custom job(s) `{ unknown_jobs } ` not found in auto jobs"
143
145
)
144
146
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" ])
146
148
elif isinstance (run_type , AutoRunType ):
147
149
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" ]
149
151
)
150
152
151
153
return []
@@ -183,27 +185,34 @@ def format_run_type(run_type: WorkflowRunType) -> str:
183
185
raise AssertionError ()
184
186
185
187
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
+
186
196
def run_workflow_locally (job_data : Dict [str , Any ], job_name : str ):
187
197
DOCKER_DIR = Path (__file__ ).absolute ().parent .parent / "docker"
188
198
189
199
jobs = list (job_data ["auto" ])
190
200
jobs .extend (job_data ["pr" ])
191
201
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 ]
193
203
if len (jobs ) == 0 :
194
204
raise Exception (f"Job `{ job_name } ` not found" )
195
205
job = jobs [0 ]
196
206
if "ubuntu" not in job ["os" ]:
197
207
raise Exception ("Only Linux jobs can be executed locally" )
198
208
199
- image = job .get ("env" , {}).get ("IMAGE" , job ["image" ])
200
209
custom_env = {}
201
210
custom_env ["DEPLOY" ] = "1"
202
211
custom_env .update ({k : str (v ) for (k , v ) in job .get ("env" , {}).items ()})
203
212
204
213
args = [
205
214
str (DOCKER_DIR / "run.sh" ),
206
- image
215
+ get_job_image ( job )
207
216
]
208
217
env_formatted = [f"{ k } ={ v } " for (k , v ) in sorted (custom_env .items ())]
209
218
print (f"Executing `{ ' ' .join (env_formatted )} { ' ' .join (args )} `" )
0 commit comments