tenseleyflow/shithub / 0d4a1fc

Browse files

migration 0048: workflow_artifacts (S41a)

Authored by mfwolffe <wolffemf@dukes.jmu.edu>
SHA
0d4a1fcb17168fda7c049e3e6e7c911d51a7338e
Parents
8b1f27d
Tree
d381155

1 changed file

StatusFile+-
A internal/migrationsfs/migrations/0048_workflow_artifacts.sql 46 0
internal/migrationsfs/migrations/0048_workflow_artifacts.sqladded
@@ -0,0 +1,46 @@
1
+-- SPDX-License-Identifier: AGPL-3.0-or-later
2
+--
3
+-- S41a workflow artifacts — uploaded blobs from `shithub/upload-artifact`
4
+-- magic step.
5
+--
6
+-- Each row references the run (not the job) so re-runs can produce a
7
+-- fresh artifact set; (run_id, name) is unique per run. object_key is
8
+-- the Spaces key (under runs/<run_id>/artifacts/<name>); the blob
9
+-- itself lives in object storage, not Postgres.
10
+--
11
+-- expires_at defaults to 90 days from creation; the retention sweep
12
+-- (S41g) deletes Spaces blobs past their expiry and prunes rows.
13
+-- Per-run override is supported via the upload-artifact `retention-days`
14
+-- input.
15
+--
16
+-- The runner uses signed S3 PUT URLs (S41c artifact upload endpoint)
17
+-- to upload directly without proxying through shithubd-web. The
18
+-- byte_count is reported back after upload completes (S41d).
19
+
20
+-- +goose Up
21
+
22
+CREATE TABLE workflow_artifacts (
23
+    id          bigserial    PRIMARY KEY,
24
+    run_id      bigint       NOT NULL REFERENCES workflow_runs(id) ON DELETE CASCADE,
25
+    name        text         NOT NULL,
26
+    object_key  text         NOT NULL,
27
+    byte_count  bigint       NOT NULL DEFAULT 0,
28
+    expires_at  timestamptz  NOT NULL DEFAULT (now() + interval '90 days'),
29
+    created_at  timestamptz  NOT NULL DEFAULT now(),
30
+
31
+    UNIQUE (run_id, name),
32
+
33
+    CONSTRAINT workflow_artifacts_name_length CHECK (char_length(name) BETWEEN 1 AND 100),
34
+    CONSTRAINT workflow_artifacts_name_format CHECK (
35
+        name ~ '^[A-Za-z0-9._-]+$' AND name NOT LIKE '..%' AND name NOT LIKE '%/%'
36
+    ),
37
+    CONSTRAINT workflow_artifacts_object_key_length CHECK (char_length(object_key) BETWEEN 1 AND 1024),
38
+    CONSTRAINT workflow_artifacts_byte_count_nonneg CHECK (byte_count >= 0)
39
+);
40
+
41
+CREATE INDEX workflow_artifacts_run_idx     ON workflow_artifacts (run_id);
42
+CREATE INDEX workflow_artifacts_expires_idx ON workflow_artifacts (expires_at);
43
+
44
+
45
+-- +goose Down
46
+DROP TABLE IF EXISTS workflow_artifacts;