Required workflows を使ってみる

## はじめに

GitHub Actions Required workflows が2023/1/10 に public betaになりました。

https://github.blog/changelog/2023-01-10-github-actions-support-for-organization-wide-required-workflows-public-beta/

そして、2023/8/2 に Repository Rules に統合され今に至ります。

Public Betaとしての提供を終え、現在ではGitHub Enterpriseでのみ利用可能な機能となっています。

https://github.blog/changelog/2023-08-02-github-actions-required-workflows-will-move-to-repository-rules/

Required workflows は Organization 配下のリポジトリにワークフローの実行を強制させる機能です。

https://github.blog/2023-01-10-introducing-required-workflows-and-configuration-variables-to-github-actions/

今回は Required workflows 利用方法をハマりポイントを交えながらご紹介していきます。

## Required Workflows の利用

まずは、Required workflows として実行させる workflow ファイルを配置するためのリポジトリを作成する必要があります。

### ハマりポイント リポジトリの可視性

このときリポジトリの可視性に注意する必要があります。

>プライベート リポジトリに格納されているワークフローは、Organization 内の他のプライベート リポジトリの必要なワークフローとして構成できます。 内部リポジトリに格納されているワークフローは、Organization 内の内部リポジトリとプライベート リポジトリの必要なワークフローとして構成できます。

と、[ドキュメント](https://docs.github.com/ja/enterprise-cloud@latest/actions/using-workflows/required-workflows)にあるようにPublic / Internal / Private 全ての可視性で実行させるためには Public リポジトリに workflow を配置する必要があります。

プライベートリポジトリに存在する workflow を パブリックリポジトリで実行すると `Worfklows cannnot be required from a less visible repository` というエラーが発生します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305460/7b898bc5-0a0d-c7f8-0bc8-31e083dd0090.png)

またリポジトリの設定で Organization 配下のリポジトリからのアクセス許可を設定する必要があります。

`Accessible from repositories in the hoge organization` を選択してください。

Required workflows は Organization配下のリポジトリにのみ実行可能であり、Organization 跨ぎは不可能なため  `Accessible from repositories in the hoge enterprise` の権限は過剰です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305460/2c8ef05b-0ee2-0227-4c39-69f836932e15.png)


### ハマりポイント workflow の格納場所

wokflowの格納場所は `.gihtub/workflows` です。

>必要なワークフローは、任意のリポジトリ フォルダーに格納可能で、通常のワークフローのように .github/workflows フォルダーに限定されることはありません。

と、ドキュメントにはありますが、実際には `.gihtub/workflows` に限定されており、これ以外の格納場所だと後の Required workflows の設定で workflow を指定することができません。

こちらは GitHub Community で言及されています。

>This is a deliberate choice, and we don't intend to support workflows outside of the .github/workflows directory, right now an if condition is the best way of handling things I think. We may revisit this if it turns out to be a major pain point, so we are listening to this feedback 👍
https://github.com/orgs/community/discussions/67754#discussioncomment-7201502

今回は `.github/workflows/example.yaml` という簡素なものを作成しました。

トリガーとして指定できるのは pull_request / pull_request_target / merge_group イベントのみです。

https://docs.github.com/ja/enterprise-cloud@latest/repositories/configuring-branches-and-merges-in-your-repository/managing-rulesets/available-rules-for-rulesets#require-workflows-to-pass-before-merging

```yaml
name: Hello World

on: pull_request

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - name: Hello World
      run: echo "Hello World!"
```

次に Organization の設定を変更して `.github/workflows/example.yaml` を他のリポジトリで実行してみます。

Organization の設定画面から 左サイドバー「Code, planning, and automation」の `Repository` > `Rulesets` から設定していきます。

**Enforcement status**

Disabled / Evaluate / Active の 3つから選択可能です。

Evaluate mode は 「実行はされるが、Branch protections で指定した規則は適用しない」という動作になります。

また、実行結果は `Repository` > `Ruleset insights` から一覧で表示することが可能となります。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305460/3c785d46-4428-de2e-e31c-a3dacc8d75e6.png)

****Target repositories****

All Repository / Dynamic list by name / Dynamic list by property / Select repositories から選択可能です。

今回は、`Select repositories` で指定したリポジトリだけで実行させるようにしています。

`Dynamic list by property` は `Custom Properties` という執筆段階では Beta 版の機能を用いて対象とするリポジトリを選択するものです。

本筋と離れてしまう為今回は省略します。こちらに[ドキュメント](https://docs.github.com/ja/rest/repos/custom-properties?apiVersion=2022-11-28)があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305460/cc6981dd-292c-373f-ffb4-514803807e0a.png)

**Branch protections**

Required workflows の 設定はここで行います。

Require workflows to pass before merging に チェックを入れて実行したい workflow の PATHを入力します。

`.github/workflows` 配下のファイルがサジェストされます。PATHを直接入力することもできますが、前述した通り実行できるのは `.github/workflows` 配下の workflow のみです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305460/8f77da46-c062-db9b-3828-ca44754f0625.png)

Pull Request を 作成してみると、設定した Required workflows が無事実行されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/305460/83fc7f13-ac88-5c85-4cdc-0c9beff0d6f3.png)

## さいごに

Required workflows は Organization 配下のリポジトリにワークフローの実行を強制させることができ、統制をとるには非常に便利な機能です。

GitHub Enterprise plan でしか利用できず、個人で試すのには金銭的なハードルが高いですが、Enterprise plan を契約している組織であれば簡単に試すことができます。

Evaluate mode で 影響範囲を事前に確認しつつ、段階的に統制をとることができるのも魅力的です。

Linter の 実行等を強制させたい場合に利用することを検討にいれてもいいかもしれません。

ジャストアイデアではありますが、`CODEOWNERS` が配置されているかを検査しリポジトリ保護に役立てるのもいいかもしれません。

GitHub Community で 偶然見かけたのは [Yelp detect-secrets](https://github.com/Yelp/detect-secrets) を使い、秘匿情報が含まれているかどうかのスキャンを行なっている方もいました。

https://github.com/orgs/community/discussions/69595

GitHub Enterprise を導入していることが必須かつ、Organization 全体に影響してしまうというハードルはあるものの、任意の workflow の実行を強制できるためより柔軟なルールを適用することができそうです。