Skip to content

generate and update GitHub's CODEOWNERS file based on the git fame of individual files

License

Notifications You must be signed in to change notification settings

gofunky/update-codeowners

Use this GitHub action with your project
Add this Action to an existing workflow or create a new one
View on Marketplace

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

update code owners action

GitHub Workflow Status (branch) Renovate Status CodeFactor GitHub License GitHub last commit

This is a GitHub Action that uses git-fame to generate and update GitHub's CODEOWNERS file based on the git fame of individual files.

What does it do?

GitHub's CODEOWNERS feature doesn't provide any method for keeping the code owners list updated automatically. This action solves this by determining code owners based on the git fame of each file. Authors don't have to be asked for their addition based on subjective criteria anymore.

Inputs

distribution

Required Default

The distribution input defines the minimum percentage of code lines that are required for a contributor to being considered a code owner. Set it to any integer without the percent character to override the default.

granular

Required Default

By default, this action checks all files in the root, but groups recursive files into their parent directories. Set this input to any non-zero value (e.g. true) to enable full coverage of all recursive files.

path

Required Default

This defines the path to the CODEOWNERS file. The default uses the path to the .github directory.

token

Required Default

A GitHub token has to be set if inputs.username is enabled. This is necessary because the GitHub API has a rate limit. The default token has sufficient permissions for the API.

username

Required Default

By default, this action uses the email addresses of users. Set this input to any non-zero value (e.g. true) to derive the GitHub usernames and use them instead.

Example

This is a typical example for a pull request workflow. It should suffice to trigger it on few event types of pull request events only. That also gives the author the possibility to remove themselves from the owners list optionally. Make sure to use fetch-depth: 0 because otherwise, no git fame will be detected due to the lack of history.

name: codeowners

on:
  pull_request_target:
    paths-ignore:
      - '**/CODEOWNERS'
      - 'LICENSE'
    branches:
      - master
    types:
      - ready_for_review
      - review_request_removed
      - reopened
      - labeled

jobs:
  update:
    runs-on: ubuntu-latest
    # only apply on unmerged pull requests
    if: github.event.pull_request.merged_by == ''
    steps:
    - name: checkout code
      uses: actions/checkout@v2.3.4
      with:
        # this only makes sure that forks are built as well
        repository: ${{ github.event.pull_request.head.repo.full_name }}
        ref: ${{ github.head_ref }}
        # the fetch depth 0 (=all) is important
        fetch-depth: 0
        # the token is necessary for checks to rerun after auto commit
        token: ${{ secrets.PAT }}
    - name: update code owners
      uses: gofunky/update-codeowners@v0.3.1
      with:
        distribution: 25
        username: true
    - uses: mszostok/codeowners-validator@v0.5.1
      id: validation
      if: ${{ steps.committed.outputs.changes_detected == 'true' }}
      with:
        checks: files,owners,duppatterns
        # the token is required only if the `owners` check is enabled
        github_access_token: ${{ secrets.PAT }}
    - name: commit changed files
      id: committed
      if: ${{ steps.committed.outputs.changes_detected == 'true' }}
      uses: stefanzweifel/git-auto-commit-action@v4.7.2
      with:
        commit_message: 'chore(meta): update code owners'
        file_pattern: .github/CODEOWNERS
    - uses: christianvuerings/add-labels@v1.1
      if: ${{ steps.committed.outputs.changes_detected == 'true' }}
      with:
        labels: owned
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}