smtp2shoutrrr/Makefile
butterrobot c4090c7ada
All checks were successful
CI / goreleaser-lint (push) Successful in 3s
CI / format (push) Successful in 4m17s
CI / lint (push) Successful in 6m52s
CI / build (push) Successful in 3m51s
CI / test (push) Successful in 6m46s
deps: upgrade Go to 1.27.1, refresh dependencies and drop gotoolkit (#8) (FMG-2)
Closes FMG-2

Upgrades Go and every dependency to their latest revisions, and removes the `gotoolkit` dependency in favour of the standard library and the libraries it was wrapping.

Supersedes #7 — identical tree, recreated under the `butterrobot` account.

## gotoolkit removal

- **`encoding.NewTOMLEncoding()`** — a thin wrapper over `pelletier/go-toml/v2`. Now used directly, behind a new `smtp2shoutrrr.LoadConfig(path)` shared by both commands. Previously both `cmd/smtp2shoutrrr` and `cmd/sendmail` duplicated the open/decode/`SetDefaults` sequence, and neither closed the config file.
- **`model.Server`** — a three-method interface with a single implementation. `NewSMTPServer` now returns a concrete `*Server`, and the unused `IsEnabled()` is gone.
- **`service.NewService(...).Start()/WaitStop()`** — replaced by `signal.NotifyContext` in `main`. `Server.Start(ctx)` now owns its own lifecycle: it serves until the context is cancelled, then calls `Shutdown` with a 10s deadline. Behaviour matches the old service, without the indirection.

## Version bumps

| | from | to |
|---|---|---|
| Go | 1.25.6 | 1.27.1 |
| `emersion/go-smtp` | 0.24.0 | 0.25.0 |
| `stretchr/testify` | 1.9.0 | 1.12.1 |
| `pelletier/go-toml/v2` | 2.2.3 (indirect) | 2.4.3 (direct) |
| `x/crypto/x509roots/fallback` | 2025-02-14 | 2026-09-02 |
| alpine (Containerfile) | 3.20 | 3.24 |
| golangci-lint | v2.8.0 | v2.13.2 |
| `actions/checkout`, `actions/setup-go` | v6 | v7 |

Indirects also refreshed (`x/net` 0.25.0 → 0.58.0, `x/sys`, `x/tools`, `fatih/color`, `go-cmp`, `logr`). `containrrr/shoutrrr` and `emersion/go-sasl` were already at their latest published revisions.

## Dropping `goreleaser-action`

Bumping `actions/goreleaser-action` v6.4.0 → v7.2.3 broke the `goreleaser-lint` job: v7.1.0 made cosign signature verification of the action's own goreleaser download mandatory, and `ci-base` ships no cosign.

Rather than pin the action back, this drops it. `ci-base` already installs goreleaser from the upstream apt repo — that is what `make build` has always used — so the action was downloading a second copy of a tool the image already had. Both workflows now invoke it directly, and `goreleaser check` moves behind a `make check` target, so every CI job runs a make target like the rest of the pipeline.

## Tests

Coverage 63.1% → 75.9%. New tests cover `LoadConfig` (parsing, defaults, missing file, invalid TOML) and the replacement lifecycle — that a cancelled context shuts the server down and releases the listener, and that a bind failure propagates out of `Start`.

On this exact tree (as PR #7) CI passed `format`, `lint`, `test` and `goreleaser-lint`. Locally, against Go 1.27.1: `make format` (clean diff), `make check`, `make ci-lint` (0 issues), `make test`, `make build` (6 targets). The release binary was also smoke-tested end to end: mail accepted, forwarded to a shoutrrr generic target, and `SIGTERM` shut it down cleanly with exit 0.

Note: `release.yml` only runs on tags, so its goreleaser step is not exercised by this PR. The env vars it depends on (`GITEA_TOKEN`, `GORELEASER_FORCE_TOKEN`) are read by goreleaser itself rather than by the action, so invoking the binary directly is equivalent.

## Also

Removed the unused `ANONYMOUS` SASL client from `cmd/sendmail` — its only caller was a commented-out line, and it was the last thing pulling `go-sasl` into that command.

Reviewed-on: #8
Reviewed-by: Felipe M <me@fmartingr.com>
2026-09-07 21:27:03 +02:00

67 lines
1.6 KiB
Makefile

PROJECT_NAME := smtp2shoutrrr
CGO_ENABLED := 0
DIST_PATH := ./dist
TEST_OPTIONS := -v -failfast -race -bench=. -benchtime=100000x -cover -coverprofile=coverage.out
GOLANGCI_LINT_VERSION := v2.13.2
GORELEASER_VERSION := v2.18.1
.DEFAULT_GOAL := help
## help: Display this help message
.PHONY: help
help:
@echo "Available targets:"
@grep -E '^## ' $(MAKEFILE_LIST) | sed 's/## / /' | sort
.PHONY: ensure-goreleaser
ensure-goreleaser:
@which goreleaser > /dev/null 2>&1 || go install github.com/goreleaser/goreleaser/v2@$(GORELEASER_VERSION)
## build: Build project using goreleaser (snapshot)
.PHONY: build
build: ensure-goreleaser
goreleaser build --snapshot --clean
## quick-run: Execute project directly using go run
.PHONY: quick-run
quick-run:
CGO_ENABLED=$(CGO_ENABLED) go run ./cmd/$(PROJECT_NAME)
## run: Build and execute the local binary
.PHONY: run
run: build
$(DIST_PATH)/$(PROJECT_NAME)
## format: Format code and tidy modules
.PHONY: format
format:
go fmt ./...
go mod tidy
## check: Validate the goreleaser configuration
.PHONY: check
check: ensure-goreleaser
goreleaser check
## ci-lint: Run golangci-lint (installs if missing)
.PHONY: ci-lint
ci-lint:
@which golangci-lint > /dev/null 2>&1 || go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@$(GOLANGCI_LINT_VERSION)
golangci-lint run ./...
## lint: Run linters
.PHONY: lint
lint: ci-lint
## test: Run tests with coverage
.PHONY: test
test:
CGO_ENABLED=1 go test $(TEST_OPTIONS) -timeout 1m ./...
## clean: Remove build artifacts
.PHONY: clean
clean:
rm -rf $(DIST_PATH)
go clean -cache -testcache