From acf84d6e2b8748a28df47415e890857b69fa5f57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?U=C4=9Fur=20=C3=96zy=C4=B1lmazel?= Date: Wed, 18 Mar 2026 20:31:07 +0300 Subject: [PATCH 1/4] remove jsonparser --- .golangci.yml | 2 + go.mod | 1 - go.sum | 2 - .../githubwebhookhandler.go | 29 ++++-- .../githubwebhookhandler_test.go | 13 +-- .../gitlabwebhookhandler.go | 92 ++++++++++++------- 6 files changed, 88 insertions(+), 51 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 3c3f6f8..c47793c 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -139,6 +139,8 @@ linters: - utils - tools - models + - name: nested-structs + disabled: true formatters: enable: diff --git a/go.mod b/go.mod index 8aac09a..b4850f8 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,6 @@ go 1.25.5 require ( github.com/IBM/sarama v1.47.0 - github.com/buger/jsonparser v1.1.1 github.com/golang-migrate/migrate/v4 v4.19.1 github.com/google/uuid v1.6.0 github.com/jackc/pgx/v5 v5.8.0 diff --git a/go.sum b/go.sum index 58dadab..7c5f9c8 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,6 @@ github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERo github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ= github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY= -github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= -github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= diff --git a/internal/transport/http/githubwebhookhandler/githubwebhookhandler.go b/internal/transport/http/githubwebhookhandler/githubwebhookhandler.go index f8543ef..d20bf3f 100644 --- a/internal/transport/http/githubwebhookhandler/githubwebhookhandler.go +++ b/internal/transport/http/githubwebhookhandler/githubwebhookhandler.go @@ -4,13 +4,13 @@ import ( "crypto/hmac" "crypto/sha256" "encoding/hex" + "encoding/json" "fmt" "log/slog" "strconv" "strings" "github.com/IBM/sarama" - "github.com/buger/jsonparser" "github.com/devchain-network/cauldron/internal/cerrors" "github.com/devchain-network/cauldron/internal/kafkacp" "github.com/devchain-network/cauldron/internal/transport/http/httphandler" @@ -108,16 +108,31 @@ func (h Handler) Handle(ctx *fasthttp.RequestCtx) { return } - senderLogin, err := jsonparser.GetString(ctx.PostBody(), "sender", "login") - if err != nil { - h.Logger.Error("senderLogin jsonparser.GetString error", "error", err) + var payload struct { + Sender struct { + Login string `json:"login"` + ID int64 `json:"id"` + } `json:"sender"` + } + + if err := json.Unmarshal(ctx.PostBody(), &payload); err != nil { + h.Logger.Error("json.Unmarshal error", "error", err) + ctx.SetStatusCode(fasthttp.StatusBadRequest) + + return + } + + senderLogin := payload.Sender.Login + if senderLogin == "" { + h.Logger.Error("sender login not found in payload") ctx.SetStatusCode(fasthttp.StatusBadRequest) return } - senderID, err := jsonparser.GetInt(ctx.PostBody(), "sender", "id") - if err != nil { - h.Logger.Error("senderID jsonparser.GetInt error", "error", err) + + senderID := payload.Sender.ID + if senderID == 0 { + h.Logger.Error("sender id not found in payload") ctx.SetStatusCode(fasthttp.StatusBadRequest) return diff --git a/internal/transport/http/githubwebhookhandler/githubwebhookhandler_test.go b/internal/transport/http/githubwebhookhandler/githubwebhookhandler_test.go index 608fa64..dbcf208 100644 --- a/internal/transport/http/githubwebhookhandler/githubwebhookhandler_test.go +++ b/internal/transport/http/githubwebhookhandler/githubwebhookhandler_test.go @@ -524,14 +524,15 @@ func TestMessageQueue_Scenarios(t *testing.T) { handler.Handle(ctx) - go func() { - msg := <-messageQueue + assert.Equal(t, fasthttp.StatusAccepted, ctx.Response.StatusCode()) + + select { + case msg := <-messageQueue: assert.NotNil(t, msg) assert.Equal(t, string(msg.Value.(sarama.ByteEncoder)), body) - }() - - assert.Equal(t, fasthttp.StatusAccepted, ctx.Response.StatusCode()) - assert.NotEmpty(t, <-messageQueue) + case <-time.After(time.Second): + t.Fatal("timed out waiting for message in queue") + } } func TestHandle_Success(t *testing.T) { diff --git a/internal/transport/http/gitlabwebhookhandler/gitlabwebhookhandler.go b/internal/transport/http/gitlabwebhookhandler/gitlabwebhookhandler.go index 84ec4d0..833e43e 100644 --- a/internal/transport/http/gitlabwebhookhandler/gitlabwebhookhandler.go +++ b/internal/transport/http/gitlabwebhookhandler/gitlabwebhookhandler.go @@ -1,12 +1,12 @@ package gitlabwebhookhandler import ( + "encoding/json" "fmt" "log/slog" "strconv" "github.com/IBM/sarama" - "github.com/buger/jsonparser" "github.com/devchain-network/cauldron/internal/cerrors" "github.com/devchain-network/cauldron/internal/kafkacp" "github.com/devchain-network/cauldron/internal/transport/http/httphandler" @@ -67,49 +67,71 @@ func (h Handler) Handle(ctx *fasthttp.RequestCtx) { return } + var payload struct { + ObjectKind string `json:"object_kind"` + EventName string `json:"event_name"` + ProjectID int64 `json:"project_id"` + PathWithNamespace string `json:"path_with_namespace"` + FullPath string `json:"full_path"` + GroupPath string `json:"group_path"` + UserID int64 `json:"user_id"` + UserUsername string `json:"user_username"` + Project struct { + ID int64 `json:"id"` + PathWithNamespace string `json:"path_with_namespace"` + } `json:"project"` + User struct { + ID int64 `json:"id"` + Username string `json:"username"` + } `json:"user"` + } + + if err := json.Unmarshal(ctx.PostBody(), &payload); err != nil { + h.Logger.Error("json.Unmarshal error", "error", err) + ctx.SetStatusCode(fasthttp.StatusBadRequest) + + return + } + // object_kind or event_name - one of them is required - objectKind, err := jsonparser.GetString(ctx.PostBody(), "object_kind") - if err != nil { - // fallback to event_name for premium/ultimate hooks (group, project, subgroup events) - objectKind, err = jsonparser.GetString(ctx.PostBody(), "event_name") - if err != nil { - h.Logger.Error("objectKind/eventName jsonparser.GetString error", "error", err) - ctx.SetStatusCode(fasthttp.StatusBadRequest) - - return - } + objectKind := payload.ObjectKind + if objectKind == "" { + objectKind = payload.EventName } + if objectKind == "" { + h.Logger.Error("objectKind/eventName not found in payload") + ctx.SetStatusCode(fasthttp.StatusBadRequest) - // project.id - try nested first, fallback to top-level (for premium events like project_create) - projectID, err := jsonparser.GetInt(ctx.PostBody(), "project", "id") - if err != nil { - projectID, _ = jsonparser.GetInt(ctx.PostBody(), "project_id") + return } - // project.path_with_namespace - try nested first, fallback for premium events - projectPath, err := jsonparser.GetString(ctx.PostBody(), "project", "path_with_namespace") - if err != nil { - // try top-level path_with_namespace (project_create) - projectPath, err = jsonparser.GetString(ctx.PostBody(), "path_with_namespace") - if err != nil { - // try full_path (subgroup_create) - projectPath, err = jsonparser.GetString(ctx.PostBody(), "full_path") - if err != nil { - // try group_path (user_add_to_group) - projectPath, _ = jsonparser.GetString(ctx.PostBody(), "group_path") - } - } + // project.id - try nested first, fallback to top-level + projectID := payload.Project.ID + if projectID == 0 { + projectID = payload.ProjectID + } + + // project.path_with_namespace - try nested first, then fallbacks + projectPath := payload.Project.PathWithNamespace + if projectPath == "" { + projectPath = payload.PathWithNamespace + } + if projectPath == "" { + projectPath = payload.FullPath + } + if projectPath == "" { + projectPath = payload.GroupPath } - // user info - try nested first (user.id, user.username), fallback to flat (user_id, user_username) - userID, err := jsonparser.GetInt(ctx.PostBody(), "user", "id") - if err != nil { - userID, _ = jsonparser.GetInt(ctx.PostBody(), "user_id") + // user info - try nested first, fallback to flat + userID := payload.User.ID + if userID == 0 { + userID = payload.UserID } - userUsername, err := jsonparser.GetString(ctx.PostBody(), "user", "username") - if err != nil { - userUsername, _ = jsonparser.GetString(ctx.PostBody(), "user_username") + userUsername := payload.User.Username + if userUsername == "" { + userUsername = payload.UserUsername } h.Logger.Info("received gitlab webhook", From fbbe66c7080dbe6e87df564065f93645a5ac590b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?U=C4=9Fur=20=C3=96zy=C4=B1lmazel?= Date: Wed, 18 Mar 2026 20:33:52 +0300 Subject: [PATCH 2/4] seperate migrations --- ...indexes.down.sql => 000009_add_indexes_for_github.down.sql} | 2 -- ...ore_indexes.up.sql => 000009_add_indexes_for_github.up.sql} | 3 --- migrations/000010_add_indexes_for_gitlab.down.sql | 2 ++ migrations/000010_add_indexes_for_gitlab.up.sql | 2 ++ 4 files changed, 4 insertions(+), 5 deletions(-) rename migrations/{000009_add_more_indexes.down.sql => 000009_add_indexes_for_github.down.sql} (50%) rename migrations/{000009_add_more_indexes.up.sql => 000009_add_indexes_for_github.up.sql} (69%) create mode 100644 migrations/000010_add_indexes_for_gitlab.down.sql create mode 100644 migrations/000010_add_indexes_for_gitlab.up.sql diff --git a/migrations/000009_add_more_indexes.down.sql b/migrations/000009_add_indexes_for_github.down.sql similarity index 50% rename from migrations/000009_add_more_indexes.down.sql rename to migrations/000009_add_indexes_for_github.down.sql index 4d96623..f4c257f 100644 --- a/migrations/000009_add_more_indexes.down.sql +++ b/migrations/000009_add_indexes_for_github.down.sql @@ -1,4 +1,2 @@ -DROP INDEX IF EXISTS "cauldron"."idx_gitlab_event_created_at"; -DROP INDEX IF EXISTS "cauldron"."idx_gitlab_created_at"; DROP INDEX IF EXISTS "cauldron"."idx_github_event_created_at"; DROP INDEX IF EXISTS "cauldron"."idx_github_created_at"; diff --git a/migrations/000009_add_more_indexes.up.sql b/migrations/000009_add_indexes_for_github.up.sql similarity index 69% rename from migrations/000009_add_more_indexes.up.sql rename to migrations/000009_add_indexes_for_github.up.sql index 4fdf7fa..15b5e95 100644 --- a/migrations/000009_add_more_indexes.up.sql +++ b/migrations/000009_add_indexes_for_github.up.sql @@ -5,6 +5,3 @@ CREATE INDEX IF NOT EXISTS "idx_github_created_at" ON "cauldron"."github" (creat -- Composite index for event + date range filtering -- Used in: most common query pattern (WHERE event = 'X' AND created_at >= $1) CREATE INDEX IF NOT EXISTS "idx_github_event_created_at" ON "cauldron"."github" (event, created_at); - -CREATE INDEX IF NOT EXISTS "idx_gitlab_created_at" ON "cauldron"."gitlab" (created_at); -CREATE INDEX IF NOT EXISTS "idx_gitlab_event_created_at" ON "cauldron"."gitlab" (object_kind, created_at); diff --git a/migrations/000010_add_indexes_for_gitlab.down.sql b/migrations/000010_add_indexes_for_gitlab.down.sql new file mode 100644 index 0000000..9bf9b74 --- /dev/null +++ b/migrations/000010_add_indexes_for_gitlab.down.sql @@ -0,0 +1,2 @@ +DROP INDEX IF EXISTS "cauldron"."idx_gitlab_event_created_at"; +DROP INDEX IF EXISTS "cauldron"."idx_gitlab_created_at"; diff --git a/migrations/000010_add_indexes_for_gitlab.up.sql b/migrations/000010_add_indexes_for_gitlab.up.sql new file mode 100644 index 0000000..2dcaeeb --- /dev/null +++ b/migrations/000010_add_indexes_for_gitlab.up.sql @@ -0,0 +1,2 @@ +CREATE INDEX IF NOT EXISTS "idx_gitlab_created_at" ON "cauldron"."gitlab" (created_at); +CREATE INDEX IF NOT EXISTS "idx_gitlab_event_created_at" ON "cauldron"."gitlab" (object_kind, created_at); From 7b4a443a12857a270f9de7962be81492530f672a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?U=C4=9Fur=20=C3=96zy=C4=B1lmazel?= Date: Wed, 18 Mar 2026 20:41:46 +0300 Subject: [PATCH 3/4] improve coverage --- .../githubwebhookhandler_test.go | 34 +++++++++++++++++++ .../gitlabwebhookhandler_test.go | 25 ++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/internal/transport/http/githubwebhookhandler/githubwebhookhandler_test.go b/internal/transport/http/githubwebhookhandler/githubwebhookhandler_test.go index dbcf208..8347f80 100644 --- a/internal/transport/http/githubwebhookhandler/githubwebhookhandler_test.go +++ b/internal/transport/http/githubwebhookhandler/githubwebhookhandler_test.go @@ -186,6 +186,40 @@ func TestHandle_InvalidHMAC(t *testing.T) { assert.Equal(t, fasthttp.StatusBadRequest, ctx.Response.StatusCode()) } +func TestHandle_InvalidJSON(t *testing.T) { + logger := mockslogger.New() + messageQueue := make(chan *sarama.ProducerMessage, 10) + + handler, err := githubwebhookhandler.New( + githubwebhookhandler.WithLogger(logger), + githubwebhookhandler.WithTopic(kafkacp.KafkaTopicIdentifierGitHub.String()), + githubwebhookhandler.WithWebhookSecret("my-secret"), + githubwebhookhandler.WithProducerGitHubMessageQueue(messageQueue), + ) + + assert.NoError(t, err) + assert.NotNil(t, handler) + + secret := "my-secret" + body := `{invalid json` + mac := hmac.New(sha256.New, []byte(secret)) + mac.Write([]byte(body)) + signature := "sha256=" + hex.EncodeToString(mac.Sum(nil)) + + ctx := newMockRequestCtx() + ctx.Request.SetBodyString(body) + ctx.Request.Header.Set("X-Hub-Signature-256", signature) + ctx.Request.Header.Set("X-Github-Event", "push") + ctx.Request.Header.Set("X-Github-Delivery", uuid.New().String()) + ctx.Request.Header.Set("X-Github-Hook-Id", "123") + ctx.Request.Header.Set("X-Github-Hook-Installation-Target-Id", "456") + ctx.Request.Header.Set("X-Github-Hook-Installation-Target-Type", "repository") + + handler.Handle(ctx) + + assert.Equal(t, fasthttp.StatusBadRequest, ctx.Response.StatusCode()) +} + func newMockRequestCtx() *fasthttp.RequestCtx { var ctx fasthttp.RequestCtx ctx.Init(&fasthttp.Request{}, nil, nil) diff --git a/internal/transport/http/gitlabwebhookhandler/gitlabwebhookhandler_test.go b/internal/transport/http/gitlabwebhookhandler/gitlabwebhookhandler_test.go index da81005..aeb5397 100644 --- a/internal/transport/http/gitlabwebhookhandler/gitlabwebhookhandler_test.go +++ b/internal/transport/http/gitlabwebhookhandler/gitlabwebhookhandler_test.go @@ -259,6 +259,31 @@ func TestHandle_NoWebhookUUID(t *testing.T) { <-done } +func TestHandle_InvalidJSON(t *testing.T) { + logger := mockslogger.New() + messageQueue := make(chan *sarama.ProducerMessage, 10) + + handler, err := gitlabwebhookhandler.New( + gitlabwebhookhandler.WithLogger(logger), + gitlabwebhookhandler.WithTopic(kafkacp.KafkaTopicIdentifierGitLab.String()), + gitlabwebhookhandler.WithWebhookSecret("my-secret"), + gitlabwebhookhandler.WithProducerGitLabMessageQueue(messageQueue), + ) + + assert.NoError(t, err) + assert.NotNil(t, handler) + + ctx := newMockRequestCtx() + ctx.Request.SetBodyString(`{invalid json`) + ctx.Request.Header.Set("X-Gitlab-Token", "my-secret") + ctx.Request.Header.Set("X-Gitlab-Event-Uuid", uuid.New().String()) + ctx.Request.Header.Set("X-Gitlab-Webhook-Uuid", uuid.New().String()) + + handler.Handle(ctx) + + assert.Equal(t, fasthttp.StatusBadRequest, ctx.Response.StatusCode()) +} + func TestHandle_NoObjectKindOrEventName(t *testing.T) { logger := mockslogger.New() messageQueue := make(chan *sarama.ProducerMessage, 10) From 41e50776655fc367b13b6c65ef39810ca7710b26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?U=C4=9Fur=20=C3=96zy=C4=B1lmazel?= Date: Wed, 18 Mar 2026 20:49:24 +0300 Subject: [PATCH 4/4] improve build actions --- .../workflows/build-push-cauldron-github-consumer.yml | 9 ++++++++- .../build-push-cauldron-github-group-consumer.yml | 9 ++++++++- .../workflows/build-push-cauldron-gitlab-consumer.yml | 9 ++++++++- .../build-push-cauldron-gitlab-group-consumer.yml | 9 ++++++++- .github/workflows/build-push-cauldron-migrator.yml | 9 ++++++++- .github/workflows/build-push-cauldron-webhookserver.yml | 9 ++++++++- .github/workflows/stg-cauldron-github-consumer.yml | 9 ++++++++- .github/workflows/stg-cauldron-github-group-consumer.yml | 9 ++++++++- .github/workflows/stg-cauldron-gitlab-consumer.yml | 9 ++++++++- .github/workflows/stg-cauldron-gitlab-group-consumer.yml | 9 ++++++++- .github/workflows/stg-cauldron-migrator.yml | 9 ++++++++- .github/workflows/stg-cauldron-webhookserver.yml | 9 ++++++++- 12 files changed, 96 insertions(+), 12 deletions(-) diff --git a/.github/workflows/build-push-cauldron-github-consumer.yml b/.github/workflows/build-push-cauldron-github-consumer.yml index cdb68c4..22062bb 100644 --- a/.github/workflows/build-push-cauldron-github-consumer.yml +++ b/.github/workflows/build-push-cauldron-github-consumer.yml @@ -2,6 +2,11 @@ name: GitHub Consumer (build-push) on: workflow_dispatch: + inputs: + tag: + description: 'Git tag to build (e.g. v1.2.3)' + required: false + type: string jobs: build-image: @@ -28,6 +33,8 @@ jobs: platforms: linux/amd64 push: true provenance: false - tags: ghcr.io/${{ github.repository }}/cauldron-github-consumer:latest + tags: | + ghcr.io/${{ github.repository }}/cauldron-github-consumer:latest + ghcr.io/${{ github.repository }}/cauldron-github-consumer:${{ inputs.tag || github.sha }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/.github/workflows/build-push-cauldron-github-group-consumer.yml b/.github/workflows/build-push-cauldron-github-group-consumer.yml index 4fb4ff7..d82aca6 100644 --- a/.github/workflows/build-push-cauldron-github-group-consumer.yml +++ b/.github/workflows/build-push-cauldron-github-group-consumer.yml @@ -2,6 +2,11 @@ name: GitHub Group Consumer (build-push) on: workflow_dispatch: + inputs: + tag: + description: 'Git tag to build (e.g. v1.2.3)' + required: false + type: string jobs: build-image: @@ -28,6 +33,8 @@ jobs: platforms: linux/amd64 push: true provenance: false - tags: ghcr.io/${{ github.repository }}/cauldron-github-consumer-group:latest + tags: | + ghcr.io/${{ github.repository }}/cauldron-github-consumer-group:latest + ghcr.io/${{ github.repository }}/cauldron-github-consumer-group:${{ inputs.tag || github.sha }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/.github/workflows/build-push-cauldron-gitlab-consumer.yml b/.github/workflows/build-push-cauldron-gitlab-consumer.yml index bbc24d9..20dabf8 100644 --- a/.github/workflows/build-push-cauldron-gitlab-consumer.yml +++ b/.github/workflows/build-push-cauldron-gitlab-consumer.yml @@ -2,6 +2,11 @@ name: GitLab Consumer (build-push) on: workflow_dispatch: + inputs: + tag: + description: 'Git tag to build (e.g. v1.2.3)' + required: false + type: string jobs: build-image: @@ -28,6 +33,8 @@ jobs: platforms: linux/amd64 push: true provenance: false - tags: ghcr.io/${{ github.repository }}/cauldron-gitlab-consumer:latest + tags: | + ghcr.io/${{ github.repository }}/cauldron-gitlab-consumer:latest + ghcr.io/${{ github.repository }}/cauldron-gitlab-consumer:${{ inputs.tag || github.sha }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/.github/workflows/build-push-cauldron-gitlab-group-consumer.yml b/.github/workflows/build-push-cauldron-gitlab-group-consumer.yml index c26d17f..a4f9783 100644 --- a/.github/workflows/build-push-cauldron-gitlab-group-consumer.yml +++ b/.github/workflows/build-push-cauldron-gitlab-group-consumer.yml @@ -2,6 +2,11 @@ name: GitLab Group Consumer (build-push) on: workflow_dispatch: + inputs: + tag: + description: 'Git tag to build (e.g. v1.2.3)' + required: false + type: string jobs: build-image: @@ -28,6 +33,8 @@ jobs: platforms: linux/amd64 push: true provenance: false - tags: ghcr.io/${{ github.repository }}/cauldron-gitlab-consumer-group:latest + tags: | + ghcr.io/${{ github.repository }}/cauldron-gitlab-consumer-group:latest + ghcr.io/${{ github.repository }}/cauldron-gitlab-consumer-group:${{ inputs.tag || github.sha }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/.github/workflows/build-push-cauldron-migrator.yml b/.github/workflows/build-push-cauldron-migrator.yml index 946531f..1ba3978 100644 --- a/.github/workflows/build-push-cauldron-migrator.yml +++ b/.github/workflows/build-push-cauldron-migrator.yml @@ -2,6 +2,11 @@ name: Migrator (build-push) on: workflow_dispatch: + inputs: + tag: + description: 'Git tag to build (e.g. v1.2.3)' + required: false + type: string jobs: build-image: @@ -28,6 +33,8 @@ jobs: platforms: linux/amd64 push: true provenance: false - tags: ghcr.io/${{ github.repository }}/cauldron-migrator:latest + tags: | + ghcr.io/${{ github.repository }}/cauldron-migrator:latest + ghcr.io/${{ github.repository }}/cauldron-migrator:${{ inputs.tag || github.sha }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/.github/workflows/build-push-cauldron-webhookserver.yml b/.github/workflows/build-push-cauldron-webhookserver.yml index a66204f..d670291 100644 --- a/.github/workflows/build-push-cauldron-webhookserver.yml +++ b/.github/workflows/build-push-cauldron-webhookserver.yml @@ -2,6 +2,11 @@ name: Cauldron (build-push) on: workflow_dispatch: + inputs: + tag: + description: 'Git tag to build (e.g. v1.2.3)' + required: false + type: string jobs: build-image: @@ -28,6 +33,8 @@ jobs: platforms: linux/amd64 push: true provenance: false - tags: ghcr.io/${{ github.repository }}/cauldron-webhook-server:latest + tags: | + ghcr.io/${{ github.repository }}/cauldron-webhook-server:latest + ghcr.io/${{ github.repository }}/cauldron-webhook-server:${{ inputs.tag || github.sha }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/.github/workflows/stg-cauldron-github-consumer.yml b/.github/workflows/stg-cauldron-github-consumer.yml index e3eb4e7..36937ad 100644 --- a/.github/workflows/stg-cauldron-github-consumer.yml +++ b/.github/workflows/stg-cauldron-github-consumer.yml @@ -2,6 +2,11 @@ name: Staging - GitHub Consumer (build-push) on: workflow_dispatch: + inputs: + tag: + description: 'Git tag to build (e.g. v1.2.3)' + required: false + type: string jobs: build-image: @@ -28,6 +33,8 @@ jobs: platforms: linux/amd64 push: true provenance: false - tags: ghcr.io/${{ github.repository }}/cauldron-stg-github-consumer:latest + tags: | + ghcr.io/${{ github.repository }}/cauldron-stg-github-consumer:latest + ghcr.io/${{ github.repository }}/cauldron-stg-github-consumer:${{ inputs.tag || github.sha }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/.github/workflows/stg-cauldron-github-group-consumer.yml b/.github/workflows/stg-cauldron-github-group-consumer.yml index 0ef544c..6e40bb6 100644 --- a/.github/workflows/stg-cauldron-github-group-consumer.yml +++ b/.github/workflows/stg-cauldron-github-group-consumer.yml @@ -2,6 +2,11 @@ name: Staging - GitHub Group Consumer (build-push) on: workflow_dispatch: + inputs: + tag: + description: 'Git tag to build (e.g. v1.2.3)' + required: false + type: string jobs: build-image: @@ -28,6 +33,8 @@ jobs: platforms: linux/amd64 push: true provenance: false - tags: ghcr.io/${{ github.repository }}/cauldron-stg-github-consumer-group:latest + tags: | + ghcr.io/${{ github.repository }}/cauldron-stg-github-consumer-group:latest + ghcr.io/${{ github.repository }}/cauldron-stg-github-consumer-group:${{ inputs.tag || github.sha }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/.github/workflows/stg-cauldron-gitlab-consumer.yml b/.github/workflows/stg-cauldron-gitlab-consumer.yml index e162864..f75853c 100644 --- a/.github/workflows/stg-cauldron-gitlab-consumer.yml +++ b/.github/workflows/stg-cauldron-gitlab-consumer.yml @@ -2,6 +2,11 @@ name: Staging - GitLab Consumer (build-push) on: workflow_dispatch: + inputs: + tag: + description: 'Git tag to build (e.g. v1.2.3)' + required: false + type: string jobs: build-image: @@ -28,6 +33,8 @@ jobs: platforms: linux/amd64 push: true provenance: false - tags: ghcr.io/${{ github.repository }}/cauldron-stg-gitlab-consumer:latest + tags: | + ghcr.io/${{ github.repository }}/cauldron-stg-gitlab-consumer:latest + ghcr.io/${{ github.repository }}/cauldron-stg-gitlab-consumer:${{ inputs.tag || github.sha }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/.github/workflows/stg-cauldron-gitlab-group-consumer.yml b/.github/workflows/stg-cauldron-gitlab-group-consumer.yml index f04b43e..b9192f9 100644 --- a/.github/workflows/stg-cauldron-gitlab-group-consumer.yml +++ b/.github/workflows/stg-cauldron-gitlab-group-consumer.yml @@ -2,6 +2,11 @@ name: Staging - GitLab Group Consumer (build-push) on: workflow_dispatch: + inputs: + tag: + description: 'Git tag to build (e.g. v1.2.3)' + required: false + type: string jobs: build-image: @@ -28,6 +33,8 @@ jobs: platforms: linux/amd64 push: true provenance: false - tags: ghcr.io/${{ github.repository }}/cauldron-stg-gitlab-consumer-group:latest + tags: | + ghcr.io/${{ github.repository }}/cauldron-stg-gitlab-consumer-group:latest + ghcr.io/${{ github.repository }}/cauldron-stg-gitlab-consumer-group:${{ inputs.tag || github.sha }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/.github/workflows/stg-cauldron-migrator.yml b/.github/workflows/stg-cauldron-migrator.yml index 5fbbd29..00ba696 100644 --- a/.github/workflows/stg-cauldron-migrator.yml +++ b/.github/workflows/stg-cauldron-migrator.yml @@ -2,6 +2,11 @@ name: Staging - Migrator (build-push) on: workflow_dispatch: + inputs: + tag: + description: 'Git tag to build (e.g. v1.2.3)' + required: false + type: string jobs: build-image: @@ -28,6 +33,8 @@ jobs: platforms: linux/amd64 push: true provenance: false - tags: ghcr.io/${{ github.repository }}/cauldron-stg-migrator:latest + tags: | + ghcr.io/${{ github.repository }}/cauldron-stg-migrator:latest + ghcr.io/${{ github.repository }}/cauldron-stg-migrator:${{ inputs.tag || github.sha }} cache-from: type=gha cache-to: type=gha,mode=max diff --git a/.github/workflows/stg-cauldron-webhookserver.yml b/.github/workflows/stg-cauldron-webhookserver.yml index 4a90723..b605c81 100644 --- a/.github/workflows/stg-cauldron-webhookserver.yml +++ b/.github/workflows/stg-cauldron-webhookserver.yml @@ -2,6 +2,11 @@ name: Staging - Cauldron (build-push) on: workflow_dispatch: + inputs: + tag: + description: 'Git tag to build (e.g. v1.2.3)' + required: false + type: string jobs: build-image: @@ -28,6 +33,8 @@ jobs: platforms: linux/amd64 push: true provenance: false - tags: ghcr.io/${{ github.repository }}/cauldron-stg-webhook-server:latest + tags: | + ghcr.io/${{ github.repository }}/cauldron-stg-webhook-server:latest + ghcr.io/${{ github.repository }}/cauldron-stg-webhook-server:${{ inputs.tag || github.sha }} cache-from: type=gha cache-to: type=gha,mode=max