使用Jenkins自動部署博客

這篇文章比較簡單,適合初學持續集成的讀者,本文能夠幫助你對基於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

在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

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腳本里面寫了發送郵件的代碼,那不就實現了你一提交代碼,其餘人就收到郵件了嗎?

相關文章
相關標籤/搜索