DEV Community

birdsea
birdsea

Posted on

GitHub Actionsで.NETプロジェクトのフォーマットチェックを行う。

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月時点で日本の書籍はこれしかなさそう)を参考に実装しています。


  1. ワークフローを作成する
    GitHubのリポジトリのトップ画面のタブからActionsを選択します。
    GitHub_Actions_1

    テンプレートから.NET Coreを選択します。
    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

  2. ワークフローにフォーマットチェックを追加する
    フォーマッタには、dotnet-formatを使用します。
    dotnet-formatはEditorConfigに対応してるフォーマッタです。
    .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
    

Top comments (0)