# notify when the latest ci pipeline completes export def notify [] { while (info | get status) in ["running", "queued"] { sleep 1sec; }; let name = ($env.PWD | path basename) notify-send $"CI ($name)" $"Job (info | get conclusion)" } export def watch [] { loop { while (info | get status) != "running" { sleep 10sec; } notify } } export def info [] { if (get-ci) == "gitlab" { return (glab ci get -F json | from json | { conclusion: $in.status, exists: true, ...$in }) } else if (get-ci) == "github" { use git.nu let branch = (git gb | where current == true | first | get branch) let info = (gh run list --json conclusion,name,startedAt,status,number,headBranch | from json | where headBranch == $branch | get -i 0 ) if $info != null { return { id: $info.number, name: $info.name, conclusion: $info.conclusion, status: (match $info.status { "in_progress" => {"running"}, "completed" => { $info.conclusion } _ => $info.status }), exists: true, } } } ({ id: null, name: null, status: null, conclusion: null, exists: false, }) } # notify in background export def notify-bg [] { use task.nu task spawn -i -l "ci-notify" -g (task-group) { ci notify } } export def watch-bg [] { use task.nu task spawn -l "ci-watch" -g (task-group) { while (ci info | get status) != "running" { sleep 10sec; } notify-send $"CI (ci info | get id)" "Job started" ci notify ci watch-bg } } export def get-ci [] { let remote = (git remote get-url --all origin) if ($remote | str contains gitlab) { "gitlab" } else if ($remote | str contains github.com) { "github" } } def task-group [] { let name = ($env.PWD | path basename) let groupname = $"ci-($name)" if not ($groupname in ...(task group | columns)) { task group add $groupname -p 4 } $groupname }