簡介
虛擬機有很多好處,不僅僅節省硬件資源,而且還可以快速切換系統環境,顯然會在軟件開發中起到極大作用。
在《持續交付》第十一章(11.7.1)中就提到了虛擬機環境的管理。如下圖
它描述的是在你的持續集成的Jenkins CI服務器(以下簡稱jenkins)中,需要各種服務器來測試一個應用。我們可以快速的從虛擬機的VMM模板庫中,啓動需要的各種類型虛擬機,而不是每個都重新安裝(省時),完成測試,產生報告後,也快速消失(省錢)。
讓我們一起來看看一種漂亮的實現方案vagrant+jenkins實現技巧。
基本知識
vagrant
不同的虛擬機技術(virtualbox,vmware,xen/kvm等等)可能用不同的方法管理,vagrant是virtualbox的前端,它簡化了virtualbox虛擬機的操作,而且增加了對自動化(provisioning)的puppet/chef的支持,這裏就不詳細介紹。vagrant的入門介紹已經很詳細了,有一篇博客也可以借鑑一下。
你要知道的就是下面的幾個命令
$ cd ubuntu1104-vm # 進入已有的 ubuntu 11.04 虛擬機目錄
$ vagrant up # 啓動 ubuntu 虛擬機
$ vagrant ssh -c "pwd"
/home/vagrant
$ vagrant halt # 停止虛擬機
jenkins CI
jenkins 是一個最常用的持續集成服務器,可單獨運行或者放在Web服務器中運行。
直接啓動一個任務(jenkins job)去調用vagrant操作虛擬機不是一個很好的方式,因爲啓動jenkins的用戶(如tomcat)的權限都比較小,以防止任務誤操作。
幸好jenkins有個超級棒的主從模式(master/slave)來解決。
方案搭建
建立vagrant用戶
最好先在一個機器上(可以和jenkins主機不在一起)創建一個vagrant用戶,建立一套vagrant的用戶環境。
因爲無密碼訪問,所以要配好ssh環境,我們可以重用vagrant虛擬機的公私密鑰,如下面的 IdentityFile就是私鑰。
vagrant@host:~/vm/ubuntu1104$ vagrant ssh_config
Host default
HostName 127.0.0.1
User vagrant
Port 2222
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /var/lib/gems/1.8/gems/vagrant-0.8.7/keys/vagrant
IdentitiesOnly yes
把公私密鑰拷到vagrant用戶的.ssh目錄下。
vagrant@host:~$ mkdir .ssh
vagrant@host:~$ cp /var/lib/gems/1.8/gems/vagrant-0.8.7/keys/vagrant .ssh/id_rsa
vagrant@host:~$ chmod 600 .ssh/id_rsa
vagrant@host:~$ cat /var/lib/gems/1.8/gems/vagrant-0.8.7/keys/vagrant.pub >> .ssh/authorized_keys
jenkins slave設置
然後到jenkins主機的 系統管理->管理節點->新建節點 來增加vagrant虛擬機節點,如下圖。
例子中,vagrant節點和jenkins主機在一臺機器上,所以是localhost,配好了私有密鑰,並且設置標籤爲vagrant-vm
jenkins 任務設置
現在可以設置新的任務了,選定自由風格(freestyle),如下圖
限定它去vagrant-vm去執行,到時它就會觸發jenkins從機(slave)的啓動。
然後設置一個構建內容,就是啓動虛擬機,執行命令(真實情況會用puppet安裝,並進行測試)。
最後就可以讓它跑起來。
總結
這篇文章主要簡單講了一下在jenkins中管理虛擬機的一種方案,自動化的安裝puppet並沒提到,可自己嘗試。另外vagrant創立虛擬機也沒有談到,一般可以用veewee這個軟件來完成,有空下次講。
參考
- larry的英文博客:http://codeslife.com/2011/10/21/make-ci-easier-with-jenkins-ci-and-vagrant/
- stackoverflow的問題討論:How to combine Vagrant with Jenkins for the perfect Continuous Integration Environment?
轉載自持續交付。