yekope
yekope

Reputation: 85

GitHub custom checks

I'd like to integrate custom checks into some repos, but I can't figure out the best way to do this.

We have pretty large team of developers and we've introduced some naming conventions to maintain consistency in our repo. For example, every commit description should contain X, and every branch name should contain Y or Z, or have a match to some regular expression.

How do I enforce some custom checks on pull request, that branch that is being checked complies to these specified rules? Simply put, when pushed commits don't have Jira reference in their description - merge action is blocked. We also want to see these checks in the PR, like those CI checks which can pass or fail.

I've read about github apps, actions, api, marketplace and etc. Couldn't find something simple and straightforward.

What app or approach should I utilize for such a task?

Upvotes: 3

Views: 5704

Answers (1)

bk2204
bk2204

Reputation: 76489

The easiest way to do this is with a GitHub Action, which will allow you to execute whatever code you want to implement CI or linting checks.

You can create a shell script in your repository (for example, script/lint) that takes two arguments, the base branch and the branch being tested. Lint and check whatever you want, printing useful error messages and exiting zero if the commits are acceptable and nonzero if they're unacceptable.

Then create a workflow in .github/workflow/lint.yml with something like this (changing the script name if need be):

name: lint
on: pull_request

jobs:
  lint:
    name: Lint
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@master
    - run: script/lint "$GITHUB_SHA" "$GITHUB_REF"

This will appear in the checks interface like other CI checks under the name “Lint.” You can customize the name field to change the name.

An example lint script that checks for JIRA tags in commit messages might look like this:

#!/bin/sh

RET=0

for i in $(git rev-list "$1".."$2")
do
    printf "Checking $i for JIRA reference..."
    if git log -1 --format="%B" $i | grep -qsE "[A-Z]+-[0-9]+"
    then
        echo "looks ok."
    else
        echo "failed."
        RET=1
    fi
done

exit $RET

Upvotes: 5

Related Questions