Contributing to Mermin
Thank you for your interest in contributing to Mermin! This guide will help you understand our contribution process and how to get your changes successfully merged.
Table of Contents
Getting Started
Before you start contributing:
Read the Development Workflow guide to set up your environment
Browse existing issues on GitHub Issues to find something to work on
Join the discussion on GitHub Discussions
Review our Code of Conduct to understand our community standards
Finding Something to Work On
Good First Issues: Look for issues labeled
good first issuefor beginner-friendly tasksHelp Wanted: Issues labeled
help wantedare actively seeking contributorsFeature Requests: Check the discussions board for feature ideas
Bug Reports: Any unassigned bug is fair game!
If you want to work on something not yet tracked, please open an issue first to discuss your idea with the maintainers.
Contribution Workflow
1. Fork and Clone
Fork the repository on GitHub, then clone your fork:
git clone https://github.com/YOUR_USERNAME/mermin.git
cd mermin
git remote add upstream https://github.com/elastiflow/mermin.git2. Create a Feature Branch
Always create a new branch for your work:
# Fetch latest changes from upstream
git fetch upstream
git checkout -b feature/my-new-feature upstream/beta
# Or for bug fixes
git checkout -b fix/issue-123 upstream/betaBranch naming conventions:
feature/- New features or enhancementsfix/- Bug fixesdocs/- Documentation updatesrefactor/- Code refactoringtest/- Adding or improving testschore/- Maintenance tasks
3. Make Your Changes
Follow the existing code style and conventions
Add tests for new functionality
Update documentation as needed
Keep commits focused and atomic
Write clear commit messages (see Commit Guidelines)
4. Test Your Changes
Before submitting, ensure all checks pass locally:
# Format your code
cargo fmt
# Run linting
cargo clippy -p mermin-ebpf -- -D warnings
cargo clippy --all-features -- -D warnings
# Run tests
cargo test
cargo test -p mermin-ebpf --features test
# Run integration tests
cd network-types/tests
make test-ciSee the Development Workflow guide for more testing details.
5. Push and Create Pull Request
git push origin feature/my-new-featureThen open a pull request on GitHub from your fork to the beta branch of the main repository.
Commit Message Guidelines
Mermin uses Conventional Commits for all commit messages. This enables automatic changelog generation and semantic versioning.
Commit Message Format
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]Types
feat: A new feature
fix: A bug fix
docs: Documentation changes only
style: Code style changes (formatting, missing semicolons, etc.)
refactor: Code changes that neither fix a bug nor add a feature
perf: Performance improvements
test: Adding or updating tests
build: Changes to build system or dependencies
ci: Changes to CI configuration files and scripts
chore: Other changes that don't modify src or test files
Examples
feat(ebpf): add support for GRE tunnel detection
Add GRE header parsing to the eBPF packet parser to enable
flow tracking through GRE tunnels.
Closes #123fix(k8s): resolve pod metadata race condition
Ensure pod informer cache is synced before processing flows
to prevent missing metadata enrichment.
Fixes #456docs: update quickstart guide with new configuration optionsBreaking Changes
If your change introduces a breaking change, add BREAKING CHANGE: in the footer:
feat(config)!: change default log level to warn
BREAKING CHANGE: The default log_level has changed from "info" to "warn".
Users who relied on the default info-level logging will need to explicitly
set log_level = "info" in their configuration.Important Notes
Use the imperative, present tense: "add" not "added" or "adds"
Description must be lowercase: Don't capitalize the first letter of the description
No period (.) at the end of the description
Reference issues and pull requests in the footer
PR titles must also follow this format: Your PR title must be a valid conventional commit (lowercase description)
Pull Request Process
Before Submitting
PR Description Template
When creating a PR, provide:
What: A clear description of what you changed
Why: The motivation for the change
How: Technical details of the implementation
Testing: How you tested the changes
Screenshots: If UI/output changes, include before/after
Related Issues: Link to any related issues
Review Process
Automated checks will run (see CI Checks)
Maintainer review: A maintainer will review your code
Feedback: Address any requested changes
Approval: Once approved, a maintainer will merge your PR
Response time: We aim to provide initial feedback within 3-5 business days.
After Your PR is Merged
Delete your feature branch
Update your local repository:
git checkout beta git pull upstream beta
CI Checks
All pull requests must pass these automated checks:
1. PR Title and Commit Checks
PR title must follow conventional commits format
All commits must follow conventional commits format
2. Formatting
cargo fmt -- --checkmust passCode must be formatted according to
rustfmt.toml
3. Linting
eBPF code:
cargo clippy -p mermin-ebpf -- -D warningsUserspace code:
cargo clippy -- -D warningsDockerfile:
hadolintchecks
4. Tests
Unit tests:
cargo nextest runfor all workspace packagesDoc tests:
cargo test --doceBPF tests:
cargo test -p mermin-ebpf --features testIntegration tests: Network types integration suite
E2E tests: CNI compatibility across Calico, Cilium, Flannel, kindnetd
5. Helm Checks
Chart linting with
ct lintTemplate validation
6. Docker Builds
Multi-architecture builds (amd64, arm64)
Both
runnerandrunner-debugtargets
7. Schema Version Check
If you modify FlowKey or FlowStats structs in mermin-common/src/lib.rs, you must increment EBPF_MAP_SCHEMA_VERSION in mermin/src/main.rs. The CI will fail if this is not done.
Why? Changing these structs breaks eBPF map compatibility. Incrementing the version ensures old pinned maps are not reused.
Running CI Checks Locally
You can run most CI checks locally before pushing:
# Format check
cargo fmt -- --check
# Linting
cargo clippy -p mermin-ebpf -- -D warnings
cargo clippy --all-features -- -D warnings
# Tests
cargo nextest run --workspace --exclude mermin-ebpf --exclude integration --exclude integration-common --exclude integration-ebpf
cargo test --doc
cargo test -p mermin-ebpf --features test
cd network-types/tests && make test-ci
# Dockerfile linting
docker run --rm -i hadolint/hadolint < DockerfileCommunity and Communication
Where to Get Help
Questions: Use GitHub Discussions for general questions
Bugs: Report bugs via GitHub Issues
Feature Requests: Discuss features in GitHub Discussions
Security Issues: See our security policy for reporting vulnerabilities
Communication Guidelines
Be respectful and inclusive
Search existing issues/discussions before creating new ones
Provide clear, detailed information when reporting bugs
Include steps to reproduce for bug reports
Be patient - maintainers are often volunteers
Code of Conduct
All contributors must adhere to our Code of Conduct. We are committed to providing a welcoming and inclusive environment for everyone.
License
By contributing to Mermin, you agree that your contributions will be licensed under the same licenses as the project:
GPL-2.0 for eBPF code (
mermin-ebpf/)Apache-2.0 for user space code
See LICENSE-GPL2 and LICENSE-APACHE for full license text.
Questions?
If you have questions about contributing, feel free to:
Open a discussion on GitHub Discussions
Comment on the issue you're interested in working on
Reach out to the maintainers
Thank you for contributing to Mermin! 🎉
Last updated