轉自: http://blog.csdn.net/achuo/article/details/51086599
搭建jenkins實現自動化部署
Jenkins是一個非常有名的CI工具,開源、免費,通過jenkins我們可以更加智能、快速的持續集成,盡早的發現代碼里的問題並及時的部署上去。
Install Jenkins On Ubuntu
wget -q -O - https://jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add - sudo sh -c 'echo deb http://pkg.jenkins-ci.org/debian binary/ > /etc/apt/sources.list.d/jenkins.list'sudo apt-get update sudo apt-get install jenkins
打開http://localhost:8080如果看到Jenkins的首頁說明你已經安裝成功了。
更改端口
如果端口8080已經被占用,要修改配置文件來改變端口。
sudo vi /etc/default/jenkins
找到HTTP_PORT=8080
,把8080改為8000,然后
sudo service jenkins restart
新建任務
在左側欄選擇新建,填上名稱,選擇構建一個自由風格的軟件項目,點擊保存,進入到配置頁。這個頁面涵蓋了對這個任務的所有配置,有些復雜,下面會一一講解。
源碼管理
選擇Git, Repository URL里填上Github的地址,Credentials -> Add,填上Github的用戶名密碼。這個是Jenkins拉取源碼時需要的憑證。 "Branches to build"填上分支名,表示Jenkins將拉取該分支的源碼,后面觸發器也只針對該分支。
Github插件
“系統管理” -> "插件管理" -> "可選插件",搜索“Github plugin”,勾中,直接安裝。進入到插件安裝頁面,待安裝成功后,再次進入項目配置頁面。這時“構建觸發器”里應該多了一項“Build when a change is pushed to GitHub”,選中。接下來要去Github上配置hook。
登陸Github,在項目的settings -> Webhooks & Services -> Add Hook 里填上 http://jenkins_url/github-webhook/, 記住Content type一定要選擇“application/x-www-form-urlencoded”,否則是沒辦法正常工作的,secret不用填。
構建
在“構建”配置里,選擇“增加構建步驟”,選擇“Execute shell”,即可填寫你要執行的構建命令。對於Java項目,這里一般是Ant或Maven命令。對於我們項目,主要是執行shell命令。
依次增加如下構建命令:
npm installgrunt deploy
cd public/assets/javascript
gruntbin/migrate_database.sh
NODE_ENV=test bin/migrate_database.sh
以上按順序分別是安裝依賴包,編譯coffee,更新數據庫和model字段。再加上最后一步——測試:
NODE_ENV=test mocha --compilers coffee:coffee-script/register test/spec/**/*.coffee -R doc > test_result.html
這些命令可以放在一個里面,也可以分開放,但是順序一定要保持如此。尤其是最后一步。如果測試通過,構建結果就是成功;相反,構建會被標記為失敗。這決定了后面要說的構建后操作。
完成以上步驟后,已經實現了任務的自動構建,但是為了讓腳本能夠跑起來,還需要最后一步,即給jenkins用戶配置開發環境。
當apt-get install jenkins
后,系統就多了一個jenkins用戶,其主目錄在/var/lib/jenkins,jenkins也是以該用戶的身份在運行。所以在這個環境下,你當前登錄的用戶所配置的諸如npm grunt是無法在jenkins里正常使用的。所以必須先su jenkins
配置環境,在這之前可能你先要sudo passwd jenkins
來給jenkins設置一個密碼,並將jenkins用戶加到sudo列表以安裝npm。
做完以上配置之后,可以點擊“立即構建”測試一下構建過程是否正確。然后往github推送一次,看是否會觸發jenkins進行構建。確保以上都沒有問題后,做接下來的配置。
構建后操作
構建后操作分兩種情況:
-
構建成功后,將程序部署上去;
-
構建失敗后,發送通知郵件。
但是無論是部署程序還是發送郵件,在“增加構建后操作”里都找不到對應的選項。所以還需要安裝一些額外的插件。
按照上面所說的安裝插件的方法,安裝以下兩個插件:
-
Post build task
-
PostBuildScript
這兩個插件都是用來執行shell腳本的,不同的是Post build task插件可以根據不同的構建輸出做不同的動作,當前面構建失敗時,可以通過匹配失敗的輸出來執行發送郵件操作。
構建后操作 -> 增加構建后操作步驟 -> Post build task,在Log text里填上marked build as failure,這是構建腳本執行不成功時日志會輸出的一段文本。然后在Script里填上
coffee ~/mailer/mailer.coffee -f 石墨通知 -t chenxu@1heart.cn,a@1heart.cn -s "Jenkins Build Fail $BUILD_DISPLAY_NAME" -c $BUILD_URL -a test_result.html
這一段就是發送email的腳本,-a test_result.html
是讓郵件帶上測試結果作為附件。mailer.coffee是我用NodeJS寫的發送郵件的腳本。具體參數如下:
coffee ~/mailer/mailer.coffee -h
Usage: mailer.coffee [options]
Options:
-h, --help output usage information-V, --version output the version number-f, --from [value] 發件人名稱-a, --attachment <file> 附件路徑-t, --to [value] 收件人郵件地址, 如果有多個以,隔開-s, --subject [value] 郵件主題-c, --content [value] 郵件內容
mailer.coffee因為涉及到郵箱賬號密碼,暫時放在Github私人倉庫里。
勾上Execute script only if build success。這樣就實現了構建成功自動部署。以下是部署腳本:
# 備份用戶上傳的文件if [ -d "/var/lib/jenkins/shimo/public/uploads" ]; then cp -r /var/lib/jenkins/shimo/public/uploads/ /var/lib/jenkins/backups/fi# 刪除原本部署在pm2的程序rm -rf /var/lib/jenkins/shimo/# 將jenkins工作空間下構建好的版本復制出去cp -r /var/lib/jenkins/jobs/shimo/workspace/ /var/lib/jenkins/shimo/# 還原上傳文件cp -r /var/lib/jenkins/backups/ /var/lib/jenkins/shimo/public/uploads/# 建立軟鏈接rm /var/lib/jenkins/shimo/node_modules/shimo ln -s /var/lib/jenkins/shimo/ /var/lib/jenkins/shimo/node_modules/shimo# 部署到pm2pm2 startOrRestart processes.json
/var/lib/jenkins/jobs/shimo/workspace/
是jenkins自動構建的位置,這個位置就是項目根目錄,但是並不能直接把這個位置部署到pm2。原因是如果構建失敗,即使沒有重啟pm2,前端的html、js都已經更新並生效了。為了防止這個問題,每次構建成功后將項目拷貝到另一個路徑,在該路徑下部署。
完成以上配置后,就實現了項目的CI/CD。Jenkins非常靈活,以上步驟需要根據自己的實際情況做調整。