7
7

More than 3 years have passed since last update.

C言語によるアジャイル開発とテスト駆動開発(CI入門) ~ 4.Jenkins導入 ~

Last updated at Posted at 2021-02-12

概要

これまでで、アジャイル開発に対するテスト駆動の必要性を解き、CUnitによるテスト実行の自動化、CMakeによるビルド工程の自動化を行ってきました。
本記事では、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とします。
空のリポジトリの作成が出来たら、今まで作ってきた環境を登録します。

Bash
$ tree
.
├── CMakeLists.txt
├── add
│   ├── include
│   │   └── add.h
│   └── src
│       └── add.c
├── main.c
└── test
    └── unitTest.c

この状態から、先程作ったリモートリポジトリを登録します。

Bash
git init
git add .
git commit -m "first commit"
git remote add origin [githubへのURL]
git push -u origin master

Jenkins導入

Jenkinsのインストール

Bash
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の管理をクリック
image.png

上段の右から2番目のプラグインの管理をクリック
image.png

利用可能 タブで git と検索し、チェック
image.png

同様に xUnit をチェック
image.png

同様に Cobertura をチェック
image.png

画面下部の ダウンロードして再起動後にインストール を押し、
インストール完了後、ジョブがなければJenkinsを再起動するにチェックを押します。
※上手く再起動出来ない場合があるので、一旦タブ消し、再度ログインしたりしてみてください。
image.png

再度ログイン後、同じ画面でインストール済みの箇所から先程インストールしたプラグインが表示されていればインストールは完了です
image.png

プロジェクト(ジョブ)の作成

Top画面に戻り、左上の新規ジョブ作成を押します。
image.png

プロジェクト(ジョブ)の名前にadd_sampleと入れ、フリースタイル・プロジェクトのビルドを選択し、OKを押します。
image.png

ソースコード管理で gitを選択し、リポジトリのURLにgithubのURLを入力します。
image.png

認証情報の追加を押し、gitHubのログインユーザー名とパスワードを入力します。
image.png

次に、ビルド・トリガのSCMをポーリングを選択し、* * * * *を入力します。
これは、SCM(Source Control Management ※今回はgitHub)をポーリング(定期的に問い合わせ)するということです。
gitHubがPushを受け取った際に、Jenkinsに知らせるイベントドリブン的なやり方もありますが、
これは、固定IPが必要になるのと、ルーターの設定等やらなければならないので今回はパスします。
image.png

次に、ビルドで、シェルの実行を選択し、下記のスクリプトを入力します。
ほとんどこれまでやってきたとおりですので、最後の行の箇所だけ説明します。
-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

image.png

一旦保存して下記の画面(以降プロジェクト画面と言う)に推移したら、ビルド実行を押して実行を確認しましょう。
するとビルド履歴が表示されます。青色であればビルドが成功しています。
image.png

エラーが出ている場合は、
ビルドの履歴部分(#1とか)をクリックし、ビルドの詳細に飛びます。
コンソール出力をクリックすると、コンソール画面が表示されますので、
この画面でどのようなエラーが出ているか確認しましょう。
image.png

プロジェクト画面に戻り、設定をクリックします。
一番下のビルド後の処理の追加でCoberturaカバレッジ・レポートの集計選択し、build/gcovr_report.xmlを入力します
(表示されない方:プラグインのインストール)
image.png

さらにビルド後の処理の追加からPublish xUnit test result report選択します
Report TypeCUnit-2.1(default)を選択し、Includes Patternからbuild/CUnitAutomated-Results.xmlを入力します
image.png

保存を押して、再度ビルド実行します。
ビルドの履歴部分をクリックし、ビルドの詳細に飛ぶと、
Cobertura カバレッジ・レポートテスト結果が表示されていると思います。
image.png

各々クリックすると下記の様な画面が出てきます。
image.png
image.png

これでJenkinsを用いてビルドの処理を自動化することが出来ました。

ついにテスト自動化

やっとここまで来ました。
ここまで読んでくれる人いるのか甚だ疑問。もはや一人舞台。

でももうひと踏ん張りです。
最後に、ローカルの環境でバグを治してgitHubにプッシュしましょう。
これまで通りの設定をしていれば、
1分以内にJenkinsがgitHubの更新を確認し、ビルドを行い、テストを実行し、テストレポートを吐いてくれます。

ではバグを治します。

add.c
#include <add.h>

// バグのあるadd関数(テスト対象)
int add(int x, int y) {
        return x + y; // ココ。return 0; から修正
}

gitHubに修正を登録します。

Bash
git commit -a -m "bug_fix"
git push

Jenkinsのプロジェクト画面を見張りましょう。
一分以内に新しいビルド履歴が表示されるはずです。
ついでに今回の バグフィックス でテスト結果の推移にも反映されていますね。
image.png

もちろん詳細を確認しても
image.png

おわりに

めでたしめでたし。
もし、間違いや指摘事項等あれば、コメントしていただけると大変助かります。

参考文献

JenkinsとGitHubのWebhook連携の整理
20年物のC言語で作られたシステムのテスト工程を改善しようとした話
開発者(個人)のためのJenkins - Git Plugin編

7
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
7