【CircleCI】"Only build pull requests" のオーバーライド機能を試してみた


CircleCIで、「デフォルトブランチ以外の特定のブランチにマージしたらビルドを走らせたいなぁ」「ただ **Only build pull requests** は ON のままにしたいなぁ」と思っていたところ、ちょっと前に **[オーバーライド機能](https://discuss.circleci.com/t/only-build-pull-requests/48073)** がリリースされていたのを知ったので試してみた記事となります。

# Only build pull requests とは
ビルドの実行を Pull Request の作成・更新時のみに変更してくれるという設定です。

Project Settings > Advanced Settings から設定が可能です。
![スクリーンショット 2023-10-11 午前4.53.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/995/4901102f-02c2-3aff-00d6-30bd0e3161e3.png)

ON にすることで無駄なビルド実行を抑えられたり、例えば [Danger](https://github.com/danger/danger) を使う場合には ON にすることが推奨されていたりします。

https://github.com/danger/danger/blob/d9fff7cbed6b0a4bfb6465709d0352e700bdd00e/lib/danger/ci_source/circle.rb#L9

---

Only build pull requests を ON にした場合、ビルド実行の契機としては
- Pull Request 作成・更新時
- デフォルトブランチ更新時
- tag更新時

となりますが、デフォルトブランチ以外でも Pull Request を作成しなくともビルド実行をしたいケースがあるかなと思います。

# オーバーライド機能
それと同じ要望があったかわかりませんが[^1]、2023年4月18日にオーバーライド機能がリリースされたようです。

https://discuss.circleci.com/t/only-build-pull-requests/48073

CircleCI APIを用いて設定する感じのようで、Webページ上でポチポチ設定するものではないようです。

## 試してみる。
さくっと使えそうだったので試してみました。

API 呼び出しにはトークンが必要なので、CircleCI にログインした状態で https://app.circleci.com/settings/user/tokens にアクセスし、トークンを発行する必要があります。

### 1. 現在の設定を取得

```bash
curl -X GET --header "Circle-Token: <token>" 
--header "Accept: application/json" 
--header "Content-Type: application/json" 
'https://circleci.com/api/v1.1/project/<vcs-type>/<org-slug>/<project-slug>/settings'
```

- `<token>` には、取得したトークンを入れます。
- `<vcs-type>/<org-slug>/<project-slug>` には、例えば https://github.com/android/nowinandroid の場合は、 `gh/android/nowinandroid` が入ります。

実行すると色々と情報が記載された JSON が返ってきて、 `feature_flags` というキーに `pr-only-branch-overrides` があることがわかると思います。

```json
{
  ...
  "feature_flags": {
    "setup-workflows": false,
    "pr-only-branch-overrides": [
      "master"
    ],
    "write-settings-requires-admin": false,
    "disable-ssh": false,
    "set-github-status": true,
    "ai-error-summarization": true,
    "build-prs-only": true,
    "forks-receive-secret-env-vars": false,
    "build-fork-prs": false,
    "autocancel-builds": true,
    "oss": true
  },
  ...
}
```

試したリポジトリでは、デフォルトブランチを `master` にしていたので、`pr-only-branch-overrides` には `master` だけが入っている状態になっています。

### 2. 設定のオーバーライド

```bash
curl -X PUT --header "Circle-Token: <token>" 
--header "Accept: application/json" 
--header "Content-Type: application/json" 
--data '{"feature_flags":{"pr-only-branch-overrides": "master, release"}}' 
'https://circleci.com/api/v1.1/project/vcs-type/org-slug/project-slug/settings'
```

- `<token>` `<vcs-type>/<org-slug>/<project-slug>` は取得時と同様です。

`--data` には `feature_flags` の `pr-only-branch-overrides` のオーバーライド後の設定を記載します。
上記の例では `release` ブランチでもビルドを有効にするように設定を記載しています。（ブランチの指定は正規表現も可能なようです。）

実行が成功すると `""` が返ってきます。

### 3. オーバーライド後の設定を取得
再度、現在の設定を取得すると `pr-only-branch-overrides` に `release` が追加されていることが確認できました。

```json
{
  ...
  "feature_flags": {
    "setup-workflows": false,
    "pr-only-branch-overrides": [
      "release",
      "master"
    ],
    "write-settings-requires-admin": false,
    "disable-ssh": false,
    "set-github-status": true,
    "ai-error-summarization": true,
    "build-prs-only": true,
    "forks-receive-secret-env-vars": false,
    "build-fork-prs": false,
    "autocancel-builds": true,
    "oss": true
  },
  ...
}
```

オーバーライド実行後に、試しに `release` ブランチを Push しただけでも、CircleCIでビルドの実行が行われることも確認できました。 :rocket: 

# まとめ
- 2023年4月18日にリリースされた "Only build pull requests" のオーバーライド機能を試してみた。
- 簡単に設定できるし、ブランチ指定も正規表現を使って柔軟にできそうなので、使えるところでは使っていきたい。

[^1]:https://circleci.canny.io/cloud-feature-requests/p/allow-branch-whitelist-to-override-only-build-pull-requests に詳しい経緯があるようです。