プロジェクトの直下というのは、ソースコードの置かれるディレクトリがあるのはもちろんだが、.
で始まるような設定ファイルなど、全体に影響するような重要なファイルが置かれることが多い。
そのため CODEOWNERS
ファイルを使ってプロジェクト直下だけでもレビューを必須にできないかと考えた。
検証するには複数人のユーザが必要になるが、手動の操作では一人で検証することができない...。
GitHub では CI で使用するようなマシンユーザを作成することは許可されている。
そこで、GitHub Actions でマシンユーザが自動的に pull request を作成するようなパターンを想定して、その場合に期待するファイルが code owner の approve 必須となるかどうかを確認してみた。
ここでは、issue を open することをトリガーとして pull request が作られるようにした。
各種の GitHub Actions の説明を参考に以下のように設定してみると、issue を open することで pull request を作ることはできた。
しかし、 commit して pull request を作成するのが自動であっても、以下の書き方では自身が commit したことになってしまう。
name: Create Pull Request
on:
issues:
types: opened
jobs:
create-pull-request:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Create changes
run: |
date +%s > report.txt
- name: Create Pull Request
id: cpr
uses: peter-evans/create-pull-request@v3
with:
token: ${{secrets.BOT_REPO_TOKEN}}
commit-message: Update report
committer: GitHub <noreply@github.com>
author: ${{ github.actor }} <${{ github.actor }}@users.noreply.github.com>
signoff: false
branch: example-patches
delete-branch: true
title: '[Example] Update report'
draft: false
マシンユーザに commit させるには、create-pull-request の action で author
を設定する。
- name: Create Pull Request
id: cpr
uses: peter-evans/create-pull-request@v3
with:
...
committer: GitHub <noreply@github.com>
author: ksoichiro-bot <ksoichiro-bot@users.noreply.github.com>
これで、issue を作るとマシンユーザが指定のファイルを変更して pull request が作られるようになり、 CODEOWNERS
がどのように作用するか確認できるようになった。
ここからが本題。
CODEOWNERS の説明に書かれている通り、.github/CODEOWNERS
を以下のように定義してみる。
* @ksoichiro
これは、設定が上書きされない限りプロジェクト内のすべてのファイルが approve 必須という設定になる。ここまで厳しくはしたくない、というのが今回の状況である。
プロジェクト直下のファイルを対象にしたいため、 .github/CODEOWNERS
を以下のように定義してみる。
/* @ksoichiro
こうすると、 a
という既存ディレクトリに対して a/report.txt
という新規ファイルを追加してもレビューアは設定されなかった。
ではこれで解決かというと、残念ながらそうではなかった。
プロジェクト直下に新しいディレクトリ(とその配下のファイル)が作られた場合は、ディレクトリ追加自体は直下への変更なので approve を必須としたいところだが、そうはならなかった。
つまり、このルールだけでは、いつの間にかディレクトリが作られているということはあり得えてしまう。
CODEOWNERS
ファイルの記法では後に書いたものが優先されるということだが、先に書いたものを打ち消すことはできず、レビューアを再設定できるというだけにすぎない。
このため、現時点でプロジェクト直下のファイルを approve 必須としたい場合には以下のいずれかの選択となりそう。
*
の指定により、プロジェクト内のすべてのファイルの追加/変更をレビューする。/*
の指定により、プロジェクト直下のファイルの追加/変更をレビューし、プロジェクト直下のディレクトリ追加や既存ディレクトリ配下の変更は承認なしでOKとする。/*
の指定により、プロジェクト直下のファイルの追加/変更をレビューし、プロジェクト直下のディレクトリ追加を検知して approve を必須とするようなフローを作る。