
git.jpg
利用git來(lái)做版本控制和團(tuán)隊(duì)協(xié)作開(kāi)發(fā)是一個(gè)不錯(cuò)的選擇,這里做一下記錄。
實(shí)現(xiàn)原理
利用git的hook機(jī)制,當(dāng)每次用戶提交了代碼后觸發(fā)一個(gè)動(dòng)作去請(qǐng)求我們自己的服務(wù)器,服務(wù)器收到通知后將代碼重新拉取一下,實(shí)現(xiàn)代碼的自動(dòng)部署。
所需環(huán)境條件
- 本地安裝
git和SourceTree客戶端 - 服務(wù)端安裝
git和nodejs環(huán)境以及PM2管理器 - 注冊(cè)碼云賬戶
具體實(shí)現(xiàn)
- 在服務(wù)端創(chuàng)建一個(gè)站點(diǎn),用來(lái)響應(yīng)hook動(dòng)作
在這個(gè)站點(diǎn)目錄下用npm安裝koa
然后新建一個(gè)index.js文件,和一個(gè)run.sh文件
index.js
const Koa = require('koa');
const shell = require('child_process');
const app = new Koa();
app.use(async (ctx) => {
if(ctx.url === '/' && ctx.method === 'POST'){
let postData = await parsePostData(ctx);
if(postData.password=='定義你的密碼'){
shell.execFile('./run.sh',function(error, stdout, stderr){
console.log('stdout: ' + stdout);
console.log('error: ' + error);
});
ctx.body = '執(zhí)行成功';
}
}else{
ctx.body = '<h1>404<h1>';
}
function parsePostData() {
return new Promise((resolve, reject) => {
try {
let postData = '';
ctx.req.addListener('data', (data) => { // 有數(shù)據(jù)傳入的時(shí)候
postData += data;
});
ctx.req.on('end', () => {
let parseData = JSON.parse(postData);
resolve(parseData);
});
} catch (e) {
reject(e);
}
});
}
});
app.listen(3000, () => {
console.log('http://127.0.0.1:3000');
});
run.sh
cd /www/wwwroot/www.XXXXXXXXXXX.com
git reset --hard origin/master
git pull
chmod -R 777 runtime
注意:目錄的權(quán)限設(shè)置
目錄截圖

mulu.png
這些都搞定之后,就在 PM2中把入口文件 index.js加進(jìn)去

WX20190313-165429.png
這樣我們的響應(yīng)程序就配置好了,接下來(lái)去碼云創(chuàng)建一個(gè)倉(cāng)庫(kù)。
-
新建倉(cāng)庫(kù),將倉(cāng)庫(kù)設(shè)置為私有,并添加開(kāi)發(fā)者。
WX20190313-165848.png
然后去你的服務(wù)器上生成一個(gè)SSH公鑰,添加到這里。
ssh-keygen -t rsa -C "郵箱地址"
三次回車后生成,然后用下面的命令查看
cat ~/.ssh/id_rsa.pub

WX20190313-170126.png
最后配置WebHooks,填寫(xiě)那個(gè)nodejs的站點(diǎn)地址

WX20190313-180239.png
-
再創(chuàng)建一個(gè)你項(xiàng)目的站點(diǎn),在目錄中用命令把倉(cāng)庫(kù)克隆下來(lái)。
注意:一定要用這個(gè)SSH的方式
WX20190313-182142.png
4.在本地用SourceTree拉取倉(cāng)庫(kù),修改一些文件,【提交】--> 【推送】
再回頭去看你服務(wù)器上的站點(diǎn),文件也跟著變動(dòng)了。

WX20190313-181523.png

