通常情況下我們都是将項目托管到Github,Coding等服務商。如果你有一台自己的Linux雲主機,在上面搭建Git伺服器比想象中要簡單的多。這篇文章講解如何搭建Git伺服器及使用git的hook機制(使用post-receive這個hook,在git伺服器受到push請求,并且接受完代碼送出時觸發)
大緻要執行下面的指令
# 建立一個名為git的使用者,專門通路倉庫,這裡會問一系列問題,包括設定使用者密碼,請牢記
sudo adduser git
# 配置SSH,無密碼通路伺服器,這裡不是本文重點,關于SSH配置請自行搜尋,要建立 home/git/.ssh 目錄,并設定權限
sudo chmod 700 /home/git/.ssh
chmod 600 authorized_keys
# 建立項目目錄,這裡沒有放到使用者目錄下
mkdir -p /usr/git_repo/gittest.git && cd ..
# 建立一個裸倉庫并設定該倉庫目錄的組權限為可寫。
# 裸倉庫就是一個隻包含.git子目錄的内容,不包含其他資料。
git init --bare --shared
# 好,服務端的倉庫已經建立,下面是本地操作
# 開發人員小馬先在本地建立一個git項目,将剛才建立的倉庫設定為項目的遠端倉庫并推送分支。
git init
touch readme && vi readme
git add .
git commit -m 'add readme'
git remote add origin git@cloud:/usr/git_repo/gittest.git
git push origin master
# 小張作為另外一個開發人員,可以直接clone項目,并推送自己的改動
# 本地嘗試通路并拉倉庫。cloud是我配置ssh主機名稱,也可以是IP位址或域名
# 如果不成功檢查SSH的配置
git clone git@cloud:/usr/git_repo/gittest.git
cd gittest
vi readme
git commit -am 'fix the readme file'
git push origin master
是不是和Github的
git clone [email protected]:mafeifan/smzdm.git
很類似?但是Github還支援HTTP協定,比如
https://github.com/mafeifan/smzdm.git
想達到同樣的目的,需要在伺服器上針對apache或nginx配置
git-http-backend。
使用伺服器的hook
每當本地push代碼,還得在伺服器上git pull。這樣太麻煩了。git支援hook機制,類似事件通知,比如git伺服器收到push請求,并且接受完代碼送出時觸發。需要在hooks目錄下建立post-receive檔案
伺服器操作
cd /usr/git_repo/gittest.git/hooks
sudo cp post-update.sample post-receive
# 編輯post-receive内容為
echo $(date) >> hook.log
這樣push代碼到伺服器,就會多出一個記錄時間的hook.log
你可以優化内容,比如執行代碼檢查,git pull代碼到/var/www,npm install,等操作。
使用托管網站的web-hook
以bitbucket為例,我在上面建立一個nodejs項目叫git-deploy-demo,暴露一個接口叫deploy,必須是post方法。項目跑在我自己的主機叫cloud。每次push代碼,我讓他調用這個deploy接口
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuYjZ0kDNhBDO3gTMxIDM5gTZ1cjZhhjY4ADNlNDMzUmYfdWbp9CXt92Yu4GZjlGbh5SZslmZxl3Lc9CX6MHc0RHaiojIsJye.png)
image.png
關于deploy接口,接收調用後執行update.sh腳本
const exec = require('child_process').exec;
app.post('/deploy', (req, res) => {
const commands = 'sh ./update.sh';
exec(commands, (err, out, code) => {
if (res.statusCode === 200) {
res.send('deploy done');
}else {
res.send(out)
}
})
update.sh内容如下:
#!/bin/bash
git pull
npm install
sudo pm2 restart git-deploy-demo