天天看點

搭建Git伺服器并感受hook使用

通常情況下我們都是将項目托管到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接口

搭建Git伺服器并感受hook使用

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
           

參考: