Pages

搜尋此網誌

2014年7月19日 星期六

jenkins CI 持續整合服務: 建置 script,以 nodejs 為例

jenkins CI 持續整合服務: 建置 script,以 nodejs 為例

jenkins 雖然方便,但他就像機器人,需要聰明的人類告訴他該怎麼做,若我們希望 jenkins 幫我們取出 source 並且進行編譯,編譯完成後將結果傳輸到 deploy target 主機,其實就是要幫 jenkins 設定好整個開發環境,必要套件,還有相關連線資訊。

上一篇 jenkins CI 持續整合服務: plugins 使用以 node.js 為例,大致說明了在整個建置流程會用到的 plugin,此篇要說明實際上的需要自行撰寫的 script

整個過程分兩個部分,jenkins 中的編譯打包,以及 jenkins 外的運行主機環境,首先我們先從 jenkins 中開始。

環境建置 > 編譯 > 打包

gem install bootstrap-sass
gem install compass
npm cache clean
npm install
grunt prod-build
# npm test
tar cvf myProject.tar .

因為使用 plugin 我們就可以把需要安裝的套件,比如:nodejs、npm、grunt 以及 ruby 安裝完成,所以我們的建置 script 非常精簡。

  • gem install ... : 使用 gem 我們可以安裝相關的 ruby 套件,因為專案的建置流程中,使用到 bootstript scss,所以需要相關套件進行編譯。
  • npm cache clean:筆者遇到過版本衝突問題,為了一勞永逸每次編譯都將 cache 清除
  • npm install: 安裝專案定義於 package.json 中的套件
  • grunt prod-build: 相關所需套件安裝完成後,我們就可以透過之前已在 grunt 定義的 prod-build (production build) 執行該 task,完成整個編譯動作,以筆者專案為例有 coffee、jade、scss 的編譯,還有 concat、uglify 在這步驟完成。
  • npm test: 若專案有寫 test case 在編譯完成後可在進行 test 確保程式的運作正常。
  • tar cvf MyProject.tar .: 最後將結果打包成 jar。

在 jenkins 的環境內,基本上可以把它想像成你個人的開發環境來使用,所以相關的 script 若要快速驗證,最好在你的電腦中確認運行結果後再放到 jenkins 上運行,才能事半工倍。

另外,在安裝相關套件時,不要有任何需要人員判斷決定套件版號的地方,該判斷會造成自動化過程被終止,相關測試都可以在本機進行,假設真的有需要決定版號,不管是 npm 或是 bower 都有可以定義首選版號的地方。

在建置 jenkins 的建置 task 時,也建議分段驗證,實際編譯流程中,因為每次都會自動建置所有的環境,取出相關的程式,畢竟不比自己的開發環境,所以每次的過程會較花時間,若整個編譯到打包的過程確認沒問題,我們可以進入下一步驟,打包結果傳送到遠端主機,進行每日或每天備份,並且將服務更新為最新的程式碼。

傳送壓縮檔 > 關閉服務 > 更新程式碼 > 啟動服務

在開始之前需要先知道,整個自動化過程不會有人員介入,故請設定好相關的 ssh key 確保相關程序不會需要驗證輸入。

傳送編譯完成的壓縮檔,同樣可參考上一篇 jenkins CI 持續整合服務: plugins 使用以 node.js 為例,中的 Publish Over SSH 的套件,相關的指令也是透過該套件定義,如下:

# 設定環境變數
export PATH=~/node_modules/.bin:~/.nvm/v0.10.22/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

# 停止服務
service forever-stage-user stop

# 解壓縮並且更新程式碼,$BUILD_ID 將由 jenkins 替換完成
rm -rf /var/www/nodejs/myPoject
mkdir ~/build/$BUILD_ID/myPoject
tar xvf ~/build/$BUILD_ID/myPoject.tar -C ~/build/$BUILD_ID/myPoject
mv ~/build/$BUILD_ID/myPoject /var/www/nodejs/myPoject

# 寫入建置版本資訊
sed "s/_BUILD_ID_/$BUILD_ID/g;s/_BUILD_NUMBER_/$BUILD_NUMBER/g;s/_BUILD_VERSION_/STAGE/g" /var/www/nodejs/local.coffee > /var/www/nodejs/myPoject/config/local.coffee


# 重新啟動服務
service forever-stage-user start

會需要設定環境變數,是為了避免不同主機環境有所不同,在執行此步驟之前,請記得相關的套件安裝還有權限設定。

其中如果你的 CI server 可被你的 service server 存取的話,你可以直接透過下列網址取得建置的資訊:http://$host/job/$jobname/lastSuccessfulBuild/api/json

如此就完成整個 CI 的建置,其實不難,雖然第一次會很花時間,但之後所省下的時間,絕對值得你投資,還在手動建置嗎?趕快幫你的團隊或是你自己做一個免錢又自動的管家 jenkins 來為你們沒日沒夜的工作!

CI 建立完成後的延伸閱讀:導入快速開發,打造出上等程式品質

張貼留言