diff --git a/.forgejo/workflows/deploy.yml b/.forgejo/workflows/deploy.yml index ef3efd8..8ab8da1 100644 --- a/.forgejo/workflows/deploy.yml +++ b/.forgejo/workflows/deploy.yml @@ -16,7 +16,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.25.7" + go-version: "1.26.1" - run: go mod download - run: go test -v -race -coverprofile=coverage.out ./... - run: go tool cover -func=coverage.out @@ -28,7 +28,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.25.7" + go-version: "1.26.1" - run: go vet ./... - name: Check formatting run: | @@ -66,7 +66,7 @@ jobs: - name: Install Go uses: actions/setup-go@v5 with: - go-version: "1.25.7" + go-version: "1.26.1" - name: Compute next version run: | diff --git a/.forgejo/workflows/test.yml b/.forgejo/workflows/test.yml index fbf6aa3..e45ea99 100644 --- a/.forgejo/workflows/test.yml +++ b/.forgejo/workflows/test.yml @@ -14,7 +14,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.25.7" + go-version: "1.26.1" - run: go mod download - run: go test -v -race -coverprofile=coverage.out ./... - run: go tool cover -func=coverage.out @@ -26,7 +26,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.25.7" + go-version: "1.26.1" - run: go vet ./... - name: Check formatting run: | @@ -59,7 +59,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "1.25.7" + go-version: "1.26.1" - name: Build Go binaries run: | CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o ./bin/cairn-server ./cmd/cairn-server diff --git a/Dockerfile b/Dockerfile index e55fdf4..70fdd47 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.25-alpine AS builder +FROM golang:1.26-alpine AS builder WORKDIR /src COPY go.mod go.sum ./ diff --git a/cmd/cairn-server/main.go b/cmd/cairn-server/main.go index 92d31fa..9cbc71c 100644 --- a/cmd/cairn-server/main.go +++ b/cmd/cairn-server/main.go @@ -58,6 +58,7 @@ func main() { Store: store, ForgejoClient: forgejoClient, ForgejoURL: cfg.ForgejoURL, + CairnURL: cfg.ExternalURL, WebhookSecret: cfg.ForgejoWebhookSecret, }) if err != nil { diff --git a/go.mod b/go.mod index c772483..2580865 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/mattnite/cairn -go 1.25.7 +go 1.26.1 require ( github.com/gin-gonic/gin v1.12.0 diff --git a/internal/config/config.go b/internal/config/config.go index 743c130..a00ae19 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -17,6 +17,7 @@ type Config struct { S3SecretKey string `envconfig:"CAIRN_S3_SECRET_KEY" default:"minioadmin"` S3UseSSL bool `envconfig:"CAIRN_S3_USE_SSL" default:"false"` + ExternalURL string `envconfig:"CAIRN_EXTERNAL_URL"` ForgejoURL string `envconfig:"CAIRN_FORGEJO_URL"` ForgejoToken string `envconfig:"CAIRN_FORGEJO_TOKEN"` ForgejoWebhookSecret string `envconfig:"CAIRN_FORGEJO_WEBHOOK_SECRET"` diff --git a/internal/forgejo/sync.go b/internal/forgejo/sync.go index 892ebff..4986de1 100644 --- a/internal/forgejo/sync.go +++ b/internal/forgejo/sync.go @@ -14,8 +14,9 @@ import ( // Sync handles bidirectional state synchronization between Cairn and Forgejo. type Sync struct { - Client *Client - DB *gorm.DB + Client *Client + DB *gorm.DB + CairnURL string } // CreateIssueForCrashGroup creates a Forgejo issue for a new crash group. @@ -29,8 +30,14 @@ func (s *Sync) CreateIssueForCrashGroup(ctx context.Context, group *cairnapi.Cra return fmt.Errorf("getting repository: %w", err) } + crashGroupLink := fmt.Sprintf("%d", group.ID) + if s.CairnURL != "" { + crashGroupLink = fmt.Sprintf("[%d](%s/crashgroups/%d)", group.ID, strings.TrimRight(s.CairnURL, "/"), group.ID) + } + body := fmt.Sprintf(`## Crash Group +**Crash Group:** %s **Fingerprint:** `+"`%s`"+` **First seen:** %s **Type:** %s @@ -43,7 +50,7 @@ func (s *Sync) CreateIssueForCrashGroup(ctx context.Context, group *cairnapi.Cra --- *Auto-created by [Cairn](/) — crash artifact aggregator* -`, group.Fingerprint, group.FirstSeenAt.Format("2006-01-02 15:04:05"), group.Title, sampleTrace) +`, crashGroupLink, group.Fingerprint, group.FirstSeenAt.Format("2006-01-02 15:04:05"), group.Title, sampleTrace) issue, err := s.Client.CreateIssue(ctx, repo.Owner, repo.Name, CreateIssueRequest{ Title: "[Cairn] " + group.Title, diff --git a/internal/web/routes.go b/internal/web/routes.go index c76a0c4..9f1a57a 100644 --- a/internal/web/routes.go +++ b/internal/web/routes.go @@ -17,6 +17,7 @@ type RouterConfig struct { Store blob.Store ForgejoClient *forgejo.Client ForgejoURL string + CairnURL string WebhookSecret string } @@ -26,7 +27,7 @@ func NewRouter(cfg RouterConfig) (*gin.Engine, error) { return nil, err } - forgejoSync := &forgejo.Sync{Client: cfg.ForgejoClient, DB: cfg.DB} + forgejoSync := &forgejo.Sync{Client: cfg.ForgejoClient, DB: cfg.DB, CairnURL: cfg.CairnURL} pages := &PageHandler{DB: cfg.DB, Templates: templates, ForgejoURL: cfg.ForgejoURL} ingest := &handler.IngestHandler{DB: cfg.DB, Store: cfg.Store, ForgejoSync: forgejoSync}