mirror of
https://github.com/coollabsio/coolify.git
synced 2026-11-06 13:10:37 -04:00
fix(github-runner): skip pull request jobs early and keep runner group restrictions
- Do not provision a runner for a queued pull request job when no matching runner configuration allows pull request jobs (the run event is read from GitHub; the job-started hook still refuses it if the lookup fails). - Do not open an existing runner group to all or public repositories, so restrictions an organization admin set on GitHub stay. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
5cb68cda16
commit
55bbe92d94
@@ -17,6 +17,8 @@ use App\Models\GithubApp;
|
||||
use App\Models\GithubRunnerConfig;
|
||||
use App\Models\GithubRunnerExecution;
|
||||
use App\Models\PrivateKey;
|
||||
use App\Services\GithubRunner\GithubRunnerApi;
|
||||
use App\Services\GithubRunner\GithubRunnerContainer;
|
||||
use Exception;
|
||||
use Illuminate\Http\Exceptions\HttpResponseException;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
@@ -281,13 +283,16 @@ class Github extends Controller
|
||||
|
||||
if ($action === 'queued') {
|
||||
$labels = array_values(array_filter((array) data_get($payload, 'workflow_job.labels', []), 'is_string'));
|
||||
$matches = $githubApp->runnerConfigs()
|
||||
$matchingConfigs = $githubApp->runnerConfigs()
|
||||
->where('is_enabled', true)
|
||||
->get()
|
||||
->contains(fn (GithubRunnerConfig $config) => $config->matchesLabels($labels));
|
||||
if (! $matches) {
|
||||
->filter(fn (GithubRunnerConfig $config) => $config->matchesLabels($labels));
|
||||
if ($matchingConfigs->isEmpty()) {
|
||||
return response('Nothing to do. No runner configuration matches the job labels.');
|
||||
}
|
||||
if (! $matchingConfigs->contains('allow_pull_requests', true) && $this->isPullRequestWorkflowJob($githubApp, $payload)) {
|
||||
return response('Nothing to do. The runner configuration does not allow pull request jobs.');
|
||||
}
|
||||
|
||||
$execution = GithubRunnerExecution::createOrFirst(
|
||||
['github_app_id' => $githubApp->id, 'trigger_workflow_job_id' => $jobId],
|
||||
@@ -335,6 +340,29 @@ class Github extends Controller
|
||||
return response('Nothing to do.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether a queued job belongs to a workflow run started by a pull request, so no runner is started
|
||||
* for a job that the job-started hook would refuse. The `workflow_job` payload has no event, so the
|
||||
* run is read from GitHub. When that fails, the job counts as no pull request job and the hook still
|
||||
* refuses it in the runner.
|
||||
*/
|
||||
private function isPullRequestWorkflowJob(GithubApp $githubApp, Collection $payload): bool
|
||||
{
|
||||
$runId = (int) data_get($payload, 'workflow_job.run_id', 0);
|
||||
$repository = (string) data_get($payload, 'repository.full_name', '');
|
||||
if ($runId <= 0 || ! str_contains($repository, '/')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
$event = (new GithubRunnerApi($githubApp))->workflowRunEvent($repository, $runId);
|
||||
} catch (\Throwable) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return in_array($event, GithubRunnerContainer::PULL_REQUEST_EVENTS, true);
|
||||
}
|
||||
|
||||
public function normal(Request $request)
|
||||
{
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user