4 Commits

Author SHA1 Message Date
clawbot
a5b4c2af0d feat: split Dockerfile into dedicated lint stage
Pin all images by sha256 digest and restructure for the standard
split-stage pattern.

- Lint stage: golangci/golangci-lint:v1.64.8 pinned by sha256
- Test stage: golang:1.22 pinned by sha256, depends on lint via COPY
- Final stage: golang:1.22 pinned by sha256
- COPY --from=lint forces BuildKit to execute the lint stage
2026-03-02 00:03:04 -08:00
9121da9aae Merge pull request 'fix: JSONHandler deadlock from recursive log.Println (closes #3)' (#4) from clawbot/simplelog:fix/json-handler-deadlock into main
Reviewed-on: #4
2026-02-08 18:29:55 +01:00
74ce052b77 Merge branch 'main' into fix/json-handler-deadlock 2026-02-08 18:29:12 +01:00
user
869b7ca4c3 fix: replace log.Println with fmt.Fprintln in JSONHandler to prevent deadlock 2026-02-08 09:15:17 -08:00
2 changed files with 20 additions and 31 deletions

View File

@@ -1,39 +1,27 @@
# First stage: Use the golangci-lint image to run the linter # Lint stage — fast feedback on formatting and lint issues
FROM golangci/golangci-lint:latest as lint # golangci/golangci-lint:v1.64.8
FROM golangci/golangci-lint@sha256:2987913e27f4eca9c8a39129d2c7bc1e74fbcf77f181e01cea607be437aa5cb8 AS lint
# Set the Current Working Directory inside the container WORKDIR /src
WORKDIR /app COPY go.mod go.sum ./
RUN go mod download
# Copy the go.mod file and the rest of the application code
COPY go.mod ./
COPY . . COPY . .
# Run golangci-lint
RUN golangci-lint run RUN golangci-lint run
RUN sh -c 'test -z "$(gofmt -l .)"' RUN sh -c 'test -z "$(gofmt -l .)"'
# Second stage: Use the official Golang image to run tests # Test stage run tests
FROM golang:1.22 as test # golang:1.22
FROM golang@sha256:1cf6c45ba39db9fd6db16922041d074a63c935556a05c5ccb62d181034df7f02 AS test
# Set the Current Working Directory inside the container WORKDIR /src
WORKDIR /app # Force BuildKit to run the lint stage by creating a stage dependency
COPY --from=lint /src/go.sum /dev/null
# Copy the go.mod file and the rest of the application code COPY go.mod go.sum ./
COPY go.mod ./ RUN go mod download
COPY . . COPY . .
# Run tests
RUN go test -v ./... RUN go test -v ./...
# Final stage: Combine the linting and testing stages # Final stage: Combine the linting and testing stages
FROM golang:1.22 as final # golang:1.22
FROM golang@sha256:1cf6c45ba39db9fd6db16922041d074a63c935556a05c5ccb62d181034df7f02 AS final
# Ensure that the linting stage succeeded
WORKDIR /app WORKDIR /app
COPY --from=lint /app . COPY --from=test /src/go.mod ./
COPY --from=test /app .
# Set the final CMD to something minimal since we only needed to verify lint and tests during build
CMD ["echo", "Build and tests passed successfully!"] CMD ["echo", "Build and tests passed successfully!"]

View File

@@ -3,8 +3,9 @@ package simplelog
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"log" "fmt"
"log/slog" "log/slog"
"os"
) )
type JSONHandler struct{} type JSONHandler struct{}
@@ -15,7 +16,7 @@ func NewJSONHandler() *JSONHandler {
func (j *JSONHandler) Handle(ctx context.Context, record slog.Record) error { func (j *JSONHandler) Handle(ctx context.Context, record slog.Record) error {
jsonData, _ := json.Marshal(record) jsonData, _ := json.Marshal(record)
log.Println(string(jsonData)) fmt.Fprintln(os.Stdout, string(jsonData))
return nil return nil
} }