| name | commit-changes |
| description | Guide for committing changes in the torrust-tracker-deployer project. Covers conventional commit format, pre-commit verification checks, issue number conventions, and commit quality guidelines. Use when committing code, running pre-commit checks, or following project commit standards. Triggers on "commit", "commit changes", "how to commit", "pre-commit", "commit message", "commit format", or "conventional commits". |
| metadata | {"author":"torrust","version":"1.0"} |
Committing Changes
This skill guides you through the complete commit process for the Torrust Tracker Deployer project, including conventional commit format, pre-commit checks, and quality standards.
Quick Reference
./scripts/pre-commit.sh
git add <files>
git commit -S -m "{type}: [#{issue}] {description}"
Conventional Commit Format
We follow Conventional Commits specification.
Commit Message Structure
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
Issue Number Convention
When working on a branch with an issue number, include it in your commit messages:
- With issue branch:
{type}: [#{issue}] {description}
- Example:
feat: [#42] add MySQL database support
- Without issue branch:
{type}: {description}
- Example:
docs: update deployment guide
Commit Types
| Type | Description | Example |
|---|
feat | New feature or enhancement | feat: [#42] add LXD container provisioning |
fix | Bug fix | fix: [#15] resolve ansible inventory parsing error |
docs | Documentation changes | docs: [#8] update installation guide |
style | Code style changes (formatting, etc.) | style: [#31] apply rustfmt to all source files |
refactor | Code refactoring | refactor: [#45] simplify linting script structure |
test | Adding or updating tests | test: [#67] add e2e tests for provisioning |
chore | Maintenance tasks | chore: [#89] update dependencies |
ci | CI/CD related changes | ci: [#23] add workflow for testing provisioning |
perf | Performance improvements | perf: [#52] optimize container startup time |
GPG Commit Signing (MANDATORY)
All commits must be GPG signed. Use the -S flag:
git commit -S -m "your commit message"
Ensure GPG is configured (see Troubleshooting section if signing fails).
Pre-commit Verification (MANDATORY)
Before committing any changes, you MUST run:
./scripts/pre-commit.sh
This script runs all mandatory checks:
- Unused dependencies:
cargo machete
- All linters:
cargo run --bin linter all (stable & nightly)
- Tests:
cargo test
- Documentation builds:
cargo doc --no-deps --bins --examples --workspace --all-features
- E2E infrastructure tests:
cargo run --bin e2e-infrastructure-lifecycle-tests
- E2E deployment tests:
cargo run --bin e2e-deployment-workflow-tests
All checks must pass before committing. Fix any reported issues.
Running Individual Linters (for debugging)
cargo run --bin linter markdown
cargo run --bin linter yaml
cargo run --bin linter toml
cargo run --bin linter clippy
cargo run --bin linter rustfmt
cargo run --bin linter shellcheck
cargo run --bin linter cspell
Commit Examples
Feature with Issue Number
git commit -m "feat: [#42] add support for Ubuntu 22.04 in cloud-init"
Bug Fix with Issue Number
git commit -m "fix: [#15] resolve ansible inventory parsing error"
Documentation Update
git commit -m "docs: [#8] add troubleshooting section to README"
With Scope (optional)
git commit -m "fix(ansible): [#15] correct inventory file path resolution"
Breaking Change (note the !)
git commit -m "feat!: [#42] change default container provider from multipass to lxd"
Multi-line with Body and Footer
git commit -m "feat: [#23] add automated testing workflow
Add GitHub Actions workflow that tests:
- LXD container provisioning
- Multipass VM provisioning
- Ansible playbook execution
Closes #23"
Hashtag Usage Warning
Only use # when intentionally referencing a GitHub issue.
GitHub automatically links #NUMBER patterns to issues, so avoid accidental references:
- ✅ Correct:
feat: [#42] add new feature (intentional reference)
- ✅ Correct:
Closes #23 in footer (intentional)
- ❌ Incorrect:
fix: update config #1 priority (accidentally links to issue #1)
- ❌ Incorrect:
docs: add section #3 to guide (accidentally links to issue #3)
Common Mistakes to Avoid
git commit -m "fix: make feature #1 priority"
git commit -m "fix: make feature top priority"
git commit -m "fix: make feature number one priority"
git commit -m "docs: add section #3 about deployment"
git commit -m "docs: add section 3 about deployment"
git commit -m "docs: add third section about deployment"
Commit Quality Guidelines
Good Commits (✅)
- Atomic: Each commit represents one logical change
- Descriptive: Clear, concise description of what changed
- Tested: All tests pass
- Linted: All linters pass
- Conventional: Follows conventional commit format
Example of Good Commit History:
feat: [#42] add LXD container provisioning support
fix: [#15] resolve ansible inventory template rendering
docs: [#8] update contributing guidelines
test: [#67] add unit tests for configuration parsing
refactor: [#45] extract common logging utilities
Commits to Avoid (❌)
- Too large: Multiple unrelated changes in one commit
- Vague: Messages like "fix stuff" or "updates"
- Broken: Commits that don't build or pass tests
- Non-conventional: Not following the conventional commit format
Complete Workflow Example
vim src/main.rs
./scripts/pre-commit.sh
git add src/main.rs
git commit -S -m "feat: [#42] add new CLI command"
git push origin 42-add-new-cli-command
Troubleshooting
GPG Signing Fails
Problem: git commit -S fails with "gpg failed to sign the data"
Solution:
- Verify GPG is installed:
gpg --version
- List your GPG keys:
gpg --list-keys
- If no keys exist, create one:
gpg --gen-key
- Configure Git to use your GPG key:
git config --global user.signingkey <YOUR_KEY_ID>
- Test signing:
echo "test" | gpg --clearsign
- Retry commit:
git commit -S -m "your message"
If still failing, check that your GPG agent is running and has proper pinentry configured.
Pre-commit Script Fails
Problem: One or more checks fail in ./scripts/pre-commit.sh
Solution:
- Read the error output carefully
- Fix the specific issue (e.g., run
cargo fmt for formatting)
- Re-run
./scripts/pre-commit.sh
- Repeat until all checks pass
E2E Tests Take Too Long
Problem: E2E tests add significant time to the commit process
Context: This is intentional to ensure quality. The split test approach (e2e-infrastructure-lifecycle-tests + e2e-deployment-workflow-tests) is optimized for GitHub Actions compatibility while maintaining comprehensive coverage.
Alternative for Local Development: You can run the full E2E suite manually:
cargo run --bin e2e-complete-workflow-tests
Note: This is only supported in local environments with proper LXD networking and cannot run on GitHub Actions.
Linter Fails on Nightly Toolchain
Problem: cargo run --bin linter all fails on nightly Rust
Solution:
- Ensure you have the nightly toolchain:
rustup toolchain install nightly
- Update toolchains:
rustup update
- Re-run the linter
Related Documentation
- Full Commit Process Guide:
docs/contributing/commit-process.md
- Contributing Guide:
docs/contributing/README.md
- Branching Conventions:
docs/contributing/branching.md
- Pre-commit Script:
scripts/pre-commit.sh
- Linting Guide:
docs/contributing/linting.md
Key Reminders
- Always sign commits with
-S - GPG signing is mandatory for audit trail
- Always run
./scripts/pre-commit.sh before committing - This is non-negotiable
- Use issue numbers consistently - Follow the
[#{issue}] format
- Be careful with hashtags - Only use
#NUMBER when referencing issues
- Keep commits atomic - One logical change per commit
- Write descriptive messages - Future you will thank present you