Building
Prerequisites
Section titled “Prerequisites”- Go 1.26.3 or later
- Docker (for Docker image builds)
- golangci-lint (for linting)
Building
Section titled “Building”# Clone the repositorygit clone https://github.com/jmrplens/cs-routeros-bouncer.gitcd cs-routeros-bouncer
# BuildCGO_ENABLED=0 go build -o cs-routeros-bouncer ./cmd/cs-routeros-bouncerWith version information:
CGO_ENABLED=0 go build -ldflags "-X github.com/jmrplens/cs-routeros-bouncer/internal/config.Version=1.4.4 -X github.com/jmrplens/cs-routeros-bouncer/internal/config.Commit=$(git rev-parse --short HEAD) -X github.com/jmrplens/cs-routeros-bouncer/internal/config.BuildDate=$(date -u +%Y-%m-%dT%H:%M:%SZ) -X github.com/crowdsecurity/go-cs-lib/version.Version=1.4.4" \ -o cs-routeros-bouncer ./cmd/cs-routeros-bouncerdocker build -t cs-routeros-bouncer:local .Build for different architectures:
# ARM64 (e.g., Raspberry Pi 4, Apple Silicon)CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -o cs-routeros-bouncer-arm64 ./cmd/cs-routeros-bouncer
# ARMv7 (e.g., Raspberry Pi 3)CGO_ENABLED=0 GOOS=linux GOARCH=arm GOARM=7 go build -o cs-routeros-bouncer-armv7 ./cmd/cs-routeros-bouncer
# AMD64CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o cs-routeros-bouncer-amd64 ./cmd/cs-routeros-bouncerTesting
Section titled “Testing”# Run all testsgo test ./...
# With verbose outputgo test -v ./...
# With coveragego test -coverprofile=coverage.out ./...go tool cover -html=coverage.outRun a specific package:
go test -v ./internal/config/...go test -v ./internal/routeros/...go test -v ./internal/metrics/...# Generate coverage reportgo test -coverprofile=coverage.out -covermode=atomic ./...
# View coverage in browsergo tool cover -html=coverage.out -o coverage.html
# Check coverage percentagego tool cover -func=coverage.out | tail -1Integration tests are guarded by the integration build tag. The Bash functional suite runs black-box checks against a real installed bouncer.
# Go integration testsgo test -v -tags integration -count=1 -timeout 300s ./tests/integration/...
# Black-box functional suitecp tests/functional/.env.example tests/functional/.envtests/functional/run_tests.shLinting
Section titled “Linting”# Install golangci-lintgo install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
# Run lintergolangci-lint run
# Run with auto-fixgolangci-lint run --fix
# Go vetgo vet ./...The project uses .golangci.yml for linter configuration.
| Workflow | Trigger | Purpose |
| ------------- | ------------------------ | ---------------------------------------------------- |
| ci.yml | Push, PR | Run linting, tests, docs analysis, and build checks |
| docs.yml | Docs changes, manual run | Build and deploy the Astro documentation site |
| release.yml | Tag push | Build binaries, Docker images, create GitHub release |
Release process
Section titled “Release process”-
Update version in code
-
Create and push a git tag
Terminal window git tag v1.4.4git push origin v1.4.4 -
GitHub Actions automatically:
- Builds binaries for linux/amd64, linux/arm64, linux/arm/v7
- Builds and pushes Docker images (multi-arch)
- Creates a GitHub release with binaries attached
Development workflow
Section titled “Development workflow”-
Create a feature branch
Terminal window git checkout -b feat/my-feature -
Make changes and test
Terminal window go test ./...golangci-lint run -
Commit with a conventional message
Terminal window git commit -m "feat: add new feature" -
Push and create PR