前端整理學(xué)習(xí)的技術(shù)點(diǎn)有很多退敦,個(gè)人喜歡以markdown筆記的形式記錄诅岩,方便查閱。
本篇就介紹/記錄下應(yīng)用gitbook芒炼、nodejs、github hooks在服務(wù)器配置能自動(dòng)同步的學(xué)習(xí)筆記术徊。
具體涉及的點(diǎn)包括:
- 介紹gitbook的簡(jiǎn)單使用
- 在服務(wù)器上配置靜態(tài)資源站點(diǎn)
- 配置github hooks
- 配置hooks所需的腳本
gitbook的介紹
gitbook 是一個(gè)寫作工具本刽,我們通過安裝它的命令行工具 gitbook-cli 可以方便地將markdown文件生成靜態(tài)html。
安裝后如下幾個(gè)命令基本可以滿足需求:
-
gitbook init
: 在當(dāng)前文件夾初始book赠涮,包含_book
文件夾用于輸出html子寓,SUMMARY.md
代表了入口 -
gitbook serve
: 會(huì)在本地啟動(dòng)一個(gè)web服務(wù)器,修改了目錄下的文件會(huì)自動(dòng)觸發(fā)刷新 -
gitbook build
: 將markdown文件生成html后打包到_book
書寫好的markdown文件笋除,經(jīng)過gitbook serve
或gitbook build
后斜友,就可以提交到在github新建的倉(cāng)庫(kù)了,比如:https://github.com/tangyefei/courses
垃它。
服務(wù)器配置
在自己的服務(wù)器上安裝git
鲜屏,并拉取項(xiàng)目烹看;然后安裝nginx
,將指定訪問地址指向到自己的clone
的項(xiàng)目文件夾下的_book
即可訪問(nginx
會(huì)默認(rèn)去該文件夾下找index.html
文件)洛史。
github hooks
github hooks簡(jiǎn)單來(lái)說就是Github提供鉤子惯殊,能根據(jù)你的一些動(dòng)作,來(lái)做一些響應(yīng)也殖。
這個(gè)"動(dòng)作"可能是你向倉(cāng)庫(kù)push
了代碼土思,這里"響應(yīng)"是Github會(huì)自動(dòng)發(fā)送一個(gè)可訪問的公網(wǎng)請(qǐng)求。
我們要做的就是毕源,將這個(gè)公網(wǎng)請(qǐng)求的地址作為接口地址在服務(wù)器上實(shí)現(xiàn)浪漠,讓它能在接收到Github發(fā)送的請(qǐng)求后,在服務(wù)器上進(jìn)行代碼同步操作霎褐。在Github上址愿,打開項(xiàng)目的Setting界面,定位的hooks的欄目冻璃,單擊新增按鈕响谓,需要配置的參數(shù)有三個(gè):
-
Payload URL
: 請(qǐng)求地址 比如http://mysite.org:8081
-
Secret
: 請(qǐng)求密碼,可以設(shè)置一個(gè)密碼省艳,用于服務(wù)器校驗(yàn) -
Content type
: 請(qǐng)求類型娘纷,考慮后面要用node.js
的createServer
進(jìn)行處理,就選擇application/json
即可
配置腳本
我們?cè)诖a倉(cāng)庫(kù)中新增一個(gè)github-hooks.js跋炕,并提交并同步到服務(wù)器上赖晶,內(nèi)容如下:
let crypto = require('crypto');
let secret = "THIS-IS-YOUR-SECRET";
let repo = "/home/courses";
let http = require('http');
let exec = require('child_process').exec;
let port = '8081';
function getSignature(buf) {
var hmac = crypto.createHmac("sha1", secret);
hmac.update(buf, "utf-8");
return "sha1=" + hmac.digest("hex");
}
function verifyRequest(req, res, buf) {
// github基于密碼發(fā)送的簽名
var expected = req.headers['x-hub-signature'];
// 本地根據(jù)密碼計(jì)算的簽名
var calculated = getSignature(buf);
console.log("X-Hub-Signature:", expected, "Content:", "-" + buf.toString('utf8') + "-");
// TODO the compare always not pass
if (expected !== calculated) {
console.error("Invalid signature.");
// throw new Error('wrong signature')
} else {
console.log("Valid signature!");
}
}
http.createServer(function (req, res) {
console.log('sync repo reach...');
// 只要有請(qǐng)求進(jìn)入,就會(huì)執(zhí)行到此處
req.on('data', function(chunk) {
// POST類型的請(qǐng)求會(huì)到此處
try {
verifyRequest(req, res, chunk)
exec('cd ' + repo + ' && git pull');
} catch(e) {
console.error(e)
}
});
res.end();
}).listen(port);
我們可以通過node github-hooks.js
啟動(dòng)它辐烂,雖然它接收POST請(qǐng)求才能正常處理遏插,但先確保在瀏覽器上訪問 http://mysite.org:8081/ 能返回200狀態(tài)(表示請(qǐng)求有效)。
下一步就可以在驗(yàn)證鉤子是否生效纠修,通過在個(gè)人電腦上提交代碼胳嘲,然后查看服務(wù)器上命令行中是否有 sync repo reach...
的輸出。
麻煩的是扣草,我們需要在命令行執(zhí)行Ctrl+C退出啟動(dòng)的github-hooks.js
了牛,然后去查看文件是否更新,或者手動(dòng)重啟下nginx
辰妙。
forever后臺(tái)運(yùn)行腳本
為了在服務(wù)器上后臺(tái)運(yùn)行github-hooks.js
鹰祸,我們需要通過npm
安裝forever
,然后通過命令后臺(tái)啟動(dòng):
$ npm install forever -g
$ nohup forever start github-hooks.js &
注:forever啟動(dòng)命令執(zhí)行完成后上岗,回車后可以回退到命令行繼續(xù)操作福荸。如果發(fā)現(xiàn)啟動(dòng)的服務(wù)Exit 了,需要檢查是否拼寫錯(cuò)誤肴掷,比如 start github-hooks.js
寫成了 start github-hooks
敬锐;只有發(fā)現(xiàn)回車后背传,服務(wù)狀態(tài)Done的狀態(tài)才算啟動(dòng)成功。
當(dāng)然也可以 forever list
查看啟動(dòng)的服務(wù)台夺,它會(huì)列出服務(wù)相關(guān)的列參數(shù)(包括id)径玖;可以使用forever kill id
來(lái)關(guān)閉服務(wù)。
使用自動(dòng)更新提交自動(dòng)觸發(fā)
在個(gè)人電腦上書寫的目錄中颤介,gitbook serve
可以啟動(dòng)web服務(wù)器后梳星,可以書寫完成的時(shí)候用git
命令提交。
代碼提交后滚朵,就能在服務(wù)器上看到自己書寫的最新的內(nèi)容冤灾。
下圖是Github Hooks中成功觸發(fā)的信息,可以詳情辕近,也可以手動(dòng)再次觸發(fā):
下圖是個(gè)人筆記站點(diǎn)上的內(nèi)容韵吨,有代碼提交就能直接同步到: