JenkinsのLibvirt Slave Pluginを使ってみる

JenkinsのLibvirt Slave Pluginの使い方をまとめました。

SlaveはDebian 8です。


1 Libvirt Slave Pluginとは

Jenkinsはリモートマシンをテスト実行環境のSlaveとして使います。

libvirtで制御された仮想マシンも、ssh等でリモート接続できるならば、リモートマシンとしてSlaveとして使うことができます。

Libvirt Slave Pluginはlibvirtのインターフェースを使用して仮想マシンの起動と停止を制御します。

 

これにより、テスト実行時に仮想マシンを起動し、テスト終了時に仮想マシンを停止することが可能になります。

2 Libvirt Slave Pluginのインストール

Jenkinsのプラグイン制御画面からインストールします。

Jenkinsの管理 -> プラグインの管理 -> 利用可能

https://dl-web.dropbox.com/s/4g7a8hhvg91ulax/0001_LibvirtPlugin_Install.png

3 libvirt-binパッケージのインストール

libvirtが必要なのでlibvirt-binをインストールします。

$ sudo apt-get install -y libvirt-bin

virshでlibvirtの仮想環境に接続できるか確認します。

ここで接続できない場合は仮想環境側の設定を見直す必要があります。

今回はJenkinsとは別マシンのlibvirtのKVM仮想環境を用いるので、ssh経由で接続します。

$ virsh -c qemu+ssh://hiroom2@acer/system list
 Id    Name                           State
----------------------------------------------------
 161   debian-8-jenkins-test          running

4 ハイパーバイザの追加

システムの設定のクラウドからハイパーバイザを追加します。

Jenkinsの管理 -> システムの設定 -> クラウド

クラウドを追加し、高度な設定ボタンを押します。

 

Hypervisor Type ハイパーバイザーの種類(今回はQEMU)
Hypervisor Host ハイパーバイザーが動作するホスト名
Username ハイパーバイザーを操作するユーザ名
Concurrent Slaves Capacity 同時起動可能なSlaveの数
Native Credentials ssh接続時のユーザ名とパスワード

 

 

ssh接続の認証に公開鍵を用いている場合、Native Credentialsは不要です。

Test Connectionで接続を確認します。

  

https://dl-web.dropbox.com/s/duqtpg9kzjli899/0002_Hypervisor.png

5 Slaveの作成

ノードの管理画面から新規ノードを作成します。

Jenkinsの管理 -> ノードの管理 -> 新規ノード作成

ノード名を入力し、Slave virtual computer running on a virtualization platform (via libvirt)にチェックを入れます。

 

https://dl-web.dropbox.com/s/mkkhj3q723h77u8/0003_Node_Create.png

 

Libvirt Slave Pluginで追加される設定は以下の通りです。

その他の設定項目についてはLibvirt Slave Pluginを用いないノードと同様です。

 

Virtual Machine 制御する仮想マシン
Startup Idle 仮想マシン起動をウェイトする秒数
Time to Retry Startup ウェイトのリトライ回数
Shutdown Method 仮想マシンを停止する方法

 

Shutdown Methodについてはshutdownかsuspendをお勧めします。

これらは仮想マシンのacpidが受信します。

 

https://dl-web.dropbox.com/s/3bx4fw8nrwssvue/0004_Node_Setting.png

 

テスト実行時に仮想マシンを起動し、テスト終了後に仮想マシンを停止する為に、Availabilityを「要求時にはオンラインにし、待機中にはオフラインにする」にします。

 

要求時の遅延時間 仮想マシン起動までのウェイトを1分単位で設定
待機時の遅延時間 仮想マシン停止までのウェイトを1分単位で設定

 

待機時の遅延時間の最小値は1です。

 

https://dl-web.dropbox.com/s/5l4yjicbqmb8j8o/0005_Node_Availability.png

6 acpidの確認ダイアログ

電源ボタン押下のイベントを受信し、poweroffコマンドを実行します。

Ubuntu 14.04の場合、poweroffコマンドを即座に実行せずに確認ダイアログが表示されます。

これはJenkinsによるテスト終了時に仮想マシンを停止するという目的に反してしまします。

 

https://dl-web.dropbox.com/s/dli6ff4jcz9ekqe/0006_ACPID_CheckDialog.png

 

ログイン中に電源ボタンが押された場合の処理はgsetting等でできるようですが、ログイン画面が表示されている場合の処理はacpidの設定ファイルを修正する必要があるようです。

 

電源ボタン押下時にpoweroffコマンドを実行するようにacpidの設定ファイルを変更します。

本変更後、acpidの再起動が必要です。

$ diff -uprN /etc/acpi/events/powerbtn{.org,}
--- /etc/acpi/events/powerbtn.org       2015-06-22 04:54:31.193001314 +0900
+++ /etc/acpi/events/powerbtn   2015-06-22 04:54:52.102540555 +0900
@@ -10,4 +10,4 @@
 # of kernel changes.
 
 event=button[ /]power
-action=/etc/acpi/powerbtn.sh
+action=poweroff
$ /etc/init.d/acpid restart

7 ジョブの設定

テストを実行するノードをlibvirtで制御された仮想マシンに制限します。

 

https://dl-web.dropbox.com/s/mv1gm42r1f2qtk2/0007_Job_Setting.png

 

以上で設定は完了です。

仮想マシンを停止した状態でテストをスケジューリングすると仮想マシンが起動します。

しばらく時間が経つとテスト結果がJenkinsに反映され、仮想マシンが停止します。