pre-commit
|
|
||
|---|---|---|
| .github/workflows | ||
| .gitignore | ||
| .pre-commit-config.yaml | ||
| action.yml | ||
| index.js | ||
| LICENSE | ||
| Makefile | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| webpack.config.js | ||
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-commitcache
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.
- 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'