Jenkins是一個很是有名的CI工具,開源、免費,經過jenkins咱們能夠更加智能、快速的持續集成,儘早的發現代碼裏的問題並及時的部署上去。javascript
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的首頁說明你已經安裝成功了。html
若是端口8080已經被佔用,要修改配置文件來改變端口。前端
sudo vi /etc/default/jenkins
找到HTTP_PORT=8080
,把8080改成8000,而後java
sudo service jenkins restart
Jenkins默認無需登陸即擁有全部權限,這確定是極不安全的。這裏簡單的配置一下,讓用戶登陸後才能夠操做。node
配置後的最終結果截圖:nginx
在Jenkins左側欄裏點擊「系統管理」,而後「Configure Global Security」,勾上「啓用安全」。在安全域裏選擇「Jenkins專有用戶數據庫」,並勾上「容許用戶註冊」。保存後進入首頁註冊一個帳號,譬如咱們這裏註冊一個叫jenkins的用戶。而後回到剛纔的配置頁面,在「受權管理」裏選擇「項目矩陣受權策略」,將jenkins用戶添加到用戶組,並在jenkins那一行勾上「Administrator」,取消「匿名用戶」的全部受權。最後,取消容許用戶註冊,點擊保存。這樣一來,就只能用jenkins帳號登錄才能作後續操做。git
在左側欄選擇新建,填上名稱,選擇構建一個自由風格的軟件項目,點擊保存,進入到配置頁。這個頁面涵蓋了對這個任務的全部配置,有些複雜,下面會一一講解。github
選擇Git, Repository URL裏填上Github的地址,Credentials -> Add,填上Github的用戶名密碼。這個是Jenkins拉取源碼時須要的憑證。 "Branches to build"填上分支名,表示Jenkins將拉取該分支的源碼,後面觸發器也只針對該分支。web
表示在什麼狀況下構建項目,若是選擇「Poll SCM」,而後在日程表裏填上cron表達式,例如"H/5 * * * *",表示每5分鐘檢查一次,有代碼變動就構建項目。這裏咱們不選Poll SCM,而是用Gitub插件來作到實時構建。sql
「系統管理」 -> "插件管理" -> "可選插件",搜索「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 a set of scripts,在Command裏填上部署腳本,並勾上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很是靈活,以上步驟須要根據本身的實際狀況作調整。