We welcome constructive contributions from everyone, regardless of skill level. This guide explains how to get involved in the Concourse community and contribute to the project.
- Getting Started
- Development Setup
- Issue Tracking
- Making Changes
- Testing Requirements
- Submitting Pull Requests
- Code Style Enforcement
- Getting Help
Before your contributions can be accepted, you must sign the Contributor License Agreement (CLA).
- Mailing List: Join concourse-devs for development discussions
- Users List: Join concourse-users for general questions
- Chat: Join us on Gitter
Before contributing, familiarize yourself with:
- Architecture Overview - System design and components
- Developer Guide - Building and development workflow
- Testing Guide - Test frameworks and conventions
- Java 8 or higher
- Git
- Gradle (wrapper included)
# Clone the repository
git clone https://github.com/cinchapi/concourse.git
cd concourse
# Install git hooks
./utils/install-git-hooks.sh
# Build the project
./gradlew build- Open IntelliJ and select "Import Project"
- Choose the
concoursedirectory - Select "Import project from external model" → "Gradle"
- Use default Gradle wrapper
- Run
./gradlew eclipseto generate Eclipse project files - In Eclipse, select "File" → "Import" → "Existing Projects into Workspace"
- Choose the
concoursedirectory
# Run tests to verify everything works
./gradlew test
# Build the installer
./gradlew installer- Browse open issues on GitHub
- Look for issues labeled
good first issuefor beginner-friendly tasks - Check the JIRA project for tracked work
When creating a new issue:
- Search first: Check if a similar issue already exists
- Be specific: Provide clear steps to reproduce bugs
- Include context: Version, OS, Java version, relevant configuration
**Description**
A clear description of the bug.
**Steps to Reproduce**
1. Step one
2. Step two
3. ...
**Expected Behavior**
What should happen.
**Actual Behavior**
What actually happens.
**Environment**
- Concourse Version:
- Java Version:
- OS:
**Additional Context**
Any other relevant information.**Description**
A clear description of the feature.
**Use Case**
Why this feature would be useful.
**Proposed Solution**
How you think it should work.
**Alternatives Considered**
Other approaches you've thought about.Use descriptive branch names:
feature/add-bulk-insert-api
bugfix/fix-transaction-timeout
docs/update-architecture-guide
refactor/simplify-lock-broker
Write clear, descriptive commit messages:
Add bulk insert API for improved batch performance
- Implement bulkInsert() method in ConcourseServer
- Add corresponding driver method in Concourse.java
- Include unit and integration tests
- Update documentation
Fixes #123
Guidelines:
- Use present tense ("Add feature" not "Added feature")
- First line is a summary (50 chars or less)
- Include details in the body if needed
- Reference issues when applicable
- Self-review: Review your own changes before submitting
- CI checks: Ensure all automated checks pass
- Reviewer feedback: Address all reviewer comments
- Approval: Wait for maintainer approval before merging
All changes should include appropriate tests:
| Change Type | Required Tests |
|---|---|
| New API method | Unit test + Integration test |
| Bug fix | Regression test in bugrepro/ |
| Storage engine change | Unit test + Integration test |
| Plugin framework change | Unit test + Plugin test |
# All tests
./gradlew test
# Specific module
./gradlew :concourse-server:test
# Specific test class
./gradlew :concourse-integration-tests:test --tests "*.AddTest"
# With detailed output
./gradlew test --info- Test method names should be descriptive:
testAddReturnsFalseWhenValueAlreadyExists - Use
Variables.register()for debugging failed tests - Place bug reproductions in the
bugrepro/package
See Testing Guide for more details.
-
Update your branch: Rebase on latest
developgit fetch origin git rebase origin/develop
-
Run tests: Ensure all tests pass
./gradlew test -
Check formatting: Apply code style
./gradlew spotlessApply
-
Build successfully: Verify full build works
./gradlew build
## Description
A clear description of what this PR does.
## Type of Change
- [ ] Bug fix
- [ ] New feature
- [ ] Breaking change
- [ ] Documentation update
## Related Issues
Fixes #(issue number)
## Testing
Describe the tests you added or modified.
## Checklist
- [ ] My code follows the project's coding standards
- [ ] I have added tests for my changes
- [ ] All new and existing tests pass
- [ ] I have updated documentation as needed
- [ ] I have signed the CLA- Monitor CI: Watch for build failures
- Respond to feedback: Address reviewer comments promptly
- Keep updated: Rebase if the target branch moves ahead
Concourse uses Spotless for code formatting:
# Check formatting
./gradlew spotlessCheck
# Apply formatting
./gradlew spotlessApplyThe git hooks installed by ./utils/install-git-hooks.sh automatically check formatting before push.
Formatting rules are defined in:
spotless.java.license- License headerspotless.java.importerorder- Import orderingspotless.java.eclipseformat.xml- Code formatting
- License Header: All Java files must have the Apache 2.0 license header
- Import Order: Organized by package (java, javax, third-party, project)
- Line Length: Reasonable line lengths (not strictly enforced)
- Braces: Opening brace on same line
- Indentation: 4 spaces (no tabs)
- Development questions: Post to concourse-devs
- Usage questions: Post to concourse-users
- Quick questions: Ask on Gitter
- Check existing documentation and code comments
- Search closed issues and PRs for similar problems
- Ask on the mailing list with:
- What you're trying to do
- What you've tried
- Any error messages
Shoot us an email if you want to become a regular contributor and help with strategic planning!
# Build everything
./gradlew build
# Build without tests
./gradlew build -x test
# Run specific tests
./gradlew :module:test --tests "*.ClassName"
# Apply formatting
./gradlew spotlessApply
# Build installer
./gradlew installer
# Generate documentation
./gradlew javadoc| File | Purpose |
|---|---|
build.gradle |
Root build configuration |
settings.gradle |
Module definitions |
CHANGELOG.md |
Release notes |
interface/*.thrift |
API definitions |