Files
f2b/Makefile
Ismo Vuorinen 649727b91f chore(deps): update workflows, pre-commit repos (#46)
* chore(deps): update pre-commit and gh workflows

* chore(lint): pre-commit editorconfig-checker repo

* fix(deps): use correct checkmake repo
2025-08-14 15:05:50 +03:00

216 lines
7.4 KiB
Makefile

# f2b Makefile
.PHONY: help all build test lint fmt clean install dev-deps ci \
check-deps test-verbose test-coverage \
lint-go lint-md lint-yaml lint-actions lint-make \
ci ci-coverage security dev-setup pre-commit-setup \
release-dry-run release release-snapshot release-check _check-tag
# Default target
help: ## Show this help message
@echo 'Usage: make [target]'
@echo ''
@echo 'Targets:'
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " %-15s %s\n", $$1, $$2}' $(MAKEFILE_LIST)
all: ci ## Run all CI checks (same as ci target)
@echo "All checks completed ✓"
# Build targets
build: ## Build the f2b binary
go build -ldflags "-X github.com/ivuorinen/f2b/cmd.version=dev" -o f2b .
install: ## Install f2b globally
go install github.com/ivuorinen/f2b@latest
# Development dependencies
dev-deps: ## Install development dependencies
@echo "Installing development dependencies..."
@command -v goreleaser >/dev/null 2>&1 || { \
echo "Installing goreleaser..."; \
go install github.com/goreleaser/goreleaser/v2@latest; \
}
@command -v golangci-lint >/dev/null 2>&1 || { \
echo "Installing golangci-lint..."; \
go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.2.2; \
}
@command -v markdownlint-cli2 >/dev/null 2>&1 || { \
echo "Installing markdownlint-cli2..."; \
npm install -g markdownlint-cli2; \
}
@command -v markdown-link-check >/dev/null 2>&1 || { \
echo "Installing markdown-link-check..."; \
npm install -g markdown-link-check; \
}
@command -v yamlfmt >/dev/null 2>&1 || { \
echo "Installing yamlfmt..."; \
go install github.com/google/yamlfmt/cmd/yamlfmt@latest; \
}
@command -v actionlint >/dev/null 2>&1 || { \
echo "Installing actionlint..."; \
go install github.com/rhysd/actionlint/cmd/actionlint@latest; \
}
@command -v goimports >/dev/null 2>&1 || { \
echo "Installing goimports..."; \
go install golang.org/x/tools/cmd/goimports@latest; \
}
@command -v editorconfig-checker >/dev/null 2>&1 || { \
echo "Installing editorconfig-checker..."; \
go install github.com/editorconfig-checker/editorconfig-checker/cmd/editorconfig-checker@latest; \
}
@command -v gosec >/dev/null 2>&1 || { \
echo "Installing gosec..."; \
go install github.com/securego/gosec/v2/cmd/gosec@latest; \
}
@command -v staticcheck >/dev/null 2>&1 || { \
echo "Installing staticcheck..."; \
go install honnef.co/go/tools/cmd/staticcheck@latest; \
}
@command -v revive >/dev/null 2>&1 || { \
echo "Installing revive..."; \
go install github.com/mgechev/revive@latest; \
}
@command -v checkmake >/dev/null 2>&1 || { \
echo "Installing checkmake..."; \
go install github.com/checkmake/checkmake/cmd/checkmake@latest; \
}
@command -v golines >/dev/null 2>&1 || { \
echo "Installing golines..."; \
go install github.com/segmentio/golines@latest; \
}
check-deps: ## Check if all development dependencies are installed
@echo "Checking development dependencies..."
@command -v go >/dev/null 2>&1 || { \
echo "go is not installed"; exit 1; }
@command -v goreleaser >/dev/null 2>&1 || {
echo "goreleaser is not installed (run: make dev-deps)"; exit 1; }
@command -v golangci-lint >/dev/null 2>&1 || {
echo "golangci-lint is not installed (run: make dev-deps)"; exit 1; }
@command -v markdownlint-cli2 >/dev/null 2>&1 || {
echo "markdownlint-cli2 is not installed (run: make dev-deps)"; exit 1; }
@command -v markdown-link-check >/dev/null 2>&1 || {
echo "markdown-link-check is not installed (run: make dev-deps)"; exit 1; }
@command -v goimports >/dev/null 2>&1 || {
echo "goimports is not installed (run: make dev-deps)"; exit 1; }
@command -v editorconfig-checker >/dev/null 2>&1 || {
echo "editorconfig-checker is not installed (run: make dev-deps)"; exit 1; }
@command -v gosec >/dev/null 2>&1 || {
echo "gosec is not installed (run: make dev-deps)"; exit 1; }
@command -v staticcheck >/dev/null 2>&1 || {
echo "staticcheck is not installed (run: make dev-deps)"; exit 1; }
@command -v revive >/dev/null 2>&1 || {
echo "revive is not installed (run: make dev-deps)"; exit 1; }
@command -v checkmake >/dev/null 2>&1 || {
echo "checkmake is not installed (run: make dev-deps)"; exit 1; }
@command -v yamlfmt >/dev/null 2>&1 || {
echo "yamlfmt is not installed (run: make dev-deps)"; exit 1; }
@command -v actionlint >/dev/null 2>&1 || {
echo "actionlint is not installed (run: make dev-deps)"; exit 1; }
@command -v golines >/dev/null 2>&1 || {
echo "golines is not installed (run: make dev-deps)"; exit 1; }
@echo "All dependencies are installed ✓"
# Testing targets
test: ## Run all tests
go test ./...
test-verbose: ## Run tests with verbose output
go test -v ./...
test-coverage: ## Run tests with coverage report
go test -coverprofile=coverage.out ./...
go tool cover -html=coverage.out -o coverage.html
@echo "Coverage report saved to coverage.html"
# Code quality targets
fmt: ## Format Go code
gofmt -w .
@echo "Go code formatted ✓"
lint: ## Run all linters using pre-commit (preferred method)
@echo "Running pre-commit linters..."
@pre-commit run --all-files
@echo "All linting completed ✓"
lint-go: ## Run only Go linters
go vet ./...
golangci-lint run --timeout=5m
lint-md: ## Run only Markdown linter
markdownlint-cli2 *.md **/*.md
lint-yaml: ## Run only YAML linter
yamlfmt -lint .
lint-actions: ## Run only GitHub Actions linter
actionlint .github/workflows/*.yml
lint-make: ## Run only Makefile linter
checkmake Makefile
# CI targets
ci: fmt lint test ## Run all CI checks (format, lint, test)
ci-coverage: fmt lint test-coverage ## Run CI checks with coverage
# Security targets
security: ## Run security checks
gosec ./...
# Cleanup targets
clean: ## Clean build artifacts
rm -f f2b
rm -f coverage.out
rm -f coverage.html
go clean
# Development targets
dev-setup: dev-deps ## Set up development environment
@echo "Setting up development environment..."
@echo "Installing pre-commit hooks..."
@command -v pre-commit >/dev/null 2>&1 || { \
echo "Installing pre-commit..."; \
pip install pre-commit; \
}
@pre-commit install
@echo "Development environment setup complete ✓"
pre-commit-setup: ## Install and configure pre-commit hooks
@echo "Installing pre-commit..."
@command -v pre-commit >/dev/null 2>&1 || { \
echo "Installing pre-commit..."; \
pip install pre-commit; \
}
@pre-commit install
@echo "Pre-commit hooks installed ✓"
# Release targets
release-dry-run: ## Test release process without creating artifacts
@echo "Testing release process..."
@VERSION=$$(git describe --tags --exact-match 2>/dev/null || echo "v0.0.0-dev"); \
echo "Building version: $$VERSION"; \
go build -ldflags "-X github.com/ivuorinen/f2b/cmd.version=$$VERSION" -o f2b-test .
@rm -f f2b-test
@echo "Release dry-run complete ✓"
release: ## Create a new release using GoReleaser
@echo "Creating release with GoReleaser..."
@$(MAKE) _check-tag
@goreleaser release --clean
_check-tag: ## Internal: Check if a git tag exists
@if [ -z "$$(git describe --exact-match 2>/dev/null)" ]; then \
echo "Error: No tag found. Please create a tag first (e.g., git tag v1.0.0)"; \
exit 1; \
fi
release-snapshot: ## Create a snapshot release (no tag required)
@echo "Creating snapshot release with GoReleaser..."
goreleaser release --snapshot --clean
release-check: ## Check if GoReleaser configuration is valid
@echo "Checking GoReleaser configuration..."
goreleaser check
@echo "GoReleaser configuration is valid ✓"