MySQL · 5483 bytes Raw Blame History
1 -- SPDX-License-Identifier: AGPL-3.0-or-later
2
3 -- name: InsertWorkflowJob :one
4 INSERT INTO workflow_jobs (
5 run_id, job_index, job_key, job_name,
6 runs_on, needs_jobs, if_expr, timeout_minutes,
7 permissions, job_env
8 ) VALUES (
9 $1, $2, $3, $4, $5, $6, $7, $8, $9, $10
10 )
11 RETURNING id, run_id, job_index, job_key, job_name, runs_on,
12 runner_id, needs_jobs, if_expr, timeout_minutes, permissions,
13 job_env, status, conclusion, cancel_requested,
14 started_at, completed_at, version, created_at, updated_at;
15
16 -- name: GetWorkflowJobByID :one
17 SELECT id, run_id, job_index, job_key, job_name, runs_on,
18 runner_id, needs_jobs, if_expr, timeout_minutes, permissions,
19 job_env, status, conclusion, cancel_requested,
20 started_at, completed_at, version, created_at, updated_at
21 FROM workflow_jobs
22 WHERE id = $1;
23
24 -- name: UpdateWorkflowJobStatus :one
25 UPDATE workflow_jobs
26 SET status = $2,
27 conclusion = sqlc.narg(conclusion)::check_conclusion,
28 started_at = sqlc.narg(started_at)::timestamptz,
29 completed_at = sqlc.narg(completed_at)::timestamptz,
30 version = version + 1,
31 updated_at = now()
32 WHERE id = $1
33 RETURNING id, run_id, job_index, job_key, job_name, runs_on,
34 runner_id, needs_jobs, if_expr, timeout_minutes, permissions,
35 job_env, status, conclusion, cancel_requested,
36 started_at, completed_at, version, created_at, updated_at;
37
38 -- name: RequestWorkflowJobCancel :one
39 UPDATE workflow_jobs
40 SET cancel_requested = true,
41 status = CASE
42 WHEN status = 'queued' THEN 'cancelled'::workflow_job_status
43 ELSE status
44 END,
45 conclusion = CASE
46 WHEN status = 'queued' THEN 'cancelled'::check_conclusion
47 ELSE conclusion
48 END,
49 started_at = CASE
50 WHEN status = 'queued' THEN COALESCE(started_at, now())
51 ELSE started_at
52 END,
53 completed_at = CASE
54 WHEN status = 'queued' THEN COALESCE(completed_at, now())
55 ELSE completed_at
56 END,
57 version = version + 1,
58 updated_at = now()
59 WHERE id = $1
60 AND status IN ('queued', 'running')
61 AND (status = 'queued' OR cancel_requested = false)
62 RETURNING id, run_id, job_index, job_key, job_name, runs_on,
63 runner_id, needs_jobs, if_expr, timeout_minutes, permissions,
64 job_env, status, conclusion, cancel_requested,
65 started_at, completed_at, version, created_at, updated_at;
66
67 -- name: RequestWorkflowRunCancel :many
68 UPDATE workflow_jobs
69 SET cancel_requested = true,
70 status = CASE
71 WHEN status = 'queued' THEN 'cancelled'::workflow_job_status
72 ELSE status
73 END,
74 conclusion = CASE
75 WHEN status = 'queued' THEN 'cancelled'::check_conclusion
76 ELSE conclusion
77 END,
78 started_at = CASE
79 WHEN status = 'queued' THEN COALESCE(started_at, now())
80 ELSE started_at
81 END,
82 completed_at = CASE
83 WHEN status = 'queued' THEN COALESCE(completed_at, now())
84 ELSE completed_at
85 END,
86 version = version + 1,
87 updated_at = now()
88 WHERE run_id = $1
89 AND status IN ('queued', 'running')
90 AND (status = 'queued' OR cancel_requested = false)
91 RETURNING id, run_id, job_index, job_key, job_name, runs_on,
92 runner_id, needs_jobs, if_expr, timeout_minutes, permissions,
93 job_env, status, conclusion, cancel_requested,
94 started_at, completed_at, version, created_at, updated_at;
95
96 -- name: CountRunningJobsForRunner :one
97 SELECT COUNT(*)::integer
98 FROM workflow_jobs
99 WHERE runner_id = sqlc.arg(runner_id)::bigint AND status = 'running';
100
101 -- name: ClaimQueuedWorkflowJob :one
102 WITH candidate AS (
103 SELECT j.id
104 FROM workflow_jobs j
105 WHERE j.status = 'queued'
106 AND j.cancel_requested = false
107 AND j.runner_id IS NULL
108 AND (j.runs_on = '' OR j.runs_on = ANY(sqlc.arg(labels)::text[]))
109 AND NOT EXISTS (
110 SELECT 1
111 FROM workflow_jobs dep
112 WHERE dep.run_id = j.run_id
113 AND dep.job_key = ANY(j.needs_jobs)
114 AND (dep.status <> 'completed' OR dep.conclusion <> 'success')
115 )
116 ORDER BY j.created_at ASC, j.id ASC
117 FOR UPDATE OF j SKIP LOCKED
118 LIMIT 1
119 ),
120 claimed AS (
121 UPDATE workflow_jobs j
122 SET runner_id = sqlc.arg(runner_id)::bigint,
123 status = 'running',
124 started_at = COALESCE(j.started_at, now()),
125 version = j.version + 1,
126 updated_at = now()
127 FROM candidate c
128 WHERE j.id = c.id
129 RETURNING j.id, j.run_id, j.job_index, j.job_key, j.job_name, j.runs_on,
130 j.runner_id, j.needs_jobs, j.if_expr, j.timeout_minutes,
131 j.permissions, j.job_env, j.status, j.conclusion,
132 j.cancel_requested, j.started_at, j.completed_at, j.version,
133 j.created_at, j.updated_at
134 )
135 SELECT c.id, c.run_id, c.job_index, c.job_key, c.job_name, c.runs_on,
136 c.runner_id, c.needs_jobs, c.if_expr, c.timeout_minutes,
137 c.permissions, c.job_env, c.status, c.conclusion,
138 c.cancel_requested, c.started_at, c.completed_at, c.version,
139 c.created_at, c.updated_at,
140 r.repo_id, r.run_index, r.workflow_file, r.workflow_name,
141 r.head_sha, r.head_ref, r.event, r.event_payload
142 FROM claimed c
143 JOIN workflow_runs r ON r.id = c.run_id;
144
145 -- name: ListJobsForRun :many
146 SELECT id, run_id, job_index, job_key, job_name, runs_on, status,
147 conclusion, cancel_requested, needs_jobs, started_at, completed_at, created_at, updated_at
148 FROM workflow_jobs
149 WHERE run_id = $1
150 ORDER BY job_index ASC;
151