CLAへの同意をGitHub Actionsで自動化する

この投稿ではCLA(Contributor License Agreement)署名をGitHub Actionsで自動化する方法を紹介します。

# 使うもの

https://github.com/cla-assistant/github-action

CLA assistantは[SaaS版](https://cla-assistant.io/)がありますが、今回使うのはGitHub内で完結するCLA assistant liteです。CLA assistant liteは、GitHub Actionsで動作するため、外部のサーバーが不要という特徴があります。同意したコントリビューターの情報はリポジトリ内にファイルとして残るので、SaaS版がサービス終了したときに同意者リストデータを消失するといった心配がありません。

# CLA assistant liteを使ったCLA署名の流れ

CLA assistant liteを使ったとき、CLAの署名は次の流れで行われます。

1. コントリビューターがプルリクエストを作成する。
1. GitHub ActionsにてCLA assistant botが起動する。
1. プルリクエストのコメントに、CLA同意を求めるコメントがbot名義で付く。このときCIステータスはFAILになる。
1. コントリビューターはCLA同意表明をプルリクエストのコメント欄で行う。
1. 再びGitHub ActionsにてCLA assistant botが起動し、コントリビューターの情報をmainブランチのcla.jsonに書き足す。CIステータスPASSで終了する。
1. プロジェクトのオーナーなどマージ権限がある人がプルリクエストをマージする。
1. GitHub ActionsにてCLA assistant botが起動し、プルリクエストをロックする。ロックにより、後でコントリビューターがコメントを消すことができなくなる。

# 設定方法

## GitHub Actionsの設定

まず.github/workflows/cla.ymlを作成します。

```yaml
name: "CLA Assistant"
on:
  issue_comment:
    types: [created]
  pull_request_target:
    types: [opened,closed,synchronize]

jobs:
  CLAssistant:
    runs-on: ubuntu-latest
    steps:
      - name: "CLA Assistant"
        if: (github.event.comment.body == 'recheck' || github.event.comment.body == 'I have read the CLA Document and I hereby sign the CLA') || github.event_name == 'pull_request_target'
        # Beta Release
        uses: cla-assistant/github-action@v2.1.3-beta
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          # the below token should have repo scope and must be manually added by you in the repository's secret
          PERSONAL_ACCESS_TOKEN : ${{ secrets.PERSONAL_ACCESS_TOKEN }}
        with:
          path-to-signatures: 'signatures/version1/cla.json'
          path-to-document: 'https://github.com/cla-assistant/github-action/blob/master/SAPCLA.md' # e.g. a CLA or a DCO document
          # branch should not be protected
          branch: 'main'
          #allowlist: user1,bot*

         #below are the optional inputs - If the optional inputs are not given, then default values will be taken
          #remote-organization-name: enter the remote organization name where the signatures should be stored (Default is storing the signatures in the same repository)
          #remote-repository-name:  enter the  remote repository name where the signatures should be stored (Default is storing the signatures in the same repository)
          #create-file-commit-message: 'For example: Creating file for storing CLA Signatures'
          #signed-commit-message: 'For example: $contributorName has signed the CLA in #$pullRequestNo'
          #custom-notsigned-prcomment: 'pull request comment with Introductory message to ask new contributors to sign'
          #custom-pr-sign-comment: 'The signature to be committed in order to sign the CLA'
          #custom-allsigned-prcomment: 'pull request comment when all contributors has signed, defaults to **CLA Assistant Lite bot** All Contributors have signed the CLA.'
          #lock-pullrequest-aftermerge: false - if you don't want this bot to automatically lock the pull request after merging (default - true)
          #use-dco-flag: true - If you are using DCO instead of CLA
```

## アクセストークンの設定

`PERSONAL_ACCESS_TOKEN`が必要なので、[Personal access token](https://github.com/settings/tokens)のページでアクセストークンを作ります。

![CleanShot 2021-10-07 at 05.08.09@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/d1f7874c-3a79-ea17-2632-9ed05eec4237.png)


リポジトリの「Settings」→「Secrets」→「New repository secret」を開きます。

![CleanShot 2021-10-07 at 05.17.41@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/e386fc6f-bfbd-e1b7-f82b-ea21ca5f2f20.png)

「Name」を`PERSONAL_ACCESS_TOKEN`にし、「Value」には先程作ったアクセストークンを入力します。

![CleanShot 2021-10-07 at 05.18.39@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/9397597e-3745-54c3-ba1b-8ae55538bda3.png)

以上で設定は完了です。

# 動作確認

プルリクエストを作ってみます。

![CleanShot 2021-10-07 at 05.23.45@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/c774f6ea-dd1a-87c8-7cce-288e7784b3db.png)

コメントすると再びGitHub Actionが実行され、チェックが通ります。

![CleanShot 2021-10-07 at 05.30.38@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/1cdf47a4-bc41-2401-0c6d-e25af27dded2.png)

signatures/version1/cla.jsonを開くと同意者の情報が書き加えられているのがわかります。

![CleanShot 2021-10-07 at 05.31.53@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/879551f4-9f1a-c3ed-b529-7fc6474966a9.png)