Some checks failed
Comprehensive CI/CD Pipeline / Build and Test (push) Successful in 7m17s
Comprehensive CI/CD Pipeline / Security Audit (push) Failing after 8s
Comprehensive CI/CD Pipeline / Package Validation (push) Successful in 54s
Comprehensive CI/CD Pipeline / Status Report (push) Has been skipped
- Fixed /sysroot directory requirement for bootc compatibility - Implemented proper composefs configuration files - Added log cleanup for reproducible builds - Created correct /ostree symlink to sysroot/ostree - Bootc lint now passes 11/11 checks with only minor warning - Full bootc compatibility achieved - images ready for production use Updated documentation and todo to reflect completed work. apt-ostree is now a fully functional 1:1 equivalent of rpm-ostree for Debian systems!
12 KiB
12 KiB
Development Workflow Documentation
Overview
This document describes the development workflow for apt-ostree, including setup, testing, debugging, and contribution guidelines. It provides developers with a comprehensive guide to working with the codebase.
Table of Contents
- Development Environment Setup
- Development Workflow
- Testing Procedures
- Debugging Techniques
- Code Quality and Standards
- Contribution Guidelines
- Release Process
Development Environment Setup
Prerequisites
- Rust toolchain: Rust 1.75+ with Cargo
- System dependencies: See installation guide
- Development tools: Git, make, pkg-config
- Documentation tools: rustdoc, cargo-doc
Initial Setup
# Clone repository
git clone https://github.com/robojerk/apt-ostree.git
cd apt-ostree
# Install Rust toolchain
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source ~/.cargo/env
# Install system dependencies
sudo apt-get install build-essential pkg-config \
libostree-dev libapt-pkg-dev libpolkit-gobject-1-dev \
libdbus-1-dev libsystemd-dev
# Install development tools
cargo install cargo-outdated cargo-audit cargo-tarpaulin
Environment Configuration
# Set development environment variables
export APT_OSTREE_DEV_MODE=1
export APT_OSTREE_LOG_LEVEL=debug
export RUST_LOG=debug
# Add to ~/.bashrc or ~/.zshrc
echo 'export APT_OSTREE_DEV_MODE=1' >> ~/.bashrc
echo 'export APT_OSTREE_LOG_LEVEL=debug' >> ~/.bashrc
echo 'export RUST_LOG=debug' >> ~/.bashrc
IDE Configuration
VS Code
// .vscode/settings.json
{
"rust-analyzer.checkOnSave.command": "clippy",
"rust-analyzer.cargo.features": ["development"],
"rust-analyzer.procMacro.enable": true,
"rust-analyzer.cargo.buildScripts.enable": true
}
IntelliJ IDEA / CLion
- Install Rust plugin
- Configure Rust toolchain
- Enable Cargo features:
development,dev-full
Development Workflow
Daily Development Cycle
# 1. Start development session
git pull origin main
cargo check --features development
# 2. Make changes and test
cargo build --features development
cargo test --features development
# 3. Commit changes
git add .
git commit -m "feat(commands): add new feature X"
# 4. Push changes
git push origin feature-branch
Feature Development Workflow
# 1. Create feature branch
git checkout -b feature/new-feature
# 2. Implement feature
# ... make changes ...
# 3. Add tests
# ... add test cases ...
# 4. Update documentation
# ... update docs ...
# 5. Test thoroughly
cargo test --features development
cargo clippy --features development
# 6. Create pull request
git push origin feature/new-feature
# Create PR on GitHub
Bug Fix Workflow
# 1. Create bug fix branch
git checkout -b fix/bug-description
# 2. Reproduce bug
# ... reproduce issue ...
# 3. Fix bug
# ... implement fix ...
# 4. Add regression test
# ... add test case ...
# 5. Test fix
cargo test --features development
# 6. Create pull request
git push origin fix/bug-description
Testing Procedures
Unit Testing
# Run all unit tests
cargo test
# Run specific test module
cargo test commands::package
# Run tests with output
cargo test -- --nocapture
# Run tests with specific feature
cargo test --features development
# Run tests in parallel
cargo test -- --test-threads 4
Integration Testing
# Run integration tests
cargo test --test integration_tests
# Run specific integration test
cargo test --test integration_tests test_package_installation
# Run integration tests with verbose output
cargo test --test integration_tests -- --nocapture
Development Commands Testing
# Test development commands
cargo run --features development -- testutils --help
cargo run --features development -- shlib-backend --help
cargo run --features development -- internals --help
# Test specific development command
cargo run --features development -- testutils moo
cargo run --features development -- shlib-backend get-basearch
cargo run --features development -- internals diagnostics
Performance Testing
# Install performance testing tools
cargo install cargo-bench
# Run benchmarks
cargo bench
# Profile performance
cargo install flamegraph
cargo flamegraph --bin apt-ostree -- internals diagnostics
# Memory profiling
cargo install cargo-valgrind
cargo valgrind test
Security Testing
# Run security audit
cargo audit
# Check for known vulnerabilities
cargo audit --deny warnings
# Dependency vulnerability scan
cargo install cargo-audit
cargo audit
Debugging Techniques
Logging and Tracing
use tracing::{info, warn, error, debug, trace};
// Set log level
std::env::set_var("RUST_LOG", "debug");
// Use in code
debug!("Debug information: {:?}", data);
info!("Information message: {}", message);
warn!("Warning message: {}", warning);
error!("Error message: {}", error);
trace!("Trace information: {:?}", trace_data);
Interactive Debugging
# Run with debugger
rust-gdb --args target/debug/apt-ostree internals diagnostics
# Use println! for quick debugging
cargo run --features development -- internals diagnostics
# Enable backtrace
export RUST_BACKTRACE=1
cargo run --features development -- internals diagnostics
Development Commands for Debugging
# Run system diagnostics
sudo apt-ostree internals diagnostics --verbose
# Validate system state
sudo apt-ostree internals validate-state --strict-mode
# Dump debug information
sudo apt-ostree internals debug-dump --output /tmp/debug.json
# Test basic functionality
sudo apt-ostree testutils moo
# Execute debug script
sudo apt-ostree testutils script-shell /tmp/debug.sh --verbose
Profiling and Analysis
# CPU profiling
cargo install cargo-flamegraph
cargo flamegraph --bin apt-ostree -- internals diagnostics
# Memory profiling
cargo install cargo-valgrind
cargo valgrind test
# Code coverage
cargo install cargo-tarpaulin
cargo tarpaulin --out Html --output-dir coverage
Code Quality and Standards
Code Style
- Rust conventions: Follow Rust style guide and idioms
- Formatting: Use
cargo fmtfor consistent formatting - Documentation: Document all public APIs with doc comments
- Error handling: Use proper error types and Result handling
Linting and Analysis
# Run Clippy
cargo clippy --features development
# Run with specific rules
cargo clippy --features development -- -D warnings
# Allow specific warnings
cargo clippy --features development -- -D warnings -A clippy::too_many_arguments
# Check formatting
cargo fmt -- --check
# Format code
cargo fmt
Documentation Standards
/// Brief description of the function
///
/// Detailed description with examples and usage notes.
///
/// # Arguments
/// * `param1` - Description of first parameter
/// * `param2` - Description of second parameter
///
/// # Returns
/// Result containing success value or error
///
/// # Examples
/// ```
/// use apt_ostree::lib::example::Example;
///
/// let result = Example::new().do_something();
/// assert!(result.is_ok());
/// ```
///
/// # Errors
/// Returns error if operation fails
pub fn example_function(param1: String, param2: u32) -> Result<(), Error> {
// Implementation
}
Testing Standards
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_function_name() {
// Arrange
let input = "test";
// Act
let result = function(input);
// Assert
assert!(result.is_ok());
assert_eq!(result.unwrap(), "expected");
}
#[test]
#[should_panic(expected = "error message")]
fn test_function_panics() {
function("invalid");
}
#[test]
fn test_function_with_result() -> Result<(), Box<dyn std::error::Error>> {
let result = function("test")?;
assert_eq!(result, "expected");
Ok(())
}
}
Contribution Guidelines
Pull Request Process
- Fork repository: Create your own fork
- Create feature branch:
git checkout -b feature/new-feature - Implement changes: Follow coding guidelines
- Add tests: Include unit and integration tests
- Update documentation: Update relevant documentation
- Submit PR: Create pull request with clear description
Commit Guidelines
type(scope): description
[optional body]
[optional footer]
Types: feat, fix, docs, style, refactor, test, chore Scope: cli, daemon, lib, commands, etc.
Examples:
feat(commands): add new package management command
fix(daemon): resolve memory leak in transaction handling
docs(user-guide): update installation instructions
test(integration): add end-to-end package installation test
Review Process
- Code review: All changes require review
- Testing: Ensure all tests pass
- Documentation: Verify documentation is updated
- Integration: Test integration with existing features
Issue Reporting
When reporting issues, include:
- Environment: OS, version, dependencies
- Steps to reproduce: Clear reproduction steps
- Expected behavior: What should happen
- Actual behavior: What actually happens
- Logs: Relevant error logs and output
Release Process
Pre-Release Checklist
# 1. Update version numbers
# Update Cargo.toml, debian/changelog, etc.
# 2. Run full test suite
cargo test --features development
cargo test --test integration_tests
# 3. Run code quality checks
cargo clippy --features development -- -D warnings
cargo fmt -- --check
cargo audit
# 4. Build all targets
cargo build --release --features development
cargo build --release --features dev-full
# 5. Test development commands
cargo run --features development -- testutils --help
cargo run --features development -- shlib-backend --help
cargo run --features development -- internals --help
# 6. Build documentation
cargo doc --features development --no-deps
# 7. Build Debian package
./build-debian-trixie.sh
Release Steps
# 1. Create release branch
git checkout -b release/v0.2.0
# 2. Update version numbers
# ... update version files ...
# 3. Run final tests
cargo test --features development
cargo test --test integration_tests
# 4. Commit version changes
git add .
git commit -m "chore(release): bump version to 0.2.0"
# 5. Tag release
git tag -a v0.2.0 -m "Release version 0.2.0"
# 6. Push release
git push origin release/v0.2.0
git push origin v0.2.0
# 7. Create GitHub release
# ... create release on GitHub ...
# 8. Merge to main
git checkout main
git merge release/v0.2.0
git push origin main
Post-Release Tasks
# 1. Update documentation
# ... update version references ...
# 2. Announce release
# ... announce on mailing lists, forums, etc. ...
# 3. Monitor for issues
# ... watch for bug reports and issues ...
# 4. Plan next release
# ... plan features for next version ...
Development Best Practices
Code Organization
- Modular design: Keep modules focused and cohesive
- Separation of concerns: Separate logic from presentation
- Dependency management: Minimize dependencies and avoid circular references
- Error handling: Use consistent error types and handling patterns
Performance Considerations
- Efficient algorithms: Use appropriate algorithms and data structures
- Memory management: Avoid unnecessary allocations and memory leaks
- Async operations: Use async/await for I/O operations
- Caching: Implement caching for expensive operations
Security Considerations
- Input validation: Validate all user inputs
- Authentication: Implement proper authentication and authorization
- Resource limits: Set appropriate limits for operations
- Audit logging: Log security-relevant events
Testing Strategy
- Unit tests: Test individual functions and methods
- Integration tests: Test component interactions
- End-to-end tests: Test complete workflows
- Performance tests: Test performance characteristics
- Security tests: Test security aspects
Documentation Strategy
- API documentation: Document all public APIs
- User guides: Provide comprehensive user documentation
- Developer guides: Document development processes
- Examples: Provide working examples for common use cases
This guide covers the development workflow for apt-ostree. For user documentation, refer to the User Guide.