|
7 | 7 | import redis
|
8 | 8 | from githubkit import Response
|
9 | 9 | from githubkit.exception import RequestFailed
|
10 |
| -from githubkit.rest.models import AuthenticationToken |
11 |
| -from githubkit.rest.models import Runner as GitHubRunner |
12 | 10 | from githubkit.webhooks.models import WorkflowJobInProgress
|
13 | 11 | from githubkit.webhooks.types import WorkflowJobEvent
|
14 | 12 | from pydantic import BaseModel as PydanticBaseModel
|
@@ -110,27 +108,28 @@ def get_runners(self) -> List[Runner]:
|
110 | 108 | pass
|
111 | 109 | return runners
|
112 | 110 |
|
113 |
| - def create_runner(self, token: AuthenticationToken) -> Runner | None: |
| 111 | + def create_runner(self, github: GitHub) -> Runner | None: |
114 | 112 | """Create a runner instance.
|
115 | 113 |
|
116 | 114 | Returns:
|
117 | 115 | Runner: Runner instance.
|
118 | 116 | """
|
119 | 117 | count = len(self.get_runners())
|
120 |
| - if count < self.max: |
| 118 | + if count < self.max and self.id: |
121 | 119 | runner: Runner = Runner(
|
122 | 120 | name=self.generate_runner_name(),
|
123 | 121 | organization=self.organization,
|
124 | 122 | status=RunnerStatus.offline,
|
125 |
| - token=token.token, |
126 | 123 | busy=False,
|
127 | 124 | runner_group_id=self.id,
|
128 | 125 | created_at=datetime.now(),
|
129 | 126 | runner_group_name=self.name,
|
130 | 127 | labels=self.runner_labels,
|
131 | 128 | manager=self.manager,
|
132 | 129 | )
|
133 |
| - runner = runner.save() |
| 130 | + runner.save() |
| 131 | + runner.generate_jit_config(github) |
| 132 | + |
134 | 133 | return self.backend.create(runner)
|
135 | 134 | return None
|
136 | 135 |
|
@@ -160,7 +159,10 @@ def delete_runner(self, runner: Runner) -> int:
|
160 | 159 |
|
161 | 160 | @property
|
162 | 161 | def need_new_runner(self) -> bool:
|
163 |
| - return len(self.get_runners()) < (self.min or 0) |
| 162 | + runners = self.get_runners() |
| 163 | + idle = len([runner for runner in runners if runner.busy is False]) |
| 164 | + count = len(runners) |
| 165 | + return idle < self.min and count < self.max |
164 | 166 |
|
165 | 167 | def create_github_group(self, github: GitHub) -> GitHubRunnerGroup:
|
166 | 168 | """Create a GitHub runner group."""
|
@@ -243,26 +245,13 @@ def healthcheck(
|
243 | 245 | """Healthcheck runner group."""
|
244 | 246 | runners = self.get_runners()
|
245 | 247 | for runner in runners:
|
246 |
| - |
247 |
| - if runner.id is not None: |
248 |
| - github_runner: GitHubRunner = ( |
249 |
| - github.rest.actions.get_self_hosted_runner_for_org( |
250 |
| - self.organization, runner.id |
251 |
| - ).parsed_data |
252 |
| - ) |
253 |
| - runner = runner.update_status(github_runner) |
| 248 | + runner.update_from_github(github) |
254 | 249 | if runner.time_to_live_expired(time_to_live):
|
255 | 250 | self.delete_runner(runner)
|
256 | 251 | if runner.time_to_start_expired(timeout_runner):
|
257 | 252 | self.delete_runner(runner)
|
258 | 253 | while self.need_new_runner:
|
259 |
| - token_response: Response[ |
260 |
| - AuthenticationToken |
261 |
| - ] = github.rest.actions.create_registration_token_for_org( |
262 |
| - org=self.organization |
263 |
| - ) |
264 |
| - token: AuthenticationToken = token_response.parsed_data |
265 |
| - runner: Runner = self.create_runner(token) |
| 254 | + runner: Runner = self.create_runner(github) |
266 | 255 | if runner:
|
267 | 256 | log.info(f"Runner {runner.name} created")
|
268 | 257 |
|
|
0 commit comments