From f3a95d87679724a56f0b051b3c1212c60211eaca Mon Sep 17 00:00:00 2001 From: Greg Hendrickson Date: Tue, 27 Jan 2026 15:13:28 +0000 Subject: [PATCH] Add CI/CD pipeline and SDLC docs --- .github/PULL_REQUEST_TEMPLATE.md | 18 +++++++++ .github/workflows/ci.yml | 67 ++++++++++++++++++++++++++++++++ .github/workflows/deploy.yml | 66 +++++++++++++++++++++++++++++++ CONTRIBUTING.md | 52 +++++++++++++++++++++++++ 4 files changed, 203 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/deploy.yml create mode 100644 CONTRIBUTING.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..99a2d9c --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,18 @@ +## Description + + +## Type of Change +- [ ] ๐Ÿ› Bug fix +- [ ] โœจ New feature +- [ ] ๐Ÿ”ง Refactor +- [ ] ๐Ÿ“š Documentation +- [ ] ๐Ÿงช Tests + +## Testing + + +## Checklist +- [ ] Code follows project style guidelines +- [ ] Tests pass locally +- [ ] Documentation updated (if needed) +- [ ] No sensitive data exposed diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..1c24455 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,67 @@ +name: CI + +on: + push: + branches: [develop, master] + pull_request: + branches: [develop] + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Install dependencies + run: | + pip install ruff mypy + pip install -e ".[dev]" + + - name: Lint with ruff + run: ruff check src/ + + - name: Type check with mypy + run: mypy src/ --ignore-missing-imports + + test: + runs-on: ubuntu-latest + needs: lint + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.11" + + - name: Install Stockfish + run: sudo apt-get update && sudo apt-get install -y stockfish + + - name: Install dependencies + run: pip install -e ".[dev]" + + - name: Run tests + run: pytest tests/ -v --tb=short + + build: + runs-on: ubuntu-latest + needs: test + steps: + - uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build Docker image + uses: docker/build-push-action@v5 + with: + context: . + push: false + tags: shellmate:${{ github.sha }} + cache-from: type=gha + cache-to: type=gha,mode=max diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..62ac086 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,66 @@ +name: Deploy + +on: + push: + branches: [master] + +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + +jobs: + build-and-push: + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + + steps: + - uses: actions/checkout@v4 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to Container Registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=sha,prefix= + type=raw,value=latest + + - name: Build and push + uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max + + deploy: + runs-on: ubuntu-latest + needs: build-and-push + environment: production + + steps: + - name: Deploy to Hetzner + uses: appleboy/ssh-action@v1.0.3 + with: + host: ${{ secrets.HETZNER_HOST }} + username: ${{ secrets.HETZNER_USER }} + key: ${{ secrets.HETZNER_SSH_KEY }} + script: | + cd /opt/shellmate + docker compose pull + docker compose up -d --remove-orphans + docker system prune -f diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..563e41d --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,52 @@ +# Contributing to ShellMate + +Thanks for your interest in contributing! ๐ŸŽ‰ + +## Branch Strategy + +``` +feature/* โ”€โ”€โ†’ develop โ”€โ”€โ†’ master + โ”‚ โ”‚ + staging production +``` + +- **`develop`** โ€” Default branch, all PRs target here +- **`master`** โ€” Production releases only +- **`feature/*`** โ€” Feature branches off develop + +## Development Flow + +1. Fork the repo +2. Create a feature branch from `develop`: + ```bash + git checkout develop + git pull origin develop + git checkout -b feature/my-feature + ``` +3. Make your changes +4. Run tests: `pytest tests/ -v` +5. Run linting: `ruff check src/` +6. Push and create a PR to `develop` + +## Code Style + +- Python 3.11+ +- Type hints required +- Ruff for linting +- 100 char line limit + +## Commit Messages + +Use conventional commits: +- `feat:` New feature +- `fix:` Bug fix +- `docs:` Documentation +- `refactor:` Code refactor +- `test:` Tests +- `chore:` Maintenance + +## Release Process + +1. PRs merged to `develop` deploy to staging +2. When ready, merge `develop` โ†’ `master` +3. Master deploys to production automatically