GitHub Actionsで.NETプロジェクトのフォーマットチェックを行う。
Tags: github, devops, dotnet
Published: 2020-04-30 16:21:04

GitHubのCI/CD機能、GitHub Actionsが去年11月にリリースされました。

GitHub ActionsはGitHubで公式に用意された環境のため、CircleCIやTravisCIなどの既存のCI/CDサービスがpush時にアクションするよりも広範囲にGitHubのイベントを取得してワークフローを実行することができます。

また、GitHub内でのみ完結するため、GitHubの権限を外に出す必要もありません。
その点もセキュリティ的には良いと思われます。

まだリリースして時間が経っていないというのもあり、公式のテンプレートは色々用意されているもののサンプルの情報は少ないです。

.NET Coreのテンプレートはビルドとテストを実行するものが用意されており、CIでは他にLintチェックやフォーマットチェック等もプッシュ時に行うように自動化していきたいところです。

今回はまず.NETのビルドのテンプレートをもとにフォーマットチェックを行うようにしてみました。

GitHub Actionsの書き方は以下の書籍（2020年4月時点で日本の書籍はこれしかなさそう）を参考に実装しています。
<a href="https://booth.pm/ja/items/1865906" alt="GitHub Actions 実践入門" ><img src="https://dev-to-uploads.s3.amazonaws.com/i/ul5nbas1a8vcgxrv3e1e.jpg" width="180px"></a>

---

1. ワークフローを作成する
    GitHubのリポジトリのトップ画面のタブから`Actions`を選択します。
    ![GitHub_Actions_1](https://dev-to-uploads.s3.amazonaws.com/i/n3lw7x6wkxybdphw0q6v.png)
    
    テンプレートから`.NET Core`を選択します。
    <img src="https://dev-to-uploads.s3.amazonaws.com/i/vk73bul260466ypvf01y.png" width="300px" alt="GitHub_Actions_2">

    テンプレートで用意された内容は以下です。
    .NET Coreのバージョンは3.1です。
    GitHub Actionsの定義はymlファイルの形式で記述していきます。
    ```
    name: .NET Core

    on:
      push:
        branches: [ master ]
      # pull_request:　　プルリクエスト時の実施は不要なので削除します
        # branches: [ master ]

    jobs:
      build:

        runs-on: ubuntu-latest

        steps:
        - uses: actions/checkout@v2
        - name: Setup .NET Core
          uses: actions/setup-dotnet@v1
          with:
            dotnet-version: 3.1.101
        - name: Install dependencies
          run: dotnet restore
        - name: Build
          run: dotnet build --configuration Release --no-restore
        - name: Test
          run: dotnet test --no-restore --verbosity normal
    ```
    1行目の`name:`はワークフローの名前です。
    その次の`on`の後にワークフローを実行させたいGitHubのイベントを記述します。
    （ここではプルリクエスト時のワークフロー実行は不要なので削除しています）
    
    その後に、jobが複数定義でき、`build`という名前のjobは、`runs-on:`で指定されたOS環境ubuntu(Linux)で実行されます。（環境にはWindowsやMacを指定することもできます）
    
    1つのjobには複数のstepが指定でき、上記テンプレートでは5つのステップを実施しています。
    1. チェックアウト
    2. .NET Coreのセットアップ
    3. ライブラリのインストール
    4. ビルド
    5. テスト

    これでmasterブランチにpushした際にビルドとテストが実行されます。
    ![GitHub_Actions_3](https://dev-to-uploads.s3.amazonaws.com/i/uxbbj5rkrj6qp2k6fsr5.png)

2. ワークフローにフォーマットチェックを追加する
    フォーマッタには、[dotnet-format](https://github.com/dotnet/format)を使用します。
    dotnet-formatは[EditorConfig](https://editorconfig.org)に対応してるフォーマッタです。
    .editorconfigを.NETプロジェクトにおけばその設定内容でフォーマットしてくれます。
    .editorconfigファイルがない場合はデフォルト設定でフォーマットします。

    以下をテンプレートに追加します。
    ```
        - name: Install dotnet format
          run: dotnet tool install -g dotnet-format
        - name: format-check
          run: dotnet format --check --dry-run
    ```
    dotnet-formatのインストールは`dotnet tool`コマンドを使用します。
    フォーマットチェックは`dotnet format`コマンドにオプションとして`--check`と`--dry-run`を付与します。

    オプションの意味はそれぞれ以下です。
    `--dry-run`：フォーマットを実行しますが、結果を保存しません
    `--check`　：フォーマットが発生した場合に0以外の値を返却します

    GitHub Actionではrunで実行したコマンドが0以外の返却値を返すとエラーになります。これにより、フォーマットされていないものがpushされたらエラーとなり、フォーマット漏れを防ぐことができます。

    最終的なyamlファイルは以下になりました。
    ```
    name: .NET Core

    on:
      push:
        branches: [ master ]

    jobs:
      build:

        runs-on: ubuntu-latest

        steps:
        - uses: actions/checkout@v2
        - name: Setup .NET Core
          uses: actions/setup-dotnet@v1
          with:
            dotnet-version: 3.1.101
        - name: Install dotnet format
          run: dotnet tool install -g dotnet-format
        - name: format-check
          run: dotnet format --check --dry-run
        - name: Install dependencies
          run: dotnet restore
        - name: Build
          run: dotnet build --configuration Release --no-restore
        - name: Test
          run: dotnet test --no-restore --verbosity normal
    ```