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