Skip to content

第 6 章: タスクランナーと CI/CD

6.1 はじめに

前章では静的コード解析ツールとコードフォーマッターを導入しました。テストの実行、静的解析、フォーマットチェックと、様々なコマンドを使えるようになりましたが、毎回それぞれのコマンドを覚えて実行するのは面倒です。

この章では タスクランナー を使ってこれらのタスクをまとめて実行できるようにし、さらに CI/CD パイプラインを構築します。

6.2 Cake によるタスク管理

Cake とは

Cake (C# Make) は C# の DSL で記述するクロスプラットフォームのビルドオーケストレーションツールです。ビルド、テスト、デプロイなどのタスクを C# のコードで定義できます。

Ruby の Rake、Java の Gradle、Rust の Makefile に相当します。C# 開発者にとっては、使い慣れた C# 構文でタスクを定義できるのが利点です。

Cake のインストール

# グローバルツールとしてインストール
$ dotnet tool install -g Cake.Tool

# またはローカルツールとして
$ dotnet new tool-manifest
$ dotnet tool install Cake.Tool

build.cake の定義

var target = Argument("target", "Default");

Task("Clean")
    .Does(() =>
{
    DotNetClean(".");
});

Task("Restore")
    .Does(() =>
{
    DotNetRestore(".");
});

Task("Build")
    .IsDependentOn("Restore")
    .Does(() =>
{
    DotNetBuild(".", new DotNetBuildSettings
    {
        NoRestore = true
    });
});

Task("Test")
    .IsDependentOn("Build")
    .Does(() =>
{
    DotNetTest(".", new DotNetTestSettings
    {
        NoRestore = true,
        NoBuild = true
    });
});

Task("Format-Check")
    .Does(() =>
{
    DotNetTool("dotnet format --verify-no-changes");
});

Task("Check")
    .IsDependentOn("Format-Check")
    .IsDependentOn("Build")
    .IsDependentOn("Test");

Task("Default")
    .IsDependentOn("Check");

RunTarget(target);

主要なタスク

タスク コマンド 説明
dotnet cake --target=Test Build → Test テスト実行
dotnet cake --target=Format-Check dotnet format --verify-no-changes フォーマットチェック
dotnet cake --target=Check Format-Check → Build → Test 全チェック実行
dotnet cake --target=Clean dotnet clean ビルド成果物の削除
dotnet cake Default (= Check) デフォルトタスク

実行例

# 全チェック実行
$ dotnet cake
========================================
Format-Check
========================================
========================================
Build
========================================
========================================
Test
========================================
成功!   -失敗:     0、合格:     7、スキップ:     0

6.3 GitHub Actions による CI/CD

CI/CD とは

CI/CD(Continuous Integration / Continuous Delivery)は、コードの変更を自動的にビルド、テスト、デプロイするプラクティスです。

ワークフローの定義

.github/workflows/dotnet-ci.yml にワークフローを定義します。

name: .NET CI

on:
  push:
    branches: [main, develop]
    paths:
      - "apps/dotnet/**"
      - ".github/workflows/dotnet-ci.yml"
  pull_request:
    branches: [main]
    paths:
      - "apps/dotnet/**"

permissions:
  contents: read

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout the repository
        uses: actions/checkout@v4

      - name: Setup .NET
        uses: actions/setup-dotnet@v4
        with:
          dotnet-version: '8.0.x'

      - name: Restore dependencies
        run: dotnet restore
        working-directory: apps/dotnet

      - name: Check formatting
        run: dotnet format --verify-no-changes
        working-directory: apps/dotnet

      - name: Build
        run: dotnet build --no-restore
        working-directory: apps/dotnet

      - name: Run tests
        run: dotnet test --no-build
        working-directory: apps/dotnet

CI パイプラインの流れ

Push / PR → restore → format --verify-no-changes → build → test → 結果通知

6.4 他言語との比較

言語 タスクランナー CI ツール テスト 静的解析 フォーマット
C# Cake GitHub Actions xUnit Roslyn Analyzers dotnet format
Rust Makefile GitHub Actions cargo test Clippy rustfmt
Go Makefile GitHub Actions go test golangci-lint gofmt
Java Gradle GitHub Actions JUnit Checkstyle + PMD Checkstyle
Python tox GitHub Actions pytest Ruff Ruff
Node npm scripts GitHub Actions Vitest ESLint Prettier

6.5 まとめ

この章では以下を実現しました。

項目 内容
Cake Build / Test / Format-Check / Check タスクを定義
dotnet cake フォーマットチェック → ビルド → テストを一括実行
GitHub Actions push / PR 時に自動で CI を実行
.NET SDK 統合 CI でも dotnet コマンドで環境を統一

第 2 部を通じて、ソフトウェア開発の三種の神器(バージョン管理、テスティング、自動化)を C# の開発環境に整備しました。次の第 3 部では、オブジェクト指向設計(class、interface、デザインパターン)に進みます。