概要
これまでで、アジャイル開発に対するテスト駆動の必要性を解き、CUnitによるテスト実行の自動化、CMakeによるビルド工程の自動化を行ってきました。
本記事では、Jenkinsとこれまでの成果を用いて、テスト工程を自動化していきます。
記事の全体像
- C言語によるアジャイル開発とテスト駆動開発(CI入門) ~ 1.概念 ~
- C言語によるアジャイル開発とテスト駆動開発(CI入門) ~ 2.CUnit導入 ~
- C言語によるアジャイル開発とテスト駆動開発(CI入門) ~ 3.CMake導入 ~
- C言語によるアジャイル開発とテスト駆動開発(CI入門) ~ 4.Jenkins導入 ~
環境
OS : Linux ubuntu 18.04.5 LTS
テストツール : CUnit 2.1-3
コンパイラ : gcc 7.5.0
ビルドツール:CMake 3.19.4
CIツール:Jenkins
CIツール
そもそもビルド自動化ツールとは
ソフトウェア開発のビルド、テスト、及びデプロイに関連する部分の自動化を支援し、継続的インテグレーション(CI)と継続的デリバリー(CD)を促進するためのツール。
これまでは、CMakeでビルドを自動化し、CUnitでテストを実行することができました。
では、誰がビルドを実際に行い、テストを実行し、報告してくれるのでしょうか?
そうです。__Jenkins__です。
CIツールでは、特定のイベントをトリガーにしてあらかじめ指定しておいた処理を実行する役割を担います。
代表的なツール
- Jenkins
- Travis CI
- Circle CI
など
SCM導入
Jenkinsを導入する前に、SCMを導入します。
ここではgithubを導入していきます。
詳細は説明省かせていただきますので、他を参照してください。
プライベートのリポジトリで、リポジトリ名をadd_sample
とします。
空のリポジトリの作成が出来たら、今まで作ってきた環境を登録します。
$ tree
.
├── CMakeLists.txt
├── add
│ ├── include
│ │ └── add.h
│ └── src
│ └── add.c
├── main.c
└── test
└── unitTest.c
この状態から、先程作ったリモートリポジトリを登録します。
git init
git add .
git commit -m "first commit"
git remote add origin [githubへのURL]
git push -u origin master
Jenkins導入
Jenkinsのインストール
sudo apt install openjdk-11-jdk
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins
[Jenkins][Ubuntu] UbuntuにJenkinsをインストール
こちらに則って、初期設定を行います。
プラグインのインストール
git, xUnit, Coberturaをインストールしていきます
ログインしてこのような画面が出るはずなので、__Jenkinsの管理__をクリック
画面下部の ダウンロードして再起動後にインストール を押し、
インストール完了後、ジョブがなければJenkinsを再起動するにチェックを押します。
※上手く再起動出来ない場合があるので、一旦タブ消し、再度ログインしたりしてみてください。
再度ログイン後、同じ画面で__インストール済み__の箇所から先程インストールしたプラグインが表示されていればインストールは完了です
プロジェクト(ジョブ)の作成
プロジェクト(ジョブ)の名前に__add_sample__と入れ、__フリースタイル・プロジェクトのビルド__を選択し、OKを押します。
ソースコード管理で __git__を選択し、リポジトリのURLにgithubのURLを入力します。
認証情報の追加を押し、gitHubの__ログインユーザー名とパスワード__を入力します。
次に、ビルド・トリガの__SCMをポーリング__を選択し、* * * * *
を入力します。
これは、SCM(Source Control Management ※今回はgitHub)をポーリング(定期的に問い合わせ)するということです。
gitHubがPushを受け取った際に、Jenkinsに知らせるイベントドリブン的なやり方もありますが、
これは、固定IPが必要になるのと、ルーターの設定等やらなければならないので今回はパスします。
次に、ビルドで、__シェルの実行__を選択し、下記のスクリプトを入力します。
ほとんどこれまでやってきたとおりですので、最後の行の箇所だけ説明します。
-r : ルートディレクトリ(gcovrはソースファイルを含む必要があるので、bulidフォルダの上の階層を指定する)
-x : XMLファイルを出力させる
-o : outputファイル名
です
echo TEST START
rm -rf build
mkdir build
cd build
cmake ..
cmake --build .
./UnitTest
gcovr -x -r .. -o gcovr_report.xml
一旦保存して下記の画面(以降プロジェクト画面と言う)に推移したら、__ビルド実行__を押して実行を確認しましょう。
するとビルド履歴が表示されます。青色であればビルドが成功しています。
エラーが出ている場合は、
ビルドの履歴部分(#1とか)をクリックし、ビルドの詳細に飛びます。
コンソール出力をクリックすると、コンソール画面が表示されますので、
この画面でどのようなエラーが出ているか確認しましょう。
プロジェクト画面に戻り、設定をクリックします。
一番下のビルド後の処理の追加で__Coberturaカバレッジ・レポートの集計__選択し、build/gcovr_report.xml
を入力します
(表示されない方:プラグインのインストール)
さらにビルド後の処理の追加から__Publish xUnit test result report__選択します
Report Type を __CUnit-2.1(default)__を選択し、__Includes Pattern__からbuild/CUnitAutomated-Results.xml
を入力します
保存を押して、再度ビルド実行します。
ビルドの履歴部分をクリックし、ビルドの詳細に飛ぶと、
__Cobertura カバレッジ・レポート__と__テスト結果__が表示されていると思います。
これでJenkinsを用いてビルドの処理を自動化することが出来ました。
ついにテスト自動化
やっとここまで来ました。
ここまで読んでくれる人いるのか甚だ疑問。もはや一人舞台。
でももうひと踏ん張りです。
最後に、ローカルの環境でバグを治してgitHubにプッシュしましょう。
これまで通りの設定をしていれば、
1分以内にJenkinsがgitHubの更新を確認し、ビルドを行い、テストを実行し、テストレポートを吐いてくれます。
ではバグを治します。
#include <add.h>
// バグのあるadd関数(テスト対象)
int add(int x, int y) {
return x + y; // ココ。return 0; から修正
}
gitHubに修正を登録します。
git commit -a -m "bug_fix"
git push
Jenkinsのプロジェクト画面を見張りましょう。
一分以内に新しいビルド履歴が表示されるはずです。
ついでに今回の バグフィックス でテスト結果の推移にも反映されていますね。
おわりに
めでたしめでたし。
もし、間違いや指摘事項等あれば、コメントしていただけると大変助かります。
参考文献
JenkinsとGitHubのWebhook連携の整理
20年物のC言語で作られたシステムのテスト工程を改善しようとした話
開発者(個人)のためのJenkins - Git Plugin編