C#でもUbuntu+Docker+Jenkins+GitBucket+MonoでCIしたい(CI編)

はじめに

前回はJenkinsとGitBucketの環境を構築しました。 今回は実際にJenkinsでビルドとテストを実行させてみましょう。

プロジェクトの作成

まずはCIをブンブン回すプロジェクトを作成します。

テストの実装及びJenkinsでのテストの実行のために

  • NUnit
  • NUnit.Runners

をNuGet経由でインストールし、リポジトリ直下のnugetディレクトにNuGetの実行ファイルを突っ込んでおきます。

というわけで今回使ったのがこちら。 なお、弊社はなんとなくGitHubリポジトリが不用意に増えるのが嫌なのでGitHubに上げてるのは汎用リポジトリに突っ込んじゃってますが、今回の内容ではHelloMonoCiが独立したリポジトリだと思って下さい。

github.com

GitBuckerリポジトリの作成

とりあえずリポジトリを作成して、先程作成したVisual Studioプロジェクトを突っ込んでおきましょう。

Jenkinsビルドジョブの作成

ジョブの作成からフリースタイル・プロジェクトのビルドを選択します。

設定画面ではとりあえずこんな感じに設定します。

f:id:jyuch:20161012220806p:plain

名前は自由で構いません。

f:id:jyuch:20161012220807p:plain

Monoはスレーブノードにしか(今回の構成では)インストールされていないので、スレーブノードで実行されるように実行ノードの制限はかけておきましょう。

f:id:jyuch:20161012220810p:plain

この辺は特にこれと言った注意点はありません。

f:id:jyuch:20161012220812p:plain

あとでweb hookを引っ掛けるので、Build when a change is pushed to GitBucketのチェックを入れておきましょう。

f:id:jyuch:20161012220750p:plain

この辺は好みでどうぞ。

f:id:jyuch:20161012220757p:plain

ビルドの最初のステップでNuGet経由でライブラリを復元します。

mono nuget/nuget.exe restore HelloMonoCi/HelloMonoCi.sln


f:id:jyuch:20161012220803p:plain

リリースビルドを実行します。

xbuild /p:Configuration=Release HelloMonoCi/HelloMonoCi.sln


f:id:jyuch:20161012220804p:plain

後続のテストリザルドパブリッシャー殿がNUnit3形式だと『無☆理』と言って死ぬので--result:TestResult.xml;format=nunit2を指定します。

mono HelloMonoCi/packages/NUnit.ConsoleRunner.3.4.1/tools/nunit3-console.exe \
    HelloMonoCi/HelloMonoCi.Test/HelloMonoCi.Test.csproj \
    "--config=Release" "--result:TestResult.xml;format=nunit2" 


f:id:jyuch:20161012220816p:plain

テストリザルドファイルを指定します。

サーバのローカルアドレス192.168.0.10だとかGitBucketのユーザがurikkだとかどうでもいい情報を全世界に垂れ流しつつ、とりあえずJenkinsはこれでokです。

GitBucker Web Hook

GitBucketのリポジトリに戻ってweb hookの設定をします。

f:id:jyuch:20161012224239p:plain

Payload URLにはhttp://192.168.0.10:8090/gitbucket-webhook/を指定して、あとはデフォルトで大丈夫です。

ここまで来ればもう終わり。あとはGitBuckerにプッシュするだけで優秀な執事がビルドとテストを回してくれます。

おわりに

まぁ、ふつーにWindowsでビルドサーバーを立てるかAppVeyorを使ったほうが圧倒的に楽ですね。 公開前に読み返して『これ何かの意味があるのかなぁ?』と頭を抱えています。

あと、全く関係がないのですが弊社は.NETの単体テストライブラリはMSTestしか使ったことがなく、またMSTestで事足りてたので他のライブラリを使うという発想自体がなく今までNUnitを触ったことすらなかったのですが、NUnitって良いですね。

特にTestCaseによるパラメータ化テストはMSTestには無い*1のでそのうち追加されたらいいな〜とおもいました。

おわり

*1:外部ライブラリを導入すれば同じようなことはできるっぽい