
Some checks failed
Test and Publish Templates / test-and-publish (push) Failing after 14s
309 lines
7.7 KiB
Markdown
309 lines
7.7 KiB
Markdown
# Development Guide
|
|
|
|
This guide covers the development workflow for dropshell templates, including testing, versioning, and publishing.
|
|
|
|
## Repository Structure
|
|
|
|
```
|
|
dropshell-templates/
|
|
├── .gitea/workflows/ # CI/CD workflows
|
|
├── caddy/ # Web server template
|
|
├── gitea-runner-docker/ # CI runner template
|
|
├── simple-object-server/ # Object storage template
|
|
├── squashkiwi/ # Squashkiwi service template
|
|
├── static-website/ # Static site hosting template
|
|
├── watchtower/ # Container auto-updater template
|
|
├── versions.json # Template version tracking
|
|
├── test.sh # Template validation script
|
|
├── publish.sh # Template publishing script
|
|
├── bump-version.sh # Version management script
|
|
├── detect-changes.sh # Change detection script
|
|
└── test_template.sh # Integration test script
|
|
```
|
|
|
|
## Template Structure
|
|
|
|
Each template must have:
|
|
- `install.sh` - Installation script
|
|
- `uninstall.sh` - Uninstallation script
|
|
- `start.sh` - Service start script
|
|
- `stop.sh` - Service stop script
|
|
- `status.sh` - Service status script
|
|
- `config/service.env` - Service configuration
|
|
|
|
Optional scripts:
|
|
- `logs.sh` - View service logs
|
|
- `backup.sh` - Backup service data
|
|
- `restore.sh` - Restore service data
|
|
- `ports.sh` - Display service ports
|
|
- `ssh.sh` - SSH into service container
|
|
- `destroy.sh` - Completely remove service
|
|
|
|
## Testing
|
|
|
|
### Local Testing
|
|
|
|
Run validation tests for all templates:
|
|
```bash
|
|
./test.sh
|
|
```
|
|
|
|
This checks:
|
|
- Required scripts exist
|
|
- Scripts are executable
|
|
- Config directory exists
|
|
- service.env file exists
|
|
- Shell script syntax is valid
|
|
|
|
### Integration Testing
|
|
|
|
If you have `ds` (dropshell) installed locally:
|
|
```bash
|
|
./test_template.sh caddy
|
|
```
|
|
|
|
This performs a full integration test:
|
|
- Creates a test service
|
|
- Installs the template
|
|
- Starts/stops the service
|
|
- Backs up and restores
|
|
- Destroys the service
|
|
|
|
## Version Management
|
|
|
|
Each template has independent semantic versioning tracked in `versions.json`.
|
|
|
|
### Version Format
|
|
|
|
Versions follow semantic versioning: `MAJOR.MINOR.PATCH`
|
|
- **MAJOR**: Breaking changes
|
|
- **MINOR**: New features, backwards compatible
|
|
- **PATCH**: Bug fixes, backwards compatible
|
|
|
|
### Bumping Versions
|
|
|
|
#### Single Template
|
|
|
|
```bash
|
|
# Bump patch version (1.0.0 -> 1.0.1)
|
|
./bump-version.sh caddy patch
|
|
|
|
# Bump minor version (1.0.0 -> 1.1.0)
|
|
./bump-version.sh caddy minor
|
|
|
|
# Bump major version (1.0.0 -> 2.0.0)
|
|
./bump-version.sh caddy major
|
|
|
|
# Set specific version
|
|
./bump-version.sh caddy 2.5.3
|
|
```
|
|
|
|
#### All Templates
|
|
|
|
```bash
|
|
# Bump patch for all templates
|
|
./bump-version.sh --all patch
|
|
|
|
# Set all templates to specific version
|
|
./bump-version.sh --all 2.0.0
|
|
```
|
|
|
|
### Version Workflow
|
|
|
|
1. **Make changes** to template(s)
|
|
2. **Test changes** locally:
|
|
```bash
|
|
./test.sh
|
|
# Optional: ./test_template.sh <template-name>
|
|
```
|
|
3. **Bump version** for changed templates:
|
|
```bash
|
|
# For bug fixes
|
|
./bump-version.sh caddy patch
|
|
|
|
# For new features
|
|
./bump-version.sh caddy minor
|
|
|
|
# For breaking changes
|
|
./bump-version.sh caddy major
|
|
```
|
|
4. **Commit changes** including `versions.json`:
|
|
```bash
|
|
git add .
|
|
git commit -m "feat(caddy): add custom domain support"
|
|
```
|
|
5. **Push to main** - CI automatically publishes changed templates
|
|
|
|
## Publishing
|
|
|
|
### Automatic Publishing (CI/CD)
|
|
|
|
When you push to the main branch:
|
|
1. CI runs tests on all templates
|
|
2. Detects which templates changed since last version update
|
|
3. Publishes only changed templates to templates.dropshell.app
|
|
4. Each template is tagged with:
|
|
- `:latest` - Always points to newest version
|
|
- `:1.0.0` - Specific version
|
|
- `:v1` - Major version only
|
|
|
|
### Manual Publishing
|
|
|
|
```bash
|
|
# Set environment variable
|
|
export SOS_WRITE_TOKEN=your-token-here
|
|
|
|
# Publish only changed templates (default)
|
|
./publish.sh
|
|
|
|
# Publish all templates
|
|
./publish.sh --all
|
|
|
|
# Publish specific templates
|
|
./publish.sh caddy watchtower
|
|
|
|
# Explicitly publish only changed
|
|
./publish.sh --changed-only
|
|
```
|
|
|
|
## Change Detection
|
|
|
|
The system automatically detects which templates have changed:
|
|
|
|
```bash
|
|
# List changed templates since last version update
|
|
./detect-changes.sh
|
|
|
|
# Output as JSON
|
|
./detect-changes.sh --json
|
|
```
|
|
|
|
Changes are detected by comparing against the last git tag that modified `versions.json`.
|
|
|
|
## CI/CD Configuration
|
|
|
|
The GitHub Actions workflow (`.gitea/workflows/test-and-publish.yaml`):
|
|
- Triggers on pushes to main and pull requests
|
|
- Runs tests for all templates
|
|
- Publishes only changed templates (main branch only)
|
|
- Requires `SOS_WRITE_TOKEN` secret in repository settings
|
|
|
|
### Setting up CI/CD
|
|
|
|
1. Go to your Gitea repository settings
|
|
2. Add a new secret named `SOS_WRITE_TOKEN`
|
|
3. Set the value to your Simple Object Server write token
|
|
4. Push to main branch to trigger the workflow
|
|
|
|
## Development Workflow Example
|
|
|
|
Here's a complete example of updating the caddy template:
|
|
|
|
```bash
|
|
# 1. Make changes to caddy template
|
|
vim caddy/config/Caddyfile
|
|
|
|
# 2. Test your changes
|
|
./test.sh
|
|
|
|
# 3. Run integration test (if ds is installed)
|
|
./test_template.sh caddy
|
|
|
|
# 4. Bump version (patch for bug fix)
|
|
./bump-version.sh caddy patch
|
|
|
|
# 5. Review version change
|
|
cat versions.json
|
|
|
|
# 6. Commit your changes
|
|
git add .
|
|
git commit -m "fix(caddy): correct reverse proxy configuration"
|
|
|
|
# 7. Push to trigger automatic publishing
|
|
git push origin main
|
|
```
|
|
|
|
The CI will:
|
|
- Run tests
|
|
- Detect that only caddy changed
|
|
- Publish caddy with new version (e.g., caddy:1.0.1, caddy:latest, caddy:v1)
|
|
|
|
## Best Practices
|
|
|
|
1. **Always test locally** before pushing
|
|
2. **Use semantic versioning** appropriately:
|
|
- Breaking changes = major bump
|
|
- New features = minor bump
|
|
- Bug fixes = patch bump
|
|
3. **Write clear commit messages** that explain the changes
|
|
4. **Update version before pushing** to main
|
|
5. **Document breaking changes** in commit messages
|
|
6. **Keep templates simple** and focused on single services
|
|
7. **Use environment variables** in service.env for configuration
|
|
8. **Test both install and uninstall** procedures
|
|
|
|
## Troubleshooting
|
|
|
|
### Tests failing locally
|
|
- Ensure all scripts are executable: `chmod +x template-name/*.sh`
|
|
- Check script syntax: `bash -n template-name/script.sh`
|
|
- Verify config directory exists
|
|
- Ensure service.env is present
|
|
|
|
### Publishing fails
|
|
- Verify `SOS_WRITE_TOKEN` is set
|
|
- Check that `sos` tool is installed
|
|
- Ensure versions.json is valid JSON
|
|
- Verify network connectivity to templates.dropshell.app
|
|
|
|
### Change detection not working
|
|
- Ensure git history is available: `git fetch --all`
|
|
- Check that versions.json was committed
|
|
- Verify detect-changes.sh is executable
|
|
|
|
## Template Guidelines
|
|
|
|
### Required Files
|
|
Every template must include:
|
|
- Core scripts: install.sh, uninstall.sh, start.sh, stop.sh, status.sh
|
|
- Configuration: config/service.env
|
|
|
|
### Script Requirements
|
|
- Use `#!/bin/bash` shebang
|
|
- Set `set -e` for error handling
|
|
- Use absolute paths where possible
|
|
- Handle missing dependencies gracefully
|
|
- Provide meaningful error messages
|
|
- Clean up resources on uninstall
|
|
|
|
### Environment Variables
|
|
Define in config/service.env:
|
|
- Service-specific configuration
|
|
- Port mappings
|
|
- Volume mounts
|
|
- Resource limits
|
|
- Feature flags
|
|
|
|
### Docker Integration
|
|
Most templates use Docker:
|
|
- Use official images when possible
|
|
- Pin specific versions (avoid :latest in production)
|
|
- Map configuration via volumes
|
|
- Use docker-compose for complex setups
|
|
- Handle container lifecycle properly
|
|
|
|
## Contributing
|
|
|
|
1. Fork the repository
|
|
2. Create a feature branch
|
|
3. Make your changes
|
|
4. Add/update tests if needed
|
|
5. Bump versions appropriately
|
|
6. Submit a pull request
|
|
|
|
Pull requests should:
|
|
- Pass all tests
|
|
- Include version bumps for changed templates
|
|
- Have clear descriptions
|
|
- Follow existing code style
|
|
- Include any necessary documentation updates |