NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Git for Laravel

GitHub Actions

repo($path)->actions() ovláda GitHub Actions jedného repozitára: spustí workflow na refe, vráti run, ktorý GitHub spustil, umožní ho sledovať — jeho stav, joby aj kroky každého jobu — a zrušiť. GitLab a Bitbucket vyhodia FeatureNotSupportedException; ich pipeline balík nemapuje.

use RoundlyConsulting\Git\Enums\WorkflowStatus;
use RoundlyConsulting\Git\Facades\Git;

$actions = Git::github($credential)->repo('acme/infra')->actions();

$dispatched = $actions->dispatch('deploy.yml', 'refs/heads/main', ['request_id' => $id]);
$run = $actions->run($dispatched->runId);              // WorkflowRun
$run->isActive();                                       // poll until completed

$actions->runs('deploy.yml')->branch('main')->event('workflow_dispatch')
    ->status(WorkflowStatus::InProgress)->createdAfter($since)->get();   // Page<WorkflowRun>

$actions->jobs($run->id)->allAttempts()->lazy();        // WorkflowJob, with ->steps
$actions->jobs($run->id)->perPage(1)->get()->total;    // did the run start any job?
$actions->cancel($run->id);                             // true = accepted, false = already done
Metóda handleVracia
dispatch($workflow, $ref, $inputs = [])DispatchedWorkflow — runId, apiUrl a url runu, ktorý GitHub spustil, a dispatchedAt.
runs(?$workflow)WorkflowRunQuery — od najnovšieho; bez workflowu všetky workflowy repozitára.
run($id)WorkflowRun — run v aktuálnom stave.
jobs($runId)WorkflowJobQuery — posledný pokus, pokiaľ nezavoláte allAttempts() alebo attempt($n).
cancel($runId)bool — true, keď GitHub zrušenie prijal, false, keď run už skončil (409).

Každé id workflowu aj runu sa skontroluje ešte pred požiadavkou — id skončí v URL a ../7 či 7/jobs by oslovili iný zdroj. Workflow je názov jeho súboru (deploy.yml — jeden segment s koncovkou .yml alebo .yaml) alebo jeho číselné id a id runu tvoria len číslice; čokoľvek iné vyhodí OutOfScopeException. dispatch() a cancel() vyžadujú prihlasovacie údaje.

Spustenie workflowu

  • $ref sa odošle tak, ako ho zadáte — funguje main aj refs/heads/main. $inputs sú vstupy, ktoré workflow deklaruje, každý ako reťazec, číslo alebo boolean; pozičný kľúč, vnorená hodnota či null vyhodí InvalidArgumentException. Koľko vstupov workflow prijme, určí odpoveď 422 z GitHubu, nie limit na strane klienta.
  • Na github.com a GHE.com GitHub odpovie runom, ktorý spustil, takže runId, apiUrl aj url sú vyplnené. GitHub Enterprise Server túto odpoveď nezdokumentoval, preto sú tam všetky tri null — run nájdete postupom nižšie.
  • dispatchedAt je lokálny čas prečítaný ešte pred odoslaním požiadavky, takže dopyt od tohto času run nemôže minúť.
  • Spustenie sa nikdy neopakuje: stratená odpoveď a následné opakovanie by spustili druhý build.

Nájdenie runu bez runId

Na GitHub Enterprise Server, alebo keď preberáte run spustený inde, vložte do run-name workflowu značku — run-name: deploy [${{ inputs.request_id }}] — a hľadajte ju medzi runmi vytvorenými od spustenia:

use RoundlyConsulting\Git\Dto\WorkflowRun;

// .github/workflows/deploy.yml — run-name: deploy [${{ inputs.request_id }}]
$candidates = $actions->runs('deploy.yml')
    ->event('workflow_dispatch')
    ->branch('main')
    ->createdAfter($dispatched->dispatchedAt->copy()->subMinute())
    ->get();

$run = $candidates->collect()->first(fn (WorkflowRun $run) => str_contains($run->displayTitle, "[{$id}]"));

Pravidlá párovania — aká značka, najstarší alebo najnovší run, ďalšie kontroly path či headBranch — zostávajú na vás; balík kvôli nim nerobí žiadne ďalšie volanie API.

Dopyty na runy a joby

  • runs() filtruje cez branch(), event(), status(), actor() (login), headSha(), createdAfter() a createdBefore(). status() prijme WorkflowStatus aj WorkflowConclusion — GitHub berie oboje v jednom filtri — a pre Unknown vyhodí InvalidArgumentException.
  • createdAfter() a createdBefore() porovnávajú v UTC na sekundy a vašu inštanciu Carbon nikdy neposunú. excludePullRequests() len vynechá pull_requests každého runu z odpovede GitHubu — nič nefiltruje.
  • total stránky je total_count z GitHubu. GitHub filtrované vyhľadávanie runov zastaví na 1 000 výsledkoch, takže tam skončí aj lazy() — total väčší, než koľko ste prečítali, vás na to upozorní.
  • jobs() číta posledný pokus runu; allAttempts() číta všetky pokusy a attempt($n) jeden z nich (1 je prvé spustenie). Obe naraz alebo pokus menší ako 1 vyhodia InvalidArgumentException.

Sledovanie a rušenie

  • run($id) prechádza podmienenou cache, takže pri GIT_CACHE_ENABLED=true sa nezmenený run vráti ako 304, ktorú GitHub nezapočítava do primárneho limitu.
  • isActive() platí pre všetko okrem completed — vrátane stavu Unknown —, takže sledovanie sa nikdy nezastaví na stave, ktorý nevie prečítať. Stav alebo výsledok, ktorý GitHub pridá neskôr, sa prečíta ako Unknown a nikdy sa nepočíta za dokončený ani úspešný.
  • runStartedAt je čas vytvorenia, kým run čaká (queued, waiting); spoľahnite sa naň až vtedy, keď run beží.
  • GitHub ruší asynchrónne: true znamená, že zrušenie prijal, a výsledok ukáže ďalšie run() (wasCancelled()). false znamená, že run už skončil. Vynútené zrušenie (force-cancel) balík neponúka.

Výsledné objekty

ObjektPolia
WorkflowRunid, workflowId, name, displayTitle, status, conclusion, event, path, headBranch, headSha, headRepository, runNumber, runAttempt, actor, triggeringActor, url, createdAt, updatedAt, runStartedAt — a navyše isCompleted(), isActive(), succeeded(), wasCancelled()
WorkflowJobid, runId, name, status, conclusion, headSha, runAttempt, workflowName, headBranch, startedAt, completedAt, runnerName, labels, url, steps (zoznam JobStep) — a navyše succeeded() a step($name)
JobStepnumber, name, status, conclusion, startedAt, completedAt — a navyše succeeded()
DispatchedWorkflowprovider, workflow, ref, runId, apiUrl, url (null, keď ich GitHub neuviedol), dispatchedAt
WorkflowStatusRequested, Queued, Pending, Waiting, InProgress, Completed, Unknown
WorkflowConclusionSuccess, Failure, Neutral, Cancelled, Skipped, TimedOut, ActionRequired, Stale, StartupFailure, Unknown

Payload runu alebo jobu bez použiteľného id vyhodí InvalidArgumentException s názvom poľa — id si balík nikdy nevymyslí.

Oprávnenia

Obmedzený token GitHub App potrebuje pre jednotlivé volania tieto oprávnenia:

VolanieOprávnenie
dispatch(), cancel()actions: write
runs(), run(), jobs()actions: read
compare(), branch(), activity()contents: read
use RoundlyConsulting\Git\Dto\Credentials\GithubAppToken;
use RoundlyConsulting\Git\Dto\Input\InstallationTokenScope;

$credential = GithubAppToken::for($appId, $installationId, $privateKey)->forScope(
    new InstallationTokenScope(repositories: ['acme/infra'], permissions: ['actions' => 'write']),
);

Git::github($credential)->repo('acme/infra')->actions()->dispatch('deploy.yml', 'main');

Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

Ďalšie spôsoby podpory vrátane kryptomien

Odoslaním daru súhlasíte s našimi podmienkami prijímania darov.

Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.