11
11
import json
12
12
import logging
13
13
import os
14
+ import re
14
15
import typing
15
16
from pathlib import Path
16
17
from typing import List , Dict , Any , Optional
@@ -67,6 +68,23 @@ class GitHubCtx:
67
68
event_name : str
68
69
ref : str
69
70
repository : str
71
+ commit_message : Optional [str ]
72
+
73
+
74
+ def get_job_from_commit (ctx : GitHubCtx ) -> Optional [str ]:
75
+ """
76
+ Tries to parse a name of a CI job that should be executed in the form of
77
+ ci-job: <job-name>
78
+ from the commit message of the passed GitHub context.
79
+ """
80
+ if ctx .commit_message is None :
81
+ return None
82
+
83
+ regex = re .compile (r"ci-job: (.*)" )
84
+ match = regex .search (ctx .commit_message )
85
+ if match is None :
86
+ return None
87
+ return match .group (1 )
70
88
71
89
72
90
def find_run_type (ctx : GitHubCtx ) -> Optional [WorkflowRunType ]:
@@ -84,7 +102,8 @@ def find_run_type(ctx: GitHubCtx) -> Optional[WorkflowRunType]:
84
102
try_build = old_bors_try_build or new_bors_try_build
85
103
86
104
if try_build :
87
- return TryRunType ()
105
+ job_name = get_job_from_commit (ctx )
106
+ return TryRunType (job = job_name )
88
107
89
108
if ctx .ref == "refs/heads/auto" and ctx .repository == "rust-lang-ci/rust" :
90
109
return AutoRunType ()
@@ -96,8 +115,16 @@ def calculate_jobs(run_type: WorkflowRunType, job_data: Dict[str, Any]) -> List[
96
115
if isinstance (run_type , PRRunType ):
97
116
return add_base_env (name_jobs (job_data ["pr" ], "PR" ), job_data ["envs" ]["pr" ])
98
117
elif isinstance (run_type , TryRunType ):
99
- return add_base_env (name_jobs (job_data ["try" ], "try" ), job_data ["envs" ]["try" ])
100
- elif isinstance (run_type , AutoRunType ):
118
+ jobs = job_data ["try" ]
119
+ if run_type .job is not None :
120
+ jobs = [job for job in job_data ["auto" ] if job ["image" ] == run_type .job ]
121
+ if not jobs :
122
+ raise Exception (
123
+ f"CI job `{ run_type .job } ` asked for in the try build does not exist"
124
+ )
125
+
126
+ return add_base_env (name_jobs (jobs , "try" ), job_data ["envs" ]["try" ])
127
+ elif run_type is AutoRunType :
101
128
return add_base_env (name_jobs (job_data ["auto" ], "auto" ), job_data ["envs" ]["auto" ])
102
129
103
130
return []
@@ -111,10 +138,16 @@ def skip_jobs(jobs: List[Dict[str, Any]], channel: str) -> List[Job]:
111
138
112
139
113
140
def get_github_ctx () -> GitHubCtx :
141
+ event_name = os .environ ["GITHUB_EVENT_NAME" ]
142
+
143
+ commit_message = None
144
+ if event_name == "push" :
145
+ commit_message = os .environ ["COMMIT_MESSAGE" ]
114
146
return GitHubCtx (
115
- event_name = os . environ [ "GITHUB_EVENT_NAME" ] ,
147
+ event_name = event_name ,
116
148
ref = os .environ ["GITHUB_REF" ],
117
- repository = os .environ ["GITHUB_REPOSITORY" ]
149
+ repository = os .environ ["GITHUB_REPOSITORY" ],
150
+ commit_message = commit_message
118
151
)
119
152
120
153
0 commit comments