Go · 16674 bytes Raw Blame History
1 // Code generated by sqlc. DO NOT EDIT.
2 // versions:
3 // sqlc v1.31.1
4 // source: workflow_jobs.sql
5
6 package actionsdb
7
8 import (
9 "context"
10
11 "github.com/jackc/pgx/v5/pgtype"
12 )
13
14 const claimQueuedWorkflowJob = `-- name: ClaimQueuedWorkflowJob :one
15 WITH candidate AS (
16 SELECT j.id
17 FROM workflow_jobs j
18 JOIN workflow_runs r ON r.id = j.run_id
19 JOIN repos repo ON repo.id = r.repo_id
20 LEFT JOIN actions_site_policy sp ON sp.id = true
21 LEFT JOIN actions_org_policies op ON op.org_id = repo.owner_org_id
22 LEFT JOIN actions_repo_policies rp ON rp.repo_id = r.repo_id
23 WHERE j.status = 'queued'
24 AND r.status IN ('queued', 'running')
25 AND (r.need_approval = false OR r.approved_by_user_id IS NOT NULL)
26 AND j.cancel_requested = false
27 AND j.runner_id IS NULL
28 AND CASE
29 WHEN COALESCE(rp.actions_enabled, 'inherit'::actions_policy_state) = 'enabled' THEN true
30 WHEN COALESCE(rp.actions_enabled, 'inherit'::actions_policy_state) = 'disabled' THEN false
31 WHEN COALESCE(op.actions_enabled, 'inherit'::actions_policy_state) = 'enabled' THEN true
32 WHEN COALESCE(op.actions_enabled, 'inherit'::actions_policy_state) = 'disabled' THEN false
33 ELSE COALESCE(sp.actions_enabled, true)
34 END
35 AND (
36 SELECT COUNT(*)::integer
37 FROM workflow_jobs running_job
38 JOIN workflow_runs running_run ON running_run.id = running_job.run_id
39 WHERE running_job.status = 'running'
40 AND running_run.repo_id = r.repo_id
41 ) < COALESCE(rp.max_repo_concurrent_jobs, op.max_repo_concurrent_jobs, sp.max_repo_concurrent_jobs, 20)
42 AND (
43 SELECT COUNT(*)::integer
44 FROM workflow_jobs running_job
45 JOIN workflow_runs running_run ON running_run.id = running_job.run_id
46 JOIN repos running_repo ON running_repo.id = running_run.repo_id
47 WHERE running_job.status = 'running'
48 AND (
49 (repo.owner_user_id IS NOT NULL AND running_repo.owner_user_id = repo.owner_user_id)
50 OR (repo.owner_org_id IS NOT NULL AND running_repo.owner_org_id = repo.owner_org_id)
51 )
52 ) < COALESCE(rp.max_owner_concurrent_jobs, op.max_owner_concurrent_jobs, sp.max_owner_concurrent_jobs, 100)
53 AND (j.runs_on = '' OR j.runs_on = ANY($1::text[]))
54 AND NOT EXISTS (
55 SELECT 1
56 FROM workflow_jobs dep
57 WHERE dep.run_id = j.run_id
58 AND dep.job_key = ANY(j.needs_jobs)
59 AND (dep.status <> 'completed' OR dep.conclusion <> 'success')
60 )
61 AND NOT EXISTS (
62 SELECT 1
63 FROM workflow_runs blocker
64 WHERE r.concurrency_group <> ''
65 AND blocker.repo_id = r.repo_id
66 AND blocker.concurrency_group = r.concurrency_group
67 AND blocker.id <> r.id
68 AND blocker.status IN ('queued', 'running')
69 AND (blocker.created_at, blocker.id) < (r.created_at, r.id)
70 AND EXISTS (
71 SELECT 1
72 FROM workflow_jobs blocker_job
73 WHERE blocker_job.run_id = blocker.id
74 AND blocker_job.status IN ('queued', 'running')
75 AND blocker_job.cancel_requested = false
76 )
77 )
78 ORDER BY j.created_at ASC, j.id ASC
79 FOR UPDATE OF j SKIP LOCKED
80 LIMIT 1
81 ),
82 claimed AS (
83 UPDATE workflow_jobs j
84 SET runner_id = $2::bigint,
85 status = 'running',
86 started_at = COALESCE(j.started_at, now()),
87 version = j.version + 1,
88 updated_at = now()
89 FROM candidate c
90 WHERE j.id = c.id
91 RETURNING j.id, j.run_id, j.job_index, j.job_key, j.job_name, j.runs_on,
92 j.runner_id, j.needs_jobs, j.if_expr, j.timeout_minutes,
93 j.permissions, j.job_env, j.status, j.conclusion,
94 j.cancel_requested, j.started_at, j.completed_at, j.version,
95 j.created_at, j.updated_at
96 )
97 SELECT c.id, c.run_id, c.job_index, c.job_key, c.job_name, c.runs_on,
98 c.runner_id, c.needs_jobs, c.if_expr, c.timeout_minutes,
99 c.permissions, c.job_env, c.status, c.conclusion,
100 c.cancel_requested, c.started_at, c.completed_at, c.version,
101 c.created_at, c.updated_at,
102 r.repo_id, r.run_index, r.workflow_file, r.workflow_name,
103 r.head_sha, r.head_ref, r.event, r.event_payload,
104 COALESCE(owner_user.username, owner_org.slug)::text AS repo_owner,
105 repo.name AS repo_name
106 FROM claimed c
107 JOIN workflow_runs r ON r.id = c.run_id
108 JOIN repos repo ON repo.id = r.repo_id
109 LEFT JOIN users owner_user ON owner_user.id = repo.owner_user_id
110 LEFT JOIN orgs owner_org ON owner_org.id = repo.owner_org_id
111 `
112
113 type ClaimQueuedWorkflowJobParams struct {
114 Labels []string
115 RunnerID int64
116 }
117
118 type ClaimQueuedWorkflowJobRow struct {
119 ID int64
120 RunID int64
121 JobIndex int32
122 JobKey string
123 JobName string
124 RunsOn string
125 RunnerID pgtype.Int8
126 NeedsJobs []string
127 IfExpr string
128 TimeoutMinutes int32
129 Permissions []byte
130 JobEnv []byte
131 Status WorkflowJobStatus
132 Conclusion NullCheckConclusion
133 CancelRequested bool
134 StartedAt pgtype.Timestamptz
135 CompletedAt pgtype.Timestamptz
136 Version int32
137 CreatedAt pgtype.Timestamptz
138 UpdatedAt pgtype.Timestamptz
139 RepoID int64
140 RunIndex int64
141 WorkflowFile string
142 WorkflowName string
143 HeadSha string
144 HeadRef string
145 Event WorkflowRunEvent
146 EventPayload []byte
147 RepoOwner string
148 RepoName string
149 }
150
151 func (q *Queries) ClaimQueuedWorkflowJob(ctx context.Context, db DBTX, arg ClaimQueuedWorkflowJobParams) (ClaimQueuedWorkflowJobRow, error) {
152 row := db.QueryRow(ctx, claimQueuedWorkflowJob, arg.Labels, arg.RunnerID)
153 var i ClaimQueuedWorkflowJobRow
154 err := row.Scan(
155 &i.ID,
156 &i.RunID,
157 &i.JobIndex,
158 &i.JobKey,
159 &i.JobName,
160 &i.RunsOn,
161 &i.RunnerID,
162 &i.NeedsJobs,
163 &i.IfExpr,
164 &i.TimeoutMinutes,
165 &i.Permissions,
166 &i.JobEnv,
167 &i.Status,
168 &i.Conclusion,
169 &i.CancelRequested,
170 &i.StartedAt,
171 &i.CompletedAt,
172 &i.Version,
173 &i.CreatedAt,
174 &i.UpdatedAt,
175 &i.RepoID,
176 &i.RunIndex,
177 &i.WorkflowFile,
178 &i.WorkflowName,
179 &i.HeadSha,
180 &i.HeadRef,
181 &i.Event,
182 &i.EventPayload,
183 &i.RepoOwner,
184 &i.RepoName,
185 )
186 return i, err
187 }
188
189 const countRunningJobsForRunner = `-- name: CountRunningJobsForRunner :one
190 SELECT COUNT(*)::integer
191 FROM workflow_jobs
192 WHERE runner_id = $1::bigint AND status = 'running'
193 `
194
195 func (q *Queries) CountRunningJobsForRunner(ctx context.Context, db DBTX, runnerID int64) (int32, error) {
196 row := db.QueryRow(ctx, countRunningJobsForRunner, runnerID)
197 var column_1 int32
198 err := row.Scan(&column_1)
199 return column_1, err
200 }
201
202 const getWorkflowJobByID = `-- name: GetWorkflowJobByID :one
203 SELECT id, run_id, job_index, job_key, job_name, runs_on,
204 runner_id, needs_jobs, if_expr, timeout_minutes, permissions,
205 job_env, status, conclusion, cancel_requested,
206 started_at, completed_at, version, created_at, updated_at
207 FROM workflow_jobs
208 WHERE id = $1
209 `
210
211 func (q *Queries) GetWorkflowJobByID(ctx context.Context, db DBTX, id int64) (WorkflowJob, error) {
212 row := db.QueryRow(ctx, getWorkflowJobByID, id)
213 var i WorkflowJob
214 err := row.Scan(
215 &i.ID,
216 &i.RunID,
217 &i.JobIndex,
218 &i.JobKey,
219 &i.JobName,
220 &i.RunsOn,
221 &i.RunnerID,
222 &i.NeedsJobs,
223 &i.IfExpr,
224 &i.TimeoutMinutes,
225 &i.Permissions,
226 &i.JobEnv,
227 &i.Status,
228 &i.Conclusion,
229 &i.CancelRequested,
230 &i.StartedAt,
231 &i.CompletedAt,
232 &i.Version,
233 &i.CreatedAt,
234 &i.UpdatedAt,
235 )
236 return i, err
237 }
238
239 const insertWorkflowJob = `-- name: InsertWorkflowJob :one
240
241 INSERT INTO workflow_jobs (
242 run_id, job_index, job_key, job_name,
243 runs_on, needs_jobs, if_expr, timeout_minutes,
244 permissions, job_env
245 ) VALUES (
246 $1, $2, $3, $4, $5, $6, $7, $8, $9, $10
247 )
248 RETURNING id, run_id, job_index, job_key, job_name, runs_on,
249 runner_id, needs_jobs, if_expr, timeout_minutes, permissions,
250 job_env, status, conclusion, cancel_requested,
251 started_at, completed_at, version, created_at, updated_at
252 `
253
254 type InsertWorkflowJobParams struct {
255 RunID int64
256 JobIndex int32
257 JobKey string
258 JobName string
259 RunsOn string
260 NeedsJobs []string
261 IfExpr string
262 TimeoutMinutes int32
263 Permissions []byte
264 JobEnv []byte
265 }
266
267 // SPDX-License-Identifier: AGPL-3.0-or-later
268 func (q *Queries) InsertWorkflowJob(ctx context.Context, db DBTX, arg InsertWorkflowJobParams) (WorkflowJob, error) {
269 row := db.QueryRow(ctx, insertWorkflowJob,
270 arg.RunID,
271 arg.JobIndex,
272 arg.JobKey,
273 arg.JobName,
274 arg.RunsOn,
275 arg.NeedsJobs,
276 arg.IfExpr,
277 arg.TimeoutMinutes,
278 arg.Permissions,
279 arg.JobEnv,
280 )
281 var i WorkflowJob
282 err := row.Scan(
283 &i.ID,
284 &i.RunID,
285 &i.JobIndex,
286 &i.JobKey,
287 &i.JobName,
288 &i.RunsOn,
289 &i.RunnerID,
290 &i.NeedsJobs,
291 &i.IfExpr,
292 &i.TimeoutMinutes,
293 &i.Permissions,
294 &i.JobEnv,
295 &i.Status,
296 &i.Conclusion,
297 &i.CancelRequested,
298 &i.StartedAt,
299 &i.CompletedAt,
300 &i.Version,
301 &i.CreatedAt,
302 &i.UpdatedAt,
303 )
304 return i, err
305 }
306
307 const listJobsForRun = `-- name: ListJobsForRun :many
308 SELECT id, run_id, job_index, job_key, job_name, runs_on, status,
309 conclusion, cancel_requested, needs_jobs, started_at, completed_at, created_at, updated_at
310 FROM workflow_jobs
311 WHERE run_id = $1
312 ORDER BY job_index ASC
313 `
314
315 type ListJobsForRunRow struct {
316 ID int64
317 RunID int64
318 JobIndex int32
319 JobKey string
320 JobName string
321 RunsOn string
322 Status WorkflowJobStatus
323 Conclusion NullCheckConclusion
324 CancelRequested bool
325 NeedsJobs []string
326 StartedAt pgtype.Timestamptz
327 CompletedAt pgtype.Timestamptz
328 CreatedAt pgtype.Timestamptz
329 UpdatedAt pgtype.Timestamptz
330 }
331
332 func (q *Queries) ListJobsForRun(ctx context.Context, db DBTX, runID int64) ([]ListJobsForRunRow, error) {
333 rows, err := db.Query(ctx, listJobsForRun, runID)
334 if err != nil {
335 return nil, err
336 }
337 defer rows.Close()
338 items := []ListJobsForRunRow{}
339 for rows.Next() {
340 var i ListJobsForRunRow
341 if err := rows.Scan(
342 &i.ID,
343 &i.RunID,
344 &i.JobIndex,
345 &i.JobKey,
346 &i.JobName,
347 &i.RunsOn,
348 &i.Status,
349 &i.Conclusion,
350 &i.CancelRequested,
351 &i.NeedsJobs,
352 &i.StartedAt,
353 &i.CompletedAt,
354 &i.CreatedAt,
355 &i.UpdatedAt,
356 ); err != nil {
357 return nil, err
358 }
359 items = append(items, i)
360 }
361 if err := rows.Err(); err != nil {
362 return nil, err
363 }
364 return items, nil
365 }
366
367 const listQueuedWorkflowJobRunsOn = `-- name: ListQueuedWorkflowJobRunsOn :many
368 SELECT
369 COALESCE(NULLIF(j.runs_on, ''), '(none)')::text AS runs_on,
370 COUNT(*)::integer AS queued_jobs,
371 COUNT(DISTINCT wr.id)::integer AS matching_runner_count,
372 MIN(j.created_at)::timestamptz AS oldest_queued_at
373 FROM workflow_jobs j
374 LEFT JOIN workflow_runners wr
375 ON (j.runs_on = '' OR j.runs_on = ANY(wr.labels))
376 AND wr.status IN ('idle', 'busy')
377 WHERE j.status = 'queued'
378 AND j.cancel_requested = false
379 AND j.runner_id IS NULL
380 GROUP BY COALESCE(NULLIF(j.runs_on, ''), '(none)')
381 ORDER BY queued_jobs DESC, runs_on ASC
382 `
383
384 type ListQueuedWorkflowJobRunsOnRow struct {
385 RunsOn string
386 QueuedJobs int32
387 MatchingRunnerCount int32
388 OldestQueuedAt pgtype.Timestamptz
389 }
390
391 func (q *Queries) ListQueuedWorkflowJobRunsOn(ctx context.Context, db DBTX) ([]ListQueuedWorkflowJobRunsOnRow, error) {
392 rows, err := db.Query(ctx, listQueuedWorkflowJobRunsOn)
393 if err != nil {
394 return nil, err
395 }
396 defer rows.Close()
397 items := []ListQueuedWorkflowJobRunsOnRow{}
398 for rows.Next() {
399 var i ListQueuedWorkflowJobRunsOnRow
400 if err := rows.Scan(
401 &i.RunsOn,
402 &i.QueuedJobs,
403 &i.MatchingRunnerCount,
404 &i.OldestQueuedAt,
405 ); err != nil {
406 return nil, err
407 }
408 items = append(items, i)
409 }
410 if err := rows.Err(); err != nil {
411 return nil, err
412 }
413 return items, nil
414 }
415
416 const requestWorkflowJobCancel = `-- name: RequestWorkflowJobCancel :one
417 UPDATE workflow_jobs
418 SET cancel_requested = true,
419 status = CASE
420 WHEN status = 'queued' THEN 'cancelled'::workflow_job_status
421 ELSE status
422 END,
423 conclusion = CASE
424 WHEN status = 'queued' THEN 'cancelled'::check_conclusion
425 ELSE conclusion
426 END,
427 started_at = CASE
428 WHEN status = 'queued' THEN COALESCE(started_at, now())
429 ELSE started_at
430 END,
431 completed_at = CASE
432 WHEN status = 'queued' THEN COALESCE(completed_at, now())
433 ELSE completed_at
434 END,
435 version = version + 1,
436 updated_at = now()
437 WHERE id = $1
438 AND status IN ('queued', 'running')
439 AND (status = 'queued' OR cancel_requested = false)
440 RETURNING id, run_id, job_index, job_key, job_name, runs_on,
441 runner_id, needs_jobs, if_expr, timeout_minutes, permissions,
442 job_env, status, conclusion, cancel_requested,
443 started_at, completed_at, version, created_at, updated_at
444 `
445
446 func (q *Queries) RequestWorkflowJobCancel(ctx context.Context, db DBTX, id int64) (WorkflowJob, error) {
447 row := db.QueryRow(ctx, requestWorkflowJobCancel, id)
448 var i WorkflowJob
449 err := row.Scan(
450 &i.ID,
451 &i.RunID,
452 &i.JobIndex,
453 &i.JobKey,
454 &i.JobName,
455 &i.RunsOn,
456 &i.RunnerID,
457 &i.NeedsJobs,
458 &i.IfExpr,
459 &i.TimeoutMinutes,
460 &i.Permissions,
461 &i.JobEnv,
462 &i.Status,
463 &i.Conclusion,
464 &i.CancelRequested,
465 &i.StartedAt,
466 &i.CompletedAt,
467 &i.Version,
468 &i.CreatedAt,
469 &i.UpdatedAt,
470 )
471 return i, err
472 }
473
474 const requestWorkflowRunCancel = `-- name: RequestWorkflowRunCancel :many
475 UPDATE workflow_jobs
476 SET cancel_requested = true,
477 status = CASE
478 WHEN status = 'queued' THEN 'cancelled'::workflow_job_status
479 ELSE status
480 END,
481 conclusion = CASE
482 WHEN status = 'queued' THEN 'cancelled'::check_conclusion
483 ELSE conclusion
484 END,
485 started_at = CASE
486 WHEN status = 'queued' THEN COALESCE(started_at, now())
487 ELSE started_at
488 END,
489 completed_at = CASE
490 WHEN status = 'queued' THEN COALESCE(completed_at, now())
491 ELSE completed_at
492 END,
493 version = version + 1,
494 updated_at = now()
495 WHERE run_id = $1
496 AND status IN ('queued', 'running')
497 AND (status = 'queued' OR cancel_requested = false)
498 RETURNING id, run_id, job_index, job_key, job_name, runs_on,
499 runner_id, needs_jobs, if_expr, timeout_minutes, permissions,
500 job_env, status, conclusion, cancel_requested,
501 started_at, completed_at, version, created_at, updated_at
502 `
503
504 func (q *Queries) RequestWorkflowRunCancel(ctx context.Context, db DBTX, runID int64) ([]WorkflowJob, error) {
505 rows, err := db.Query(ctx, requestWorkflowRunCancel, runID)
506 if err != nil {
507 return nil, err
508 }
509 defer rows.Close()
510 items := []WorkflowJob{}
511 for rows.Next() {
512 var i WorkflowJob
513 if err := rows.Scan(
514 &i.ID,
515 &i.RunID,
516 &i.JobIndex,
517 &i.JobKey,
518 &i.JobName,
519 &i.RunsOn,
520 &i.RunnerID,
521 &i.NeedsJobs,
522 &i.IfExpr,
523 &i.TimeoutMinutes,
524 &i.Permissions,
525 &i.JobEnv,
526 &i.Status,
527 &i.Conclusion,
528 &i.CancelRequested,
529 &i.StartedAt,
530 &i.CompletedAt,
531 &i.Version,
532 &i.CreatedAt,
533 &i.UpdatedAt,
534 ); err != nil {
535 return nil, err
536 }
537 items = append(items, i)
538 }
539 if err := rows.Err(); err != nil {
540 return nil, err
541 }
542 return items, nil
543 }
544
545 const updateWorkflowJobStatus = `-- name: UpdateWorkflowJobStatus :one
546 UPDATE workflow_jobs
547 SET status = $2,
548 conclusion = $3::check_conclusion,
549 started_at = $4::timestamptz,
550 completed_at = $5::timestamptz,
551 version = version + 1,
552 updated_at = now()
553 WHERE id = $1
554 RETURNING id, run_id, job_index, job_key, job_name, runs_on,
555 runner_id, needs_jobs, if_expr, timeout_minutes, permissions,
556 job_env, status, conclusion, cancel_requested,
557 started_at, completed_at, version, created_at, updated_at
558 `
559
560 type UpdateWorkflowJobStatusParams struct {
561 ID int64
562 Status WorkflowJobStatus
563 Conclusion NullCheckConclusion
564 StartedAt pgtype.Timestamptz
565 CompletedAt pgtype.Timestamptz
566 }
567
568 func (q *Queries) UpdateWorkflowJobStatus(ctx context.Context, db DBTX, arg UpdateWorkflowJobStatusParams) (WorkflowJob, error) {
569 row := db.QueryRow(ctx, updateWorkflowJobStatus,
570 arg.ID,
571 arg.Status,
572 arg.Conclusion,
573 arg.StartedAt,
574 arg.CompletedAt,
575 )
576 var i WorkflowJob
577 err := row.Scan(
578 &i.ID,
579 &i.RunID,
580 &i.JobIndex,
581 &i.JobKey,
582 &i.JobName,
583 &i.RunsOn,
584 &i.RunnerID,
585 &i.NeedsJobs,
586 &i.IfExpr,
587 &i.TimeoutMinutes,
588 &i.Permissions,
589 &i.JobEnv,
590 &i.Status,
591 &i.Conclusion,
592 &i.CancelRequested,
593 &i.StartedAt,
594 &i.CompletedAt,
595 &i.Version,
596 &i.CreatedAt,
597 &i.UpdatedAt,
598 )
599 return i, err
600 }
601