1. はじめに
組込み開発でCIを導入したいと思っても、「設定が難しそう」「何から始めればいいの?」と感じる方は多いはず。実は、Armが提供するCIテンプレートプロジェクトを使えば、ほぼ設定なしでGitHub Actions+AVHによるビルド&テスト自動化を体験できます。
本記事では、Cortex-M向けのCIテンプレートをクローンして、GitHub Actionsで実際に動かす手順を紹介します。「組込み開発でもCIできる!」を最短ルートで試せる内容になっていますので、ぜひ触ってみてください。
ローカル環境でのビルド&デバッグについては、以下の記事を参照ください。
2. 今回の目標
本記事の目標は、CIが導入されたCortex-Mプロジェクトを使用し、ビルドとテストを自動実行することです。具体的には、以下のことができる状態を目指します。
- GitHubにコードをPushすると、自動でビルドが実行される
- Arm Virtual Hardware(AVH)上でテストが自動実行される
- 実行結果をGitHub Actionsのログで確認できる
この仕組みにより、手動でビルドやテストを行う手間を削減し、コードの品質を継続的に担保できます。「組込み開発でもCIできる!」を実感できる構成を紹介します。
3. 前提条件
本記事では、以下の環境と準備を前提とします。
使用するソフトウェア
- Visual Studio Code
- Git
必要なアカウント
-
GitHubアカウント
→ 無料プランでOK。GitHub Actionsが利用可能です。
動作環境
- OSは Windows / Linux / macOS いずれでもOK
→ 本記事の手順はOS依存しません(VSCodeとGitHub Actionsで完結)。
4. CI構成の概要
今回のCI構成は、GitHub ActionsとArm Virtual Hardware(AVH)を組み合わせて、Cortex-Mプロジェクトのビルドとテストを自動で実行する仕組みです。ここでは、全体像をイメージしやすいように構成要素と流れを整理します。
構成要素
-
GitHub Actions
→ GitHubが提供するCI/CDサービス。リポジトリにPushすると、定義したワークフロー(YAMLファイル)に従ってビルドやテストを実行します。 -
Arm Virtual Hardware(AVH)
→ Armが提供する仮想ハードウェア環境。実機を用意せずに、テストを自動で実行できます。 -
CIテンプレートプロジェクト
→ Arm公式のGitHubリポジトリ。ビルド&テストの設定があらかじめ組み込まれているため、ほぼ設定なしでCIを体験できます。
処理の流れ
-
コードをGitHubにPush
→ GitHub Actionsがトリガーされる。 -
ビルドジョブの実行
→ Cortex-Mプロジェクトをビルド。 -
テストジョブの実行
→ AVH上でテストを実行し、結果を取得。 -
結果の確認
→ GitHub Actionsのログでビルド&テスト結果を確認。
全体イメージ(図解イメージ)
この構成により、「コードをPushするだけでビルドとテストが自動で実行される」というCIの基本を、組込み開発でも簡単に体験できます。
5. 手順
5.1 リポジトリの作成
本記事ではGitHubのテンプレートから新たなリポジトリを作成して使用します。以下のページを開き、画面右上にある「Use this template」から「Create a new repository」を選択して作成します。ここでは、以下の設定でリポジトリを作成します。
| 項目 | 設定 |
|---|---|
| General: Repository name | AVH_CI_Test |
| Configuration: Choose visibility | Private |
リポジトリが作成されると、初回のビルド&テストが実行されて「Run failed」のメールが早々に2通届きます。この件の修正は後ほど行います。
5.2 リポジトリのクローン
今回はVSCodeからリポジトリのクローンを行います。VSCode画面左側のサイドバーで「ソース管理」を表示し、「変更」右側の三点リーダ(…)から「クローン」を選択します。画面上部に出る「GitHubから複製」をクリックするとGitHubアカウントで保有しているリポジトリが表示されますので、先ほど作成した「AVH_CI_Test」を選択してください。複製先は「C:\GIT」などを適宜選択してください。
本節の作業ではVSCodeからGitHubへのログインが要求されます。表示に従ってログインを行ってください。
AVH_CI_TemplateのクローンをVSCodeから開くと、環境によっては画面下部の「⚙️avh」が赤表示になります。この場合は、vcpkg-configuration.jsonを以下のように修正すると問題が解消されます。
"requires": {
- "arm:tools/open-cmsis-pack/cmsis-toolbox": "2.4.0",
+ "arm:tools/open-cmsis-pack/cmsis-toolbox": "2.12.0",
"arm:tools/kitware/cmake": "^3.31.5",
"arm:tools/ninja-build/ninja": "1.12.0",
"arm:compilers/arm/armclang": "6.22.0",
"arm:compilers/arm/arm-none-eabi-gcc": "^13.2.1",
"arm:models/arm/avh-fvp": "^11.22.39",
"arm:debuggers/arm/armdbg": "6.1.2"
}
5.3 basic.ymlの修正
初回のビルド&テストでのエラーを解消するために、エラーの要因を確認します。届いた2通のメールのうち「Compile and Run」と書いてあるほうを開いて、画面中ほどにある「View workflow run」をクリックしてください。表示されたSummary画面のAnnotationsには以下の項目が3つほど並んでいると思います。
❌ CI_test_run
repository'https://github.com/ユーザ名/AVH_CI_Test/'not found
設定ファイルを確認すると、リポジトリを参照する権限が足りていないようです。以下のように行を追加します。
permissions:
+ contents: read
actions: read
security-events: write
変更を保存したら、コミット&プッシュしてエラーが解消するか確認します。サイドバーの「ソース管理」を開き、basic.ymlの右側に出る「+」アイコンをクリックして変更をステージします。この状態で「コミット」をクリックするとコミットメッセージの入力ウィンドウが出るので、適宜入力してください。「#」で始まるコメント行は無視されます。
コミットを行うためには、Gitの「user.name」と「user.email」の設定が必要です。未設定の場合は以下のコマンドで設定してください。
git config --global user.name "ユーザ名"
git config --global user.email "メールアドレス"
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch main
# Your branch is up to date with 'origin/main'.
#
# Changes to be committed:
# modified: .github/workflows/basic.yml
#
+ basic.ymlの"permissions:"に"contents: read"を追加
変更を保存したら、入力ウィンドウは閉じてください。続いて「変更の同期」をクリックすると、変更内容がGitHubにプッシュされます。
5.4 main.cの修正
前節でのプッシュ後は、再度「Run failed」のメールが2通届きます。「Compile and Run」と書いてあるほうからリンクを開いてください。リポジトリが見つからないエラーについては解消されていると思います。次は以下のエラーについて確認します。
❌ Unity ► /home/runner/work/AVH_CI_Test/AVH_CI_Test/Project/main.c ► test_my_sum_fail: Project.avh.xml#L0
Failed test found in: Project.avh.xml Error: Test failed in /home/runner/work/AVH_CI_Test/AVH_CI_Test/Project/main.c at line 74: Expected 2 Was 0
この情報からでもコード修正はできますが、もう少し詳しく見ることにします。画面左側にあるJobsから「CI_test_run」をクリックしてください。表示された内容は、main.cの74行目、test_my_sum_fail関数内でテストがFailしたことを示しています。
---[ UNITY BEGIN ]---
/home/runner/work/AVH_CI_Test/AVH_CI_Test/Project/main.c:87:test_my_sum_pos:PASS
/home/runner/work/AVH_CI_Test/AVH_CI_Test/Project/main.c:88:test_my_sum_neg:PASS
- /home/runner/work/AVH_CI_Test/AVH_CI_Test/Project/main.c:74:test_my_sum_fail:FAIL: Expected 2 Was 0
/home/runner/work/AVH_CI_Test/AVH_CI_Test/Project/main.c:90:test_my_sum_zero:PASS
-----------------------
4 Tests 1 Failures 0 Ignored
FAIL
---[ UNITY END ]---
こちらの関数は、あえてFailが発生するように仕込んであります。今回は以下のように修正してエラーを解消します。
/* Failing test with incorrect summation value */
static void test_my_sum_fail(void) {
const int sum = my_sum(1, -1);
- TEST_ASSERT_EQUAL_INT(2, sum);
+ TEST_ASSERT_NOT_EQUAL(2, sum);
}
変更を保存したら、再度コミット&プッシュしてください。
+ main.cの"test_my_sum_fail"関数を修正
6. 動作確認
すべてのエラーが解消されている場合は、メールが送信されません。ここでは、GitHubのページからビルド&テストが正常終了したことを確認します。「AVH_CI_Test」リポジトリの「Actions」ページを開いてください。以下のような項目が2つ並んでいるのが確認できると思います。
✅ main.cの"test_my_sum_fail"関数を修正
Compile and Run #3: Commitハッシュ値pushed byユーザ名
2つ並んだ項目のうち、「Compile and Run」と書いてあるほうのタイトルをクリックしてください。画面左側にあるJobsから「CI_test_run」をクリックして表示された画面から「Excute」を展開すると、テストが正常に完了したことを確認することができます。
---[ UNITY BEGIN ]---
/home/runner/work/AVH_CI_Test/AVH_CI_Test/Project/main.c:87:test_my_sum_pos:PASS
/home/runner/work/AVH_CI_Test/AVH_CI_Test/Project/main.c:88:test_my_sum_neg:PASS
/home/runner/work/AVH_CI_Test/AVH_CI_Test/Project/main.c:89:test_my_sum_fail:PASS
/home/runner/work/AVH_CI_Test/AVH_CI_Test/Project/main.c:90:test_my_sum_zero:PASS
-----------------------
4 Tests 0 Failures 0 Ignored
OK
---[ UNITY END ]---
7. まとめ
CI(継続的インテグレーション)を導入することで、以下の効果が得られます。
- 品質向上:コード変更の自動ビルド・テストにより、早期に不具合を検出できる
- 開発効率の向上:手動ビルドやテストの負担が減ることで、開発作業に集中できる
- チーム連携の強化:ビルド・テスト環境の統一により、メンバ間の環境差異を解消
次のステップとしては、以下の拡張が考えられます。
-
CD(継続的デリバリー/デプロイ)への発展:
ビルド後の成果物を自動配布・デプロイする仕組み追加、リリースサイクルを短縮 -
ハードウェア実機テストへの統合:
AVHシミュレーションに加え実機を用いたテストを自動化、より現実的な検証実施
8. 参考リンク