sh1’s diary

プログラミング、読んだ本、資格試験、ゲームとか私を記録するところ

C# .NET で試してみる CI/CD の CI (GitHub Actions)

プログラムを書く際や書いた後、CI/CD を利用/設定することは重要です。CI とは continuous integration(継続的インテグレーション)のこと、CD とは continuous delivery(継続的デリバリー)または continuous deployment(継続的デプロイメント)のことを表します。

個人的に特に重要だと思うのは、CI の要素です。(というより CD の前提条件だし)

頑張ってテストコードを書いても、だんだんとテストを実行しないようになってしまうと、問題があります。そこで、自動的にテストを実施してくれる CI を利用しておくと、ソフトウェアの品質を守りやすくなります。

CI のやり方と基本をメモ。今回は GitHub Actions の workflows を利用しました。

GitHub Actions - workflows

CI を実装するために利用する GitHub Actions は、設定ファイル (.yml) に記述した単純なワークフローを自動的に実行してくれるサービスみたいなものです。個人利用で public リポジトリーは無料で利用することができます。private リポジトリーの場合は毎月決まった時間と容量だけ無料で利用することができます。使い切った場合は、workflow が(当月については)実行されないみたいです。

ちなみに、ワークフローを実行する仮想サーバーのことをランナーと呼びます。

A runner is a server that runs your workflows when they're triggered.

ランナーが実行するワークフローの一種で、「テストの実施」を表現できます。そこで、

  • GitHub の master に push があったら(+pull request があったら)
  • 自動的にテストを実行する(NUnit テストプロジェクトを実行する)

という .yml 設定ファイルを作成してみます。

補足すると、すこし前の頃だと、CI/CD というと appveyor を使うことが多かったと思います。現在はほとんどのケースで GitHub 標準の Github Actions で(間に合うため)利用することが多いと思います。

リポジトリーに Actions (workflow) を追加する

ブラウザで GitHubリポジトリーを開いて Actions の項目を選択します。C# のプロジェクトの場合は、「.NET」or「.NET Desktop」を選択します。この時点で設定ファイル (.yml) のテンプレートを用意してくれています。

はじめて使うときは、焦らずに設定ファイルをどのように読めばいいのか整理しながら進めましょう。とても重要です。「.NET Desktop」のファイルを読み解いてみると:

  • (env でグローバルな環境変数の作成)
  • テストの実行
  • windows application packaging の実行(+アップロード)

ざっくりと、こんな感じの job が登録されているのではないかと思います。とりあえずの CI だけなら、以下の内容でよいと思います:

  • (env でグローバルな環境変数の作成)
  • windows application packaging 用の認証取得
  • テストの実行
  • windows application packaging の実行(+アップロード)

どちらにしても、修正が必要な設定ファイル(のテンプレート)ですが、テストだけ実行する内容に修正してみます。

今回はテストプロジェクトとして個人利用しているライブラリー「HeritageLibrary」を利用しました。

name: .NET Core Desktop

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:

  build:

    strategy:
      matrix:
        configuration: [Debug, Release]

    runs-on: windows-latest  # For a list of available runner types, refer to
                             # https://help.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idruns-on

    env:
      Solution_Name: HeritageLibrary.sln
      Test_Project_Path: HeritageLibrary.Test\HeritageLibrary.Test.csproj
      
    steps:
    - name: Checkout
      uses: actions/checkout@v3
      with:
        fetch-depth: 0

    # Install the .NET Core workload
    - name: Install .NET Core
      uses: actions/setup-dotnet@v2
      with:
        dotnet-version: 6.0.x

    # Add  MSBuild to the PATH: https://github.com/microsoft/setup-msbuild
    - name: Setup MSBuild.exe
      uses: microsoft/setup-msbuild@v1.1

    # Execute all unit tests in the solution
    - name: Execute unit tests
      run: dotnet test $env:Test_Project_Path

    # Restore the application to populate the obj folder with RuntimeIdentifiers
    - name: Restore the application
      run: msbuild $env:Solution_Name /t:Restore /p:Configuration=$env:Configuration
      env:
        Configuration: ${{ matrix.configuration }}

短い内容になりました。画像で(ファイルを)補足すると、こんな感じのプロジェクトです。

うまく動かなくて、GitHub Actions をとりあえず正しく動かしたいなら、こんな設定ファイルでどうか。

name: Learn github actions
on: [push]
jobs:
  check-bats-version:
    runs-on: ubuntu-latest
    steps:
      - run: echo "hello github actions"

とにかく Actions がわからないなら、動かそう。一度動いて、パラメーターを読み解くことが大切だと思う。

シフト JIS で記述されたファイルはバグる

テストを実行したときにありがちなのは、テストプロジェクトの .cs ファイルで使用されている文字コードが「シフト JIS」であることがあります。

これをすると、見事にバグります。

.cs ファイルを開いてテキストエンコーディングを「UTF-8」変更します。最近はメモ帳でも文字コードを変更できると思います。うまく修正できました。

バッジの追加

ちゃんと CI をしているリポジトリーはエラいのです。褒め称えられるべきなのです。みんなにエラいの分かってもらえるように、README にバッジを設定するテキストを追加しましょう。

これで、コード品質を保つ努力をしていると示すことができました。

参考