Back to blog

Pre-commit strategies and GitHub Actions

Maintaining code quality and consistency is crucial for any software project. Pre-commit strategies and GitHub Actions are powerful tools that help automate checks and enforce standards before code is merged. In this post, we'll explore how to use pre-commit hooks and GitHub Actions to streamline your development workflow.

What are Pre-commit Strategies?

Pre-commit strategies involve running automated checks on your code before it is committed to your repository. These checks can include:

  • Linting for code style and formatting
  • Running unit tests
  • Checking for secrets or sensitive data
  • Validating commit messages

By catching issues early, you reduce the risk of introducing bugs or inconsistencies into your codebase.

Setting Up Pre-commit Hooks

pre-commit is a popular framework for managing and maintaining multi-language pre-commit hooks. Here's how you can set it up:

  1. Install pre-commit:
pip install pre-commit
  1. Create a .pre-commit-config.yaml file in your repository:
repos:
    - repo: https://github.com/pre-commit/pre-commit-hooks
        rev: v4.4.0
        hooks:
        - id: trailing-whitespace
        - id: end-of-file-fixer
        - id: check-yaml
  1. Install the hooks:
pre-commit install

Now, every time you make a commit, these hooks will run automatically.

Why Use GitHub Actions?

While pre-commit hooks run locally, GitHub Actions allow you to automate checks in your CI/CD pipeline. This ensures that all code, regardless of its source, passes the same quality gates before being merged.

Example: Linting with GitHub Actions

Here's a simple workflow to run linting on every pull request:

# .github/workflows/lint.yml
name: Lint

on: [pull_request]

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 flake8
        - name: Run flake8
          run: flake8 .

This workflow checks out your code, installs dependencies, and runs flake8 to lint your Python files.

Combining Pre-commit and GitHub Actions

Using both pre-commit hooks and GitHub Actions provides defense in depth:

  • Pre-commit hooks catch issues before code is even pushed.
  • GitHub Actions enforce checks on all contributions, including those from forks or collaborators who may not have hooks installed.

Implementing pre-commit strategies and automating checks with GitHub Actions leads to cleaner, more reliable code. Start small by adding a few hooks and a basic workflow, then iterate as your project grows. Your future self—and your team—will thank you!