coolify/app/Models/GithubRunnerExecution.php
Andras Bacsai 5c50ab6162 feat(github-runners): improve runner lifecycle and GitHub sync
Add runner execution observability and lifecycle hardening for self-hosted
GitHub Actions runners, including:
- scheduled artifact cleanup job for cached runner tarballs/templates
- workflow_job in_progress handling to mark executions as running
- safer cleanup failure handling and non-functional server fallback
- persisted workflow job HTML URLs with execution "Open" links in UI
- configurable runner group name sync (UI + provisioning + GitHub API)
- webhook events persistence and auto-fix for missing required events
- strict enum/status checks and related model cast/query improvements

Also includes migrations and expanded feature/unit coverage for webhook,
provisioning, cleanup, and runner group/event sync behaviors.
2026-03-03 22:21:13 +01:00

64 lines
1.5 KiB
PHP

<?php
namespace App\Models;
use App\Enums\GithubRunnerStatus;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class GithubRunnerExecution extends BaseModel
{
protected $guarded = [];
protected function casts(): array
{
return [
'status' => GithubRunnerStatus::class,
'workflow_job_id' => 'integer',
'runner_id' => 'integer',
'pid' => 'integer',
'started_at' => 'datetime',
'completed_at' => 'datetime',
];
}
public function server(): BelongsTo
{
return $this->belongsTo(Server::class);
}
public function config(): BelongsTo
{
return $this->belongsTo(GithubRunnerConfig::class, 'github_runner_config_id');
}
public function isActive(): bool
{
return $this->status->isActive();
}
public function duration(): ?string
{
if (! $this->started_at) {
return null;
}
$end = $this->completed_at ?? now();
return $this->started_at->diffForHumans($end, true);
}
public function workflowJobUrl(): ?string
{
$directUrl = trim((string) $this->workflow_job_html_url);
if ($directUrl !== '') {
return $directUrl;
}
$repositoryFullName = trim((string) $this->repository_full_name);
if ($repositoryFullName === '' || ! $this->workflow_job_id) {
return null;
}
return "https://github.com/{$repositoryFullName}/actions?query=".urlencode((string) $this->workflow_job_id);
}
}