First off, thank you for considering contributing to Firebase DevOps Toolkit! It's people like you that make this tool better for everyone.
- Code of Conduct
- Getting Started
- How Can I Contribute?
- Development Setup
- Pull Request Process
- Style Guidelines
- Community
This project and everyone participating in it is governed by our commitment to providing a welcoming and inclusive environment. Please be respectful and constructive in all interactions.
- Node.js 18+
- Firebase CLI (
npm install -g firebase-tools) - Git
- Bash shell (macOS, Linux, or WSL on Windows)
# Clone the repository
git clone https://github.com/SolidKeyAB/firebase-devops-toolkit.git
cd firebase-devops-toolkit
# Install dependencies
npm install
# Run setup
./setup.shBefore creating bug reports, please check existing issues to avoid duplicates.
Great Bug Reports include:
- A clear, descriptive title
- Steps to reproduce the issue
- Expected vs actual behavior
- Your environment (OS, Node version, Firebase CLI version)
- Relevant logs or error messages
We love feature suggestions! Please:
- Check if the feature already exists or is planned
- Describe the use case and why it would be valuable
- Explain how it should work
Look for issues labeled:
good first issue- Great for newcomershelp wanted- We'd love your help on thesedocumentation- Help improve our docs
- Fork the repo and create your branch from
main - Make your changes
- Test your changes thoroughly
- Update documentation if needed
- Submit a pull request
firebase-devops-toolkit/
├── manage.sh # Main CLI entry point
├── local/ # Local development scripts
│ ├── deploy-services.sh
│ ├── setup-pubsub-topics.sh
│ └── ...
├── remote/ # Production/remote scripts
│ ├── deploy-complete.sh
│ ├── test-functions-consolidated.sh
│ └── ...
├── templates/ # Project templates
│ └── orchestrate.sh # Project wrapper template
├── docs/ # Documentation
├── examples/ # Example configurations
└── lib/ # Shared utilities
# Test locally with a Firebase project
export FIREBASE_PROJECT_ID=your-test-project
./manage.sh start-local
# Run the emulator and verify your changes
./manage.sh status-local
# Clean up
./manage.sh stop-localWhen adding new scripts:
- Add to appropriate directory:
local/for development,remote/for production - Follow naming conventions:
verb-noun.sh(e.g.,deploy-services.sh) - Include header comments: Purpose, usage, examples
- Use shared utilities: Source
lib/common.shfor logging functions - Handle errors gracefully: Use
set -eand proper error messages - Make it executable:
chmod +x your-script.sh
-
Branch naming:
feature/description,fix/description,docs/description -
Commit messages: Use clear, descriptive messages
feat: Add support for Cloud Run deployment fix: Handle spaces in project paths docs: Update installation guide -
PR description: Include:
- What changes were made
- Why the changes were needed
- How to test the changes
- Screenshots (if UI-related)
-
Review process:
- At least one maintainer review required
- All CI checks must pass
- Documentation must be updated
-
After merge: Delete your feature branch
#!/bin/bash
# Script description
# Usage: ./script.sh [options]
set -e # Exit on error
# Source common utilities
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
source "$SCRIPT_DIR/../lib/common.sh" 2>/dev/null || true
# Use meaningful variable names
PROJECT_ROOT="${PROJECT_ROOT:-$(pwd)}"
# Functions should be documented
# @param $1 - Description of first parameter
# @returns 0 on success, 1 on failure
my_function() {
local param1="$1"
# Implementation
}
# Always quote variables that might contain spaces
echo "Processing: $file_path"
# Use log functions for output
log_info "Starting process..."
log_success "Process completed!"
log_error "Something went wrong"// Use ES6+ features
const { readFile } = require('fs').promises;
// Document public functions
/**
* Description of function
* @param {string} path - Path to file
* @returns {Promise<object>} Parsed content
*/
async function loadConfig(path) {
// Implementation
}
// Handle errors appropriately
try {
await riskyOperation();
} catch (error) {
console.error('Operation failed:', error.message);
process.exit(1);
}- Use Markdown for all documentation
- Include code examples
- Keep language clear and concise
- Update the README if adding new features
- GitHub Issues: Bug reports and feature requests
- GitHub Discussions: Questions and community chat
- Pull Requests: Code contributions
If you need help:
- Check the documentation
- Search existing issues
- Ask in GitHub Discussions
Contributors are recognized in:
- The README.md contributors section
- Release notes when their contribution is included
Thank you for contributing!
Maintained by SolidKey AB