5
0
Fork 0
mirror of https://github.com/pre-commit/action.git synced 2025-11-08 19:26:54 +00:00
a GitHub action to run pre-commit
Find a file
2020-10-17 14:52:14 +02:00
.github/workflows Added test of the newly built action to the deploy workflow 2020-10-12 15:17:10 -07:00
.gitignore Initial commit 2019-11-24 19:27:32 -08:00
.pre-commit-config.yaml Run pre-commit autoupdate 2020-05-11 14:14:30 -07:00
action.yml Support extra_args keyword in pre-commit GitHub action 2020-05-15 08:14:38 -07:00
index.js Avoid update remote of repository 2020-10-10 01:57:53 +02:00
LICENSE add LICENSE resolves #25 2020-05-16 09:34:36 -07:00
Makefile include the license in the release output 2020-05-22 13:06:23 -07:00
package-lock.json Bump @actions/core from 1.2.4 to 1.2.6 2020-10-01 17:24:35 +00:00
package.json embedding cache steps by using @actions/cache 2020-06-13 12:43:57 -07:00
README.md Fixed code block 2020-10-17 14:52:14 +02:00
webpack.config.js set mode: production to silence webpack warning 2020-05-22 14:29:06 -07:00

Build Status

pre-commit/action

A GitHub action to run pre-commit.

How to

Setup

To use this action, make a file .github/workflows/pre-commit.yml. The following template will get you started:

name: pre-commit

on:
  pull_request:
  push:
    branches: [master]

jobs:
  pre-commit:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - uses: actions/setup-python@v2
    - uses: pre-commit/action@v2.0.0

This does a few things:

  • Clones the code
  • Installs python
  • Sets up the pre-commit cache

With custom invocations

By default, this action runs all the hooks against all the files. extra_args lets users specify a single hook id and/or options to pass to pre-commit run.

Here's a sample step configuration that only runs the flake8 hook against all the files (use the template above except for the pre-commit action):

- uses: pre-commit/action@v2.0.0
  with:
    extra_args: flake8 --all-files

In private repositories

This action also provides an additional behaviour when used in private repositories. When configured with a GitHub token, the action will push back fixes to the pull request branch.

Using the template above, you'll need to make two replacements for individual actions:

First is the checkout step, which needs to use unlimited fetch depth for pushing:

    - uses: actions/checkout@v2
      with:
        fetch-depth: 0

Next is passing the token to the pre-commit action:

    - uses: pre-commit/action@v2.0.0
      with:
        token: ${{ secrets.GITHUB_TOKEN }}

Note that secrets.GITHUB_TOKEN is automatically provisioned and will not require any special configuration.

While you could technically configure this for a public repository (using a personal access token), I can't think of a way to do this safely without exposing a privileged token to pull requests if you have any ideas, please leave an issue!

Troubleshooting

Changes aren't commited.

  1. The push back behaviour is only enabled for pull requests, not for pushes directly to branches.

Make sure that your .github/workflows/pre-commit.yml contains at least:

on:  
  pull_request:
  ```

2. Your pre-commit actions contain a conflict.

If `pre-commit` fails on the second invocation it can't push to the branch because GitHub actions does not fire on pushes made by GitHub actions, so it marks the job as failed.

_For example:_ Using both `double-quote-string-fixer` and `black` will cause the action to fail since both will format strings differently (Unless you pass `-S [skip-string-normalization]` to `black`) and will prevent them from reaching an agreement.

### Actions cannot write to file.

1. This happens when the action is trying to change a workflow file and is prohibited by [GitHub](https://github.community/t/refusing-to-allow-an-integration-to-create-or-update/16326/2).

**Example error:**
```bash
! [remote rejected] HEAD -> test (refusing to allow a GitHub App to create or update workflow `.github/workflows/pre-commit.yml` without `workflows` permission)

Fix: Exclude the workflow file from the action through top level exclude or hook level exclude.

Example regex (For top level excluding, to be added to .pre-commit-config.yaml):

exclude: '.github/workflows/.*?\.yml'