こんにちは!日々、コードと向き合い、より良い開発環境を追い求めているあなたへ。
「ローカルのWindows環境では完璧に動くのに、GitHubにプッシュしてCI(継続的インテグレーション)を回すと、なぜかビルドが通らない……」
そんな悔しい経験をしたことはありませんか?特にWindows向けのネイティブバイナリ(`.exe`や`.dll`)をクロスプラットフォームでビルドしようとすると、Linuxのようにはいかず、頭を抱えるポイントがたくさんありますよね。
今回は、世界中のエンジニアが愛用する最強のツール群、「GitHub Actions」×「MSYS2 / MinGW-w64」を組み合わせて、Pull Requestを送るたびに自動でビルドとテストが走る堅牢なCI環境を作る方法を解説します。
これをマスターすれば、もう「手元のPCでしか動かない不安」から解放されますよ。さあ、一緒に最高の自動化世界へ足を踏み入れましょう!
—
なぜこの組み合わせが必要なのか?(ツールの本質を理解する)
まずは、今回使用する主役たちの正体を軽く整理しておきましょう。ここを理解しておくと、トラブルシューティングの精度が劇的に上がります。
- MinGW-w64: Windows上で動く、GCC(GNU Compiler Collection)の64ビット(および32ビット)対応版です。LinuxでおなじみのGCCの強力な最適化や構文チェックを、そのままWindowsネイティブ環境に持ち込めます。
- MSYS2: Windows上でLinuxライクなシェル環境(Bashなど)や、パッケージ管理システム(`pacman`)を提供する素晴らしいプラットフォームです。MinGW-w64用のツールチェーンやライブラリ(SDL2やOpenSSLなど)を、コマンド一発で安全にインストール・管理できるようにしてくれます。
- GitHub Actions: コードの変更を検知して、クラウド上の仮想マシンで自動的にビルドやテストを実行してくれるGitHub公式のCI/CD機能です。
WindowsのGitHub Actions標準ランタイム(`windows-latest`)には、デフォルトでは本格的なC/C++のコンパイラ環境がフルセットで入っていません。そこで、「MSYS2を自動でセットアップし、その中でMinGW-w64をインストールしてビルドする」というパイプラインを組むのが、最も確実でモダンなアプローチなのです。
—
基礎セットアップ:GitHub Actionsワークフローの全体像
それでは早速、実際のコードを見ていきましょう。
プロジェクトのルートディレクトリに `.github/workflows/build.yml` というファイルを作成し、以下のYAMLコードを記述してください。
この設定ファイルは、あなたが「Pull Requestを作成した瞬間」や「`main`ブランチにコードをマージした瞬間」に自動発火し、Windows環境でコードのビルドとテストを実行してくれます。
ワークフローの名称(GitHubのActionsタブに表示されます)
name: Windows CI with MinGW-w64
どのようなトリガーでこのワークフローを動かすかを指定します
on:
push:
branches: [ “main”, “master” ]
pull_request:
branches: [ “main”, “master” ]
ジョブの定義(今回はWindows環境を1つ指定します)
jobs:
build-and-test:
name: Build on Windows (MinGW-w64)
runs-on: windows-latest # 最新のWindows仮想環境を使用
defaults:
run:
# GitHub ActionsデフォルトのPowerShellではなく、MSYS2の環境(Bash)をデフォルトシェルとして使用する指定
shell: msys2 {0}
steps:
# 1. リポジトリのソースコードを仮想環境にチェックアウト
- name: Checkout Repository
uses: actions/checkout@v4
# 2. MSYS2環境のセットアップ(公式が提供する安定したアクションを使用)
- name: Setup MSYS2
uses: msys2/setup-msys2@v2
with:
msystem: MINGW64 # 64ビットのMinGW環境を指定
update: true # 起動時にパッケージデータベースを自動更新
install: >- # 必要なツールを一括インストール
git
mingw-w64-x86_64-toolchain
make
# 3. ツールチェーンが正しく入ったか、バージョン情報を確認(デバッグ用)
- name: Check Toolchain Versions
run: |
echo “=== GCC Version ===”
gcc –version
echo “=== Make Version ===”
make –version
# 4. 実際のビルド処理
- name: Build Project
run: |
echo “Building the project…”
# ここに実際のビルドコマンド(例: Makefileを使う場合)を記述します
# 例: make release
make all
# 5. 自動テストの実行
- name: Run Tests
run: |
echo “Running automated tests…”
# ビルド成果物のバイナリを実行してテストを行う
./bin/my_app_test.exe
—
コードの細部を徹底解説:なぜこの書き方が必要なのか?
上記のYAMLには、長年のCI運用から得られた「現場の知恵」が詰まっています。特に重要なポイントをいくつか解説します。
1. シェルを `msys2 {0}` に指定する意味
通常、GitHub ActionsのWindows環境では `pwsh` (PowerShell) が使われます。しかし、MinGW-w64のツール群やMakeなどのビルドツールは、Linuxのシェル環境(Bash)やパスの解釈を前提としていることが多いです。
`defaults.run.shell: msys2 {0}` を宣言することで、これ以降の `run` ステップがすべて自動的にMSYS2のBash上で実行されるようになり、OS間のパス区切り文字(`\` と `/`)の差異によるバグを防げます。
2. `msys2/setup-msys2@v2` の賢い使い方
`install: >-` のブロックに注目してください。ここで `mingw-w64-x86_64-toolchain` を指定するだけで、GCC、G++、GDB、MakeといったC/C++開発に必要なすべてのツールが、依存関係を含めて自動で裏側で構築されます。
手動でインストーラーをポチポチ押す必要は一切ありません。数秒でクリーンな開発環境がクラウド上に爆誕します。
—
精度高い「Hello World」的な動作確認の構築
設定ファイルができたら、実際に動作確認をしてみましょう。
形だけの確認ではなく、「ちゃんとコンパイルされ、テストが通り、異常時にはCIがしっかり失敗する」ことを確かめられる、完璧な最小構成を組んでみます。
プロジェクトのディレクトリ構成
リポジトリのルートに、以下のようなファイルとフォルダを配置してください。
my-windows-project/
├── .github/
│ └── workflows/
│ └── build.yml
├── Makefile
├── src/
│ └── main.c
└── test/
└── test_main.c
1. ソースコード (`src/main.c`)
まずはシンプルなプログラムです。
include
int add(int a, int b) {
return a + b;
}
int main() {
printf(“Hello, MinGW-w64 on GitHub Actions!\n”);
printf(“2 + 3 = %d\n”, add(2, 3));
return 0;
}
2. テストコード (`test/test_main.c`)
簡単なアテスト(検証)を行うコードです。意図的に結果が一致するかを確かめます。
include
include
// main.cにある関数をテストするために宣言
int add(int a, int b);
void test_add() {
printf(“Running test_add…\n”);
assert(add(2, 3) == 5);
assert(add(-1, 1) == 0);
printf(“All tests passed successfully!\n”);
}
int main() {
test_add();
return 0;
}
3. ビルド制御ファイル (`Makefile`)
MSYS2環境の `make` コマンドで実行されるレシピです。
CC = gcc
CFLAGS = -Wall -O2
all: directories bin/my_app.exe bin/my_app_test.exe
directories:
mkdir -p bin
bin/my_app.exe: src/main.c
$(CC) $(CFLAGS) src/main.c -o bin/my_app.exe
bin/my_app_test.exe: test/test_main.c
$(CC) $(CFLAGS) test/test_main.c -o bin/my_app_test.exe
clean:
rm -rf bin
—
実際に動かしてみよう!
1. 上記のファイルをすべて作成し、GitでコミットしてGitHubにプッシュ(またはPull Requestを作成)します。
2. ブラウザでGitHubリポジトリを開き、「Actions」タブをクリックしてください。
3. ワークフローが走り出し、MSYS2のインストール、GCCのバージョン確認、そして `make` によるビルドとテストの実行がログとしてリアルタイムに流れていきます。
すべてが緑色のチェックマーク(Success)で完了した瞬間、あなたのプロジェクトには「Windows環境でいつでも正しく動くことが保証された、プロ仕様の自動テスト基盤」が手に入っています!
—
おわりに:毎日のコーディングが劇的に楽になる未来へ
今回は、GitHub ActionsとMinGW-w64、そしてMSYS2を組み合わせて、Windows向けの堅牢なCI環境を構築する方法を解説しました。
最初は設定ファイルの記述に少し戸惑うかもしれませんが、一度この仕組みを作ってしまえば、
- 「自分のローカル環境を汚さずに、クリーンな状態でビルド確認ができる」
- 「うっかりコンパイルエラーやテスト落ちしたコードを主幹ブランチに混ぜてしまうミスがゼロになる」
- 「Windowsユーザーの利用者に向けて、常に最新のビルド成果物を自信を持って届けられる」
といった、エンジニアにとって計り知れないほどの安心感と開発効率の向上をもたらしてくれます。
これをベースに、今後はバイナリのアーティファクト保存(`actions/upload-artifact`)などを組み合わせれば、リリース自動化への道もすぐそこです。
あなたの開発ライフが、より快適でエキサイティングなものになりますように。それでは、また次の技術でお会いしましょう!