GitHub Actions上でgit commitするときにgit userをどうするか

## GitHub Actions上で変更をコミットしたい
GitHub Actions上で変更をコミットしたいケースがある。例えばGitHub Actions上でlintを実行して修正を自動反映したいケース。
このときgit configコマンドでどのユーザのcommitにするか指定する必要がある。
実際にはどのユーザを指定すればよいか。


### ユーザの設定方法
GitHub Actions上で `git config user.email <メールアドレス>` を実行する。
GitHubではgit userのメールアドレスでユーザ識別されるので、GitHubユーザで登録したメールアドレスと一致していればよい。

```yaml
on: push
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - run: |
          date > generated.txt
          git config user.name  "thaim"
          git config user.email "thaim@example.com"
          git add .
          git commit -m "generated"
          git push
```

もしくは、GitHubの[noreplyメールアドレス](https://docs.github.com/ja/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/setting-your-commit-email-address#about-commit-email-addresses)を利用する方法もある。
GItHubユーザ名`thaim`およびユーザID `1024789`(これは[API](https://api.github.com/users/thaim)よりわかる)に対して、`thaim@users.noreply.github.com`、または `1024789+github-actions@users.noreply.github.com` をメールアドレスに指定しても対象ユーザとして認識される。ユーザIDを指定する場合のメールアドレスのうちメールエイリアスに相当する `github-actions` の部分はどのような文字列を指定してもよいが、文字列を指定しない `1024789@users.noreply.github.com` だと該当ユーザとして認識されない。

ちなみに、この`ID+string@users.noreply.github.com` は[ドキュメント](https://docs.github.com/ja/account-and-profile/setting-up-and-managing-your-personal-account-on-github/managing-email-preferences/setting-your-commit-email-address#about-commit-email-addresses)の記載と挙動が若干異なる。アカウントを作成したのは2017年よりはるかに前だが、`ID+USERNAME@...`も`USERNAME@...`も両方利用できた。また、メールエイリアス部分は試した限りユーザ名以外でも認識された。このあたりよくわかっていない。


## 選択肢
### 特定ユーザ
個人開発している場合などで、コミットしているユーザは1人であり、同一ユーザ扱いでコミットして欲しい場合は、そのユーザとして認識されるように設定する。
単純に対象ユーザのメールアドレスを設定してもよいし、GitHub ユーザIDを用いたメールアドレスを指定してもよい。


### git logから自動抽出
複数ユーザで開発している場合で、直前のコミットと同一ユーザでコミットして欲しい場合はgit logからユーザ情報を取得すればよい。
`git config user.name "$(git --no-pager log --format=format:'%an' -n 1)"` および`git config user.email "$(git --no-pager log --format=format:'%ae' -n 1)"` を指定すれば、直前のコミットログからgitユーザ情報を取得できる。


### マシンユーザ
各種自動化のために[マシンユーザ](https://docs.github.com/ja/developers/overview/managing-deploy-keys#machine-users)を利用している場合は、そのユーザのemailアドレスを設定する方法もある。


### actions-user
emailに`action@github.com` を指定することで [actions-user](https://github.com/actions-user)としてコミットできる。もしくは、このユーザのGitHub IDを利用して `65916846+actions-user@users.noreply.github.com` を指定してもよい。
この方法は、action/checkoutのイシュー[Set git user and email](https://github.com/actions/checkout/issues/13#issuecomment-724415212)にて紹介されており、[多くのリポジトリで採用されている](https://github.com/search?q=git+config+local+user.email+action%40github.com&type=code)とのこと。
このユーザはアイコンとしてGitHub Actionsが指定されているので、Actionsとしてわかりやすい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14181/65914e06-287b-859b-9304-ebc57cc229aa.png)

ちなみに、[actions/checkout](https://github.com/actions/checkout)のREADMEで例示されている `github-actions@github.com` をメールアドレスに指定しても有効なユーザとして認識されない。


### github-actions[bot]
emailに `41898282+github-actions[bot]@users.noreply.github.com` を指定することで [github-actions[bot]](https://github.com/apps/github-actions) を利用する方法もある。
この方法はGitHub Communityの[GitHub Actions bot email address?](https://github.com/orgs/community/discussions/26560)というトピックで紹介されている。

このユーザ([API](https://api.github.com/users/github-actions[bot])によると厳密にはbot)は [secrets.GITHUB_TOKEN](https://docs.github.com/ja/actions/security-guides/automatic-token-authentication) によるAPI操作を行ったときに呼び出されるユーザでもある。このため、secrets.GITHUB_TOKEN を用いてプルリクやリリースノートの自動作成を行っている場合はコミットもこのユーザを指定しておくとGitHub Actionsの操作を単一ユーザに統一できる。
また、このユーザはアイコンとしてGitHubが指定されているので、actions-userより馴染みのある人が多いかもしれない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14181/2ed54bba-898a-e370-e5b5-ab1fdb29bb79.png)