這篇文章比較簡單,適合初學持續集成
的讀者,本文能夠幫助你對基於Jenkins的持續集成有一個比較全局的概念。html
爲了使用HTTPS,我將博客從GitHub Pages遷移到了個人服務器上。因爲博客基於Hexo,在遷移以前,個人工做流程是:git
本地寫Markdown格式文章->Hexo生成HTML並推送到GitHub->GitHub Pages自動使用最新內容
複製代碼
如今因爲Hexo渲染之後的HTML文件須要放到服務器上,那麼工做流程變爲:github
本地寫Markdown格式文章->Hexo生成HTML並推送到GitHub->手動登陸服務器
->進入放博客文章的文件夾->執行命令git pull
複製代碼
增長的兩步雖說操做量不大,可是總顯得很麻煩。因而我但願,在我把博客的HTML文件push到GitHub之後,服務器能自動從GitHub上把HTML內容拉下來。因爲使用了Nginx,因此只要博客的HTML發生了更新,那麼使用瀏覽器訪問kingname.info時,新內容自動就會出現。這樣一來,對我來講,看起來就像是我剛剛push了網頁內容到GitHub,博客就自動更新了。web
讓服務器從GitHub上面拉代碼,這個操做自己很簡單。人來操做就一行代碼git pull
。寫個Python腳本也就兩行代碼。但問題是,服務器怎麼知道GitHub發生了更新?shell
有人說,Kingname,你不是作爬蟲嗎?你寫個爬蟲,每一秒檢查一下GitHub不就能夠了嗎?這種辦法固然能夠。但問題是,我一週就更新一次博客,但這個爬蟲爲了等這一次更新,一週要訪問GitHub高達604800次?更況且我有時候一個月都不更新。瀏覽器
因此顯然不能讓服務器主動檢查GitHub更新,這種「輪詢」操做效率過低。那麼若是反過來,一旦GitHub有更新,它就通知服務器,而後服務器再去拉代碼,這不就簡單高效了嗎?bash
爲了實現這個目的,就須要使用一些持續集成的工具。本文使用的是Jenkins。服務器
Jenkins在敏捷開發界能夠說是大名鼎鼎了。使用Jenkins搭建一整套持續集成環境,能夠實現開發者往代碼倉庫一提交代碼,代碼自動進行單元測試,覆蓋率測試,代碼風格檢查自動生成報告,自動通知部門同事開始Code Review。當代碼被合併入主幹之後,服務器自動拉下最新代碼,自動編譯,自動在幾千幾萬臺服務器上部署。在整個過程當中,開發者只須要作一件事,那就是git push
(固然在實際狀況下,後面還會加一些參數)。hexo
本文實現的是博客的自動部署,沒有任何測試,也沒有Code Review,也沒有編譯,服務器也只有一臺,複雜程度固然遠遠低於持續集成。不過管中窺豹,來看看這個簡單地流程是如何走通的,對初學者也會有幫助。工具
本文假設你已經在服務器上面搭建好了Jenkins環境。若是你尚未安裝Jenkins或者不會安裝,那麼能夠「參考」這篇文章:搭建持續集成環境(一)。因爲這篇文章是18個月之前寫的,系統也是小衆的Arch Linux,因此建議你仍是在網上搜一下最新的Jenkins安裝教程比較好。
在GitHub中進入博客所在的Repo,並點擊Settings
,以下圖所示。
在設置頁面,單擊左側的Integrations & services
,並選擇Add service
,以下圖所示。
從下拉菜單中,選中Jenkins (GitHub plugin)
。在新打開的界面,填寫Jenkins的信息,以下圖所示。
其中Jenkins hook url
填寫的是個人服務器的Jenkins地址加上/GitHub-webhook/
,因此完整的地址爲http://xx.xx.xx.xx:8080/GitHub-webhook/
。把這裏的xx
換成實際的IP地址或者域名便可。須要注意的是,網址末尾的斜槓必定不能省略。
填寫好信息之後保存,GitHub就配置好了。
Jenkins須要安裝GitHub Plugin
才能接收到GitHub發來的通知。進入Jenkins的系統管理
-管理插件
,在可選插件
選項卡中,搜索GitHub plugin
並安裝,安裝完成Jenkins會重啓。重啓之後能夠在已安裝
選項卡下面發現GitHub plugin
,以下圖所示。
回到Jenkins首頁,單擊左上角新建
按鈕,新建一個項目,項目類型爲構建一個自由風格的軟件項目
。任務的配置信息以下圖所示。
其中的項目名稱
和描述
能夠隨意填寫。勾選GitHub project
,並把博客對應的GitHub Repo的地址填入。往下拉,看到源碼管理
,點選Git
,依然填寫博客對應的Repo地址。以下圖所示。
繼續往下拉,在構建觸發器
單擊增長構建步驟
,在彈出的下拉菜單中選擇Execute shell
。勾選GitHub hook trigger for GITScm polling
。在Execute shell
對應的輸入框中輸入命令,將當前目錄下的全部文件和文件夾所有複製到/home/bexercise/kingname.github.io/
文件夾下。以下圖所示。
其中,文件夾/home/bexercise/kingname.GitHub.io/
裏面的內容以下圖所示。這是Hexo生成的HTML文件和資源文件。
這裏須要解釋一下這一條命令:
cp -r ./* /home/bexercise/kingname.GitHub.io/
複製代碼
其中的cp -r
表示複製文件和文件夾。./
表示當前目錄。./*
表示當前目錄下面的全部內容。所以整條命令的意思是把當前目錄下的全部內容所有複製到/home/bexercise/kingname.GitHub.io/
下,而且若是文件名相同,就會直接覆蓋。須要注意的是,kingname.GitHub.io
這僅僅是一個普通的文件夾而已,別看它的名字長得像個網址,但其實它只是一個名字比較怪的普通文件夾而已,沒有什麼特殊的意義。
這個項目在構建的時候,它會自動從GitHub上面對應Repo全部的文件拉取到當前的文件夾下,因此執行了這一條複製命令之後,博客HTML文件天然就被複制到了網站的根目錄下。
因爲Jenkins在安裝的時候,會自動建立一個名爲jenkins
的普通帳號,這個帳號沒有管理員權限。jenkins執行命令的時候,它也會使用這個帳號。可是因爲kingname.GitHub.io
這個文件夾是用戶bexercise
建立的,因此jenkins
帳號默認是沒有權限讀寫這個文件夾的。如今須要給jenkins
帳號授予權限。使用bexercise
這個帳號登陸服務器,使用如下命令給jenkins
賦予權限,讓它能夠讀寫kingname.GitHub.io
文件夾:
sudo chown -R jenkins:jenkins /home/bexercise/kingname.GitHub.io
複製代碼
執行完成這一行命令之後,jenkins才能夠把其餘地方的文件複製到這個文件夾裏面。
沒有什麼複雜的使用方法,在Hexo中,執行命令hexo d
就能夠把本地生成好的HTML文件提交到GitHub中。而後打開瀏覽器,打開博客,發現新的文章已經出如今首頁了。
在Jenkins項目的執行歷史裏面,也能夠看到它被自動觸發而產生的歷史記錄。以下圖所示。
因爲Jenkins能夠運行Shell命令,進行單元測試本質上也是運行一條命令,那這不就能夠實現自動進行單元測試了嗎?那麼若是把Shell命令改爲運行一個Python腳本,那不就能夠作任何事情了嗎?若是Python腳本里面寫了發送郵件的代碼,那不就實現了你一提交代碼,其餘人就收到郵件了嗎?