Initial commit
This commit is contained in:
368
skills/github-workflow-patterns.md
Normal file
368
skills/github-workflow-patterns.md
Normal file
@@ -0,0 +1,368 @@
|
||||
---
|
||||
title: GitHub Workflow Patterns
|
||||
description: branching strategies, merge practices, and GitHub collaboration patterns
|
||||
tags: [github, workflow, branching, merging, collaboration, best-practices]
|
||||
---
|
||||
|
||||
# GitHub Workflow Patterns
|
||||
|
||||
## Metadata
|
||||
|
||||
**Purpose**: Best practices for branching, merging, releases, and GitHub features
|
||||
**Applies to**: All projects using GitHub
|
||||
**Version**: 1.0.0
|
||||
|
||||
---
|
||||
|
||||
## Instructions
|
||||
|
||||
### Branch Naming Conventions
|
||||
|
||||
**Standard format**:
|
||||
```
|
||||
<type>/<short-description>
|
||||
```
|
||||
|
||||
**Types**:
|
||||
- `feature/` - New features
|
||||
- `fix/` or `bugfix/` - Bug fixes
|
||||
- `hotfix/` - Urgent production fixes
|
||||
- `refactor/` - Code refactoring
|
||||
- `docs/` - Documentation updates
|
||||
- `experiment/` - Research experiments
|
||||
- `chore/` - Maintenance tasks
|
||||
|
||||
**Examples**:
|
||||
- ✅ `feature/add-customer-segmentation`
|
||||
- ✅ `fix/resolve-auth-timeout`
|
||||
- ✅ `hotfix/patch-security-vulnerability`
|
||||
- ✅ `refactor/extract-validation-logic`
|
||||
- ❌ `john-dev` (not descriptive)
|
||||
- ❌ `temp-branch` (not meaningful)
|
||||
- ❌ `FEATURE-123` (all caps, no description)
|
||||
|
||||
**Guidelines**:
|
||||
- Use lowercase with hyphens
|
||||
- Be descriptive but concise
|
||||
- Include ticket number if applicable: `feature/PROJ-123-add-export`
|
||||
- Avoid personal names or dates
|
||||
|
||||
### Merge Strategies
|
||||
|
||||
**Squash Merge** (recommended for most PRs)
|
||||
- Combines all commits into single commit
|
||||
- Clean, linear history
|
||||
- Use when: Feature branch has messy commit history
|
||||
|
||||
```bash
|
||||
# GitHub: "Squash and merge" button
|
||||
# CLI:
|
||||
git merge --squash feature/my-feature
|
||||
git commit -m "feat: add new feature"
|
||||
```
|
||||
|
||||
**Merge Commit** (preserve commit history)
|
||||
- Keeps all individual commits
|
||||
- Shows full development history
|
||||
- Use when: Commits are clean and tell a story
|
||||
|
||||
```bash
|
||||
# GitHub: "Create a merge commit" button
|
||||
# CLI:
|
||||
git merge --no-ff feature/my-feature
|
||||
```
|
||||
|
||||
**Rebase** (update feature branch)
|
||||
- Replay commits on top of target branch
|
||||
- Linear history, no merge commits
|
||||
- Use when: Updating feature branch with main
|
||||
|
||||
```bash
|
||||
# Update feature branch with main
|
||||
git checkout feature/my-feature
|
||||
git rebase main
|
||||
```
|
||||
|
||||
**Default**: Squash merge for cleaner history
|
||||
|
||||
### Pre-Commit Hook Requirements
|
||||
|
||||
**All projects should use pre-commit hooks for**:
|
||||
|
||||
1. **Code quality**:
|
||||
- Linting (ruff, eslint, etc.)
|
||||
- Formatting (black, prettier, etc.)
|
||||
- Type checking (mypy, typescript)
|
||||
|
||||
2. **Security**:
|
||||
- Secret detection (detect-secrets)
|
||||
- Dependency scanning
|
||||
|
||||
3. **Git hygiene**:
|
||||
- Commit message format validation
|
||||
- Prevent commits to main/master
|
||||
- Check for debugging code
|
||||
|
||||
**Setup**:
|
||||
```bash
|
||||
# Install pre-commit
|
||||
pip install pre-commit
|
||||
|
||||
# Install hooks
|
||||
pre-commit install
|
||||
|
||||
# .pre-commit-config.yaml example
|
||||
repos:
|
||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||
rev: v4.5.0
|
||||
hooks:
|
||||
- id: trailing-whitespace
|
||||
- id: end-of-file-fixer
|
||||
- id: check-added-large-files
|
||||
- id: check-merge-conflict
|
||||
|
||||
- repo: https://github.com/psf/black
|
||||
rev: 23.12.1
|
||||
hooks:
|
||||
- id: black
|
||||
|
||||
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||
rev: v0.1.9
|
||||
hooks:
|
||||
- id: ruff
|
||||
```
|
||||
|
||||
### Draft PRs
|
||||
|
||||
**Use draft PRs for**:
|
||||
- Work in progress
|
||||
- Seeking early architectural feedback
|
||||
- CI/CD pipeline testing
|
||||
- Demonstrating approach
|
||||
|
||||
**Workflow**:
|
||||
```
|
||||
1. Create PR as draft
|
||||
2. Add [WIP] or [Draft] prefix to title (optional)
|
||||
3. Request feedback in comments
|
||||
4. Mark "Ready for review" when complete
|
||||
```
|
||||
|
||||
**Draft PR checklist before marking ready**:
|
||||
- [ ] All tests passing
|
||||
- [ ] Code complete (no TODOs for this PR)
|
||||
- [ ] Description updated
|
||||
- [ ] Self-review completed
|
||||
|
||||
### GitHub Actions Integration Points
|
||||
|
||||
**Common automation use cases**:
|
||||
|
||||
1. **PR validation**:
|
||||
- Run tests on every PR
|
||||
- Check code coverage
|
||||
- Lint and format checks
|
||||
- Security scans
|
||||
|
||||
2. **Branch protection**:
|
||||
- Require status checks to pass
|
||||
- Require reviews before merge
|
||||
- Prevent force pushes to main
|
||||
- Require signed commits
|
||||
|
||||
3. **Automated workflows**:
|
||||
- Auto-label PRs based on files changed
|
||||
- Auto-assign reviewers
|
||||
- Post coverage reports
|
||||
- Deploy to staging environments
|
||||
|
||||
**Example workflow** (`.github/workflows/pr-checks.yml`):
|
||||
```yaml
|
||||
name: PR Checks
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches: [main]
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Run tests
|
||||
run: pytest
|
||||
- name: Check coverage
|
||||
run: pytest --cov --cov-fail-under=80
|
||||
```
|
||||
|
||||
### Protected Branches
|
||||
|
||||
**Main branch should be protected with**:
|
||||
- Require PR before merging
|
||||
- Require status checks to pass
|
||||
- Require review from code owners
|
||||
- Dismiss stale reviews on new commits
|
||||
- Require linear history (optional)
|
||||
- Prevent force pushes
|
||||
- Prevent deletions
|
||||
|
||||
---
|
||||
|
||||
## Resources
|
||||
|
||||
### Complete Workflow Example
|
||||
|
||||
**Feature Development Workflow**:
|
||||
|
||||
```bash
|
||||
# 1. Create and switch to feature branch
|
||||
git checkout main && git pull origin main
|
||||
git checkout -b feature/add-export-api
|
||||
|
||||
# 2. Make changes and commit
|
||||
git add src/api/export.py
|
||||
git commit -m "feat(api): add customer data export endpoint"
|
||||
|
||||
# 3. Push and create PR
|
||||
git push -u origin feature/add-export-api
|
||||
gh pr create --title "feat: add customer data export API" \
|
||||
--body "Adds endpoint for exporting customer data as CSV/JSON"
|
||||
|
||||
# 4. Address review feedback, merge via GitHub UI (squash merge)
|
||||
|
||||
# 5. Clean up local branch
|
||||
git checkout main && git pull origin main
|
||||
git branch -d feature/add-export-api
|
||||
```
|
||||
|
||||
**For hotfixes**: Use `hotfix/` branch type, label as `security,hotfix`, request expedited review
|
||||
|
||||
**For rebasing**: `git fetch origin && git rebase origin/main && git push --force-with-lease`
|
||||
|
||||
### Conflict Resolution
|
||||
|
||||
```bash
|
||||
git status # Identify conflicted files
|
||||
# Resolve conflicts in editor (look for <<<<<<<, =======, >>>>>>>)
|
||||
git add <resolved-files>
|
||||
git rebase --continue # or git merge --continue
|
||||
git push --force-with-lease
|
||||
```
|
||||
|
||||
**Prevention**: Keep PRs small, merge main frequently, use feature flags
|
||||
|
||||
### Release Workflows
|
||||
|
||||
**SemVer** (`vMAJOR.MINOR.PATCH`): For libraries/APIs - MAJOR=breaking, MINOR=features, PATCH=fixes
|
||||
**CalVer** (`vYYYY.MM.MICRO`): For applications/pipelines with time-based releases
|
||||
|
||||
**Release Process**:
|
||||
```bash
|
||||
git checkout -b release/v1.2.0
|
||||
# Update version files and CHANGELOG.md
|
||||
gh pr create --title "chore: release v1.2.0"
|
||||
# After merge:
|
||||
git checkout main && git pull origin main
|
||||
git tag -a v1.2.0 -m "Release v1.2.0" && git push origin v1.2.0
|
||||
gh release create v1.2.0 --title "Version 1.2.0" --notes "Release notes..."
|
||||
```
|
||||
|
||||
### Personal Patterns
|
||||
|
||||
**Multi-Repo Changes**
|
||||
|
||||
When changes span multiple repositories:
|
||||
|
||||
```markdown
|
||||
## Related PRs
|
||||
This change requires updates across multiple repos:
|
||||
|
||||
- [ ] API Service: username/repo#123
|
||||
- [ ] Web App: username/repo#456
|
||||
- [ ] Data Pipeline: username/repo#789
|
||||
|
||||
**Merge order**: API → Pipeline → Web App
|
||||
**Deployment**: Coordinate deployment window
|
||||
```
|
||||
|
||||
**Research Experiments**
|
||||
|
||||
Use `experiment/` branches for exploratory work:
|
||||
|
||||
```bash
|
||||
git checkout -b experiment/test-xgboost-model
|
||||
|
||||
# Document outcomes in PR description
|
||||
# Merge if successful, close if unsuccessful
|
||||
# Keep experiment history for reference
|
||||
```
|
||||
|
||||
**Data Pipeline Branches**
|
||||
|
||||
Include data validation in PR workflow:
|
||||
|
||||
```bash
|
||||
# 1. Create feature branch with data change
|
||||
# 2. Run validation queries in staging
|
||||
# 3. Document data impact in PR
|
||||
# 4. Get data team review
|
||||
# 5. Plan backfill if needed
|
||||
# 6. Merge and monitor data quality
|
||||
```
|
||||
|
||||
### Common Git Operations
|
||||
|
||||
| Issue | Solution |
|
||||
|-------|----------|
|
||||
| **Committed to wrong branch** | `git reset --soft HEAD~1 && git stash && git checkout correct-branch && git stash pop && git commit` |
|
||||
| **Undo last commit (keep changes)** | `git reset --soft HEAD~1` |
|
||||
| **Cherry-pick to another branch** | `git checkout target-branch && git cherry-pick <commit-hash>` |
|
||||
| **Accidentally committed secrets** | Remove secret, commit, `git push --force-with-lease`, **rotate secret immediately** |
|
||||
|
||||
### GitHub Features to Leverage
|
||||
|
||||
**Code Owners** (`.github/CODEOWNERS`):
|
||||
```
|
||||
# Auto-assign reviewers based on files changed
|
||||
*.py @data-team
|
||||
src/api/* @backend-team
|
||||
docs/* @documentation-team
|
||||
```
|
||||
|
||||
**Issue Templates** (`.github/ISSUE_TEMPLATE/bug_report.md`):
|
||||
```markdown
|
||||
---
|
||||
name: Bug Report
|
||||
about: Report a bug
|
||||
---
|
||||
|
||||
**Description**
|
||||
Clear description of the bug
|
||||
|
||||
**Steps to Reproduce**
|
||||
1. Step 1
|
||||
2. Step 2
|
||||
|
||||
**Expected Behavior**
|
||||
What should happen
|
||||
|
||||
**Actual Behavior**
|
||||
What actually happened
|
||||
```
|
||||
|
||||
**PR Templates** (`.github/pull_request_template.md`):
|
||||
```markdown
|
||||
## Purpose
|
||||
Why is this change needed?
|
||||
|
||||
## Changes
|
||||
- What was modified?
|
||||
|
||||
## Testing
|
||||
- [ ] Tests added
|
||||
- [ ] Manual testing completed
|
||||
|
||||
## Checklist
|
||||
- [ ] Code follows style guidelines
|
||||
- [ ] Documentation updated
|
||||
```
|
||||
Reference in New Issue
Block a user