Thank you for your interest in CloudDM! We welcome all forms of contribution, including but not limited to bug reports, feature suggestions, code contributions, and documentation improvements.
- Code of Conduct
- How to Contribute
- Development Environment Setup
- Coding Standards
- PR Submission Process
- Commit Conventions
- Branch Management
- FAQ
All contributors to this project should uphold the spirit of open-source collaboration — be respectful, constructive, and courteous in all communication. See Code of Conduct (if available) for details.
If you find a bug, please submit it via GitHub/Gitee Issues with as much of the following as possible:
- Clear title and description
- Reproduction steps (code snippets welcome)
- Expected vs. actual behavior
- Environment details (OS, JDK version, database type, etc.)
- Relevant logs or screenshots
Feature suggestions are welcome. Please submit an Issue prefixed with [Feature] and describe:
- The problem the feature would solve
- Desired behavior or outcome
- Any similar implementations to reference
- Fork the repository to your GitHub/Gitee account
- Create a feature branch (see Branch Management)
- Write code and ensure existing tests pass
- Submit a Pull Request
- JDK 17+
- Gradle 9.5.0+
- Node.js 22.22.1
- IntelliJ IDEA or Eclipse (IntelliJ IDEA recommended)
- Git
- Linux / macOS or Windows with Bash
- MySQL 8.0+ (runtime database)
# Full build (including frontend assets)
cd package && ./all_build.sh
# Frontend assets only
cd package && ./all_build.sh web
# Compile and generate tgz install packages
cd package && ./package.sh --build
# Compile, generate tgz install packages, and build Docker images plus deployment manifests for all platforms
cd package && ./package.sh --build --docker
# Compile, generate tgz install packages, and build only one target architecture
cd package && ./package.sh --build --docker arm64
cd package && ./package.sh --build --docker x86_64
# If tgz packages already exist under package/build, build only Docker images and deployment manifests
cd package && ./package.sh --docker
cd package && ./package.sh --docker arm64
cd package && ./package.sh --docker x86_64Version: Defined in
backend/gradle.propertiesundercg.clouddm.main.version.Build output directory:
package/build, which containscgdm-*.tar.gz,docker-*.tar,docker-*.yml, andk8s-*.yml.
| Module | Description |
|---|---|
backend/ |
Gradle root with backend, plugins, launchers, utilities, and test modules |
frontend/ |
Web frontend project |
package/ |
Repository build entry, tgz packaging, Docker images, compose templates, and delivery artifacts |
docs/ |
Documentation and image assets |
- Clone the project and open the
backend/directory with IntelliJ IDEA. - IDEA will automatically detect the Gradle project and begin importing.
- Wait for dependencies to download, then you're ready to develop.
- Run
cd package && ./all_build.shin the project root directory. - Go to
backend/clouddm-boot/boot-aloneand runcom.clougence.clouddm.boot.DmAloneLauncherto start the application, and visithttp://localhost:8222. - [First Run] Open the web page for initial setup and fill in the database and other required information. When you see the message "Waiting for application restart", repeat Step 2.
- The project uses Eclipse code formatting configuration (
codeformat.xml) - IntelliJ IDEA users should install the Eclipse Code Formatter plugin and import
codeformat.xml - Indentation: 4 spaces
- Encoding: UTF-8
- Maintain consistent file headers with copyright notice
- Database entities use the
DOsuffix, form objects useFO, and request/response types useVO - Follow existing naming conventions; avoid introducing new naming systems
- Organize packages by responsibility; prefer
controller,service,dal,model,config,util,global, etc. - Use project infrastructure (
com.clougence.utils) and existing SDK / platform utilities; avoid reinventing the same functionality - Always use Lombok's
@Slf4j; log errors with context and stack traces; avoid meaningless exceptions - Minimize visibility — expose APIs deliberately; default to
private; usepublicsparingly - Strict single responsibility; enforce stable unidirectional dependencies; avoid circular dependencies
- Avoid giant classes and methods unless exceptional; keep classes around 500 formatted lines
- Do not over-split into tiny methods or fragmented classes
- New features should include appropriate unit or integration tests
- Ensure
cd package && ./all_build.shpasses before submitting
- Ensure your fork is in sync with upstream
- Create a new branch (see branch management below)
- Write and commit your code
- Run tests and make sure they all pass
- Submit a Pull Request to the target branch
- PR title should clearly describe the change
- Link related Issues in the PR description (if any)
- Specify the change type (bugfix / feature / refactor / docs, etc.)
- Wait for review and address feedback
- Branches will be deleted after merge
We recommend the Conventional Commits format:
<type>(<scope>): <subject>
<body>
Common types:
| Type | Description |
|---|---|
feat |
New feature |
fix |
Bug fix |
docs |
Documentation changes |
refactor |
Code refactoring |
test |
Test-related changes |
chore |
Build / tooling changes |
style |
Code formatting (no functional impact) |
Examples:
feat(mysql): support prepared statement for MySQL driver
fix(oracle): resolve NPE when connection is null
docs: update README with quick start guide
main/master: stable release branchdev: main development branchfeat/<feature-name>: feature development branchfix/<bug-name>: bug fix branch
Refer to existing data source implementations under backend/clouddm-plugins/clouddm-ds/ (e.g., ds-mysql), create a new data source plugin module, and register it in backend/settings.gradle.
The project supports custom rule scripting for extension. See the official documentation for details.
Thank you again for contributing! If you have any questions, feel free to reach out via Issues.