fix: split Dockerfile with pinned images and add CI workflow

- Pin golangci-lint to v1.64.8 by sha256 digest
- Pin golang to 1.22.12 by sha256 digest
- Lint stage runs make fmt-check + make lint
- Test stage runs make test with dependency on lint stage
- Remove redundant final stage (library has no binary)
- Add fmt-check, check, hooks targets to Makefile
- Add .gitea/workflows/check.yml for CI

closes #9
This commit is contained in:
clawbot
2026-03-02 02:13:08 -08:00
parent 9121da9aae
commit e76b1cbcb5
3 changed files with 44 additions and 39 deletions

View File

@@ -0,0 +1,13 @@
name: check
on:
push:
branches: [main]
pull_request:
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- run: docker build .

View File

@@ -1,39 +1,20 @@
# First stage: Use the golangci-lint image to run the linter # Lint stage: format check + golangci-lint
FROM golangci/golangci-lint:latest as lint # golangci-lint v1.64.8 (2025-02-18)
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 make fmt-check
RUN make lint
# Run golangci-lint # Test stage: run full test suite
RUN golangci-lint run # golang 1.22.12 (2025-02-04)
FROM golang@sha256:1cf6c45ba39db9fd6db16922041d074a63c935556a05c5ccb62d181034df7f02 AS test
RUN sh -c 'test -z "$(gofmt -l .)"' # Depend on lint stage so both stages always run
COPY --from=lint /src/go.sum /dev/null
# Second stage: Use the official Golang image to run tests WORKDIR /src
FROM golang:1.22 as test COPY go.mod go.sum ./
RUN go mod download
# Set the Current Working Directory inside the container
WORKDIR /app
# Copy the go.mod file and the rest of the application code
COPY go.mod ./
COPY . . COPY . .
RUN make test
# Run tests
RUN go test -v ./...
# Final stage: Combine the linting and testing stages
FROM golang:1.22 as final
# Ensure that the linting stage succeeded
WORKDIR /app
COPY --from=lint /app .
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!"]

View File

@@ -1,6 +1,6 @@
.PHONY: test .PHONY: test fmt fmt-check lint check docker hooks
default: test default: check
test: test:
@go test -v ./... @go test -v ./...
@@ -9,9 +9,20 @@ fmt:
goimports -l -w . goimports -l -w .
golangci-lint run --fix golangci-lint run --fix
fmt-check:
@test -z "$$(gofmt -l .)" || { echo "gofmt would reformat:"; gofmt -l .; exit 1; }
lint: lint:
golangci-lint run golangci-lint run
sh -c 'test -z "$$(gofmt -l .)"'
check: fmt-check lint test
docker: docker:
docker build --progress plain . docker build --progress plain .
hooks:
@echo "Installing git hooks..."
@mkdir -p .git/hooks
@printf '#!/bin/sh\nmake check\n' > .git/hooks/pre-commit
@chmod +x .git/hooks/pre-commit
@echo "Pre-commit hook installed."