Gogs Git Server簡介與使用Git Hook同步Git Branch
1. 什麼是Git Hook
和其它版本控制系統一樣,Git 能在特定的重要動作發生時觸發自定義腳本。這個腳本就叫作Hook(鉤子),這樣的鉤子有兩組:客戶端的和伺服器端的。客戶端的鉤子會由提交和合併這樣的操作所調用,而伺服器端的鉤子會作用於接收被推送的提交這樣的聯網操作。
2. 為什麼要自行架設Git Server還要用Git Hook同步Branch
公司已經有提供BitBucket這個Git的服務,為什麼我還要自己再架一個Git Server?
目前駐點在客戶端,在專案初期開發的人員都是昕力的同事,所以使用BitBucket來管理及同步程式是沒問題的。但到了專案後期,客戶的開發人員也要加入進來一起開發,公司的BitBucket沒辦法開帳號給客戶使用,客戶公司內部也有他們的Git Server,但資訊處也說沒辦法開防火牆及帳號給公司以外的人連線和使用。
所以,在兩邊都沒辦法互通的狀況下只好找一台電腦架設一個Git Server,讓我們及客戶的開發人員可以順利開發,另外再配合Git Hook撰寫腳本,讓客戶端開發的程式碼可以同步回去公司的BitBucket中。
3. Gogs
看Gogs的官網正中央的文字「一款極易搭建的自助Git服務」就可以知道這是一個可以快速上手又簡單易用的Git Server軟體,重點是還支援簡體中文顯示,連網站上的說明文件都有簡體中文,對我們這些看簡體中文就像吃飯喝水一樣平常的人來說簡直就是一大福音
4. 使用Gogs及複製現有專案的Git倉庫內容
安裝過程就不多加敘述,一直下一步,偶而中間填寫一些必要資訊,如root密碼等就可以完成安裝。
安裝完成後,使用root登入,可由右上角的功能選單中進入管理面板,這是root才有的功能
進入管理面板後可以看到Server所有的資訊摘要以及各種管理功能
再進行下一步之前,我先在公司的BitBucket上新增了一個測試的倉庫
並且做了幾次commit
現在我們要把公司的bitBucket上的Git倉庫複製到剛剛建好的Gogs Server中;先由右上角的「+」下拉,選擇遷移外部倉庫
在功能介面中把必要的資訊填入,然後點選下方的「遷移倉庫」按鈕開始複製倉庫到gogs server上
等到複製完成後就會跳轉到這個倉庫的介面中
然後可以點選畫面中的「提交歷史」,確認與剛剛在bitBucket中看到歷史紀錄一致
到這邊為止就完成了由bitBucket中複製倉庫的動作
5. 在那裏設定Git Hook
Git Hook的設定是每個repository各自獨立的,今天要示範的是設定server端的Git Hook
由右上角的「倉庫設定」進入
選擇左方功能表中的「管理Git鉤子」
6. Server端Git Hook的種類
Server端的Git Hook有三種,pre-receive、update及post-receive,說明如下
1. pre-receive:處理來自客戶端的推送時最先執行的腳本,在這腳本中可以檢查推送上來的內容是否符合預期,若不符合可直接拒絕此次推送。
2. update:與「pre-receive」類似,不同的地方在於若有多個分支同時推送時,pre-receive只會執行一次,update會依推送分支的數量決定執行次數。
3. post-receive:在整個推送的過程完成後才會執行,通常用來更新其他系統的服務或是通知用戶,這次要示範的同步到其他Git Server的動作也是使用這個Git Hook
7. 撰寫Git Hook腳本
腳本的語言支援shell、Ruby和Python,甚至Perl也能使用
以下我們使用shell來撰寫
1. 宣告將要同步的Git Server的URL及NAME
2. 移除之前可能沒刪除的遠端Server
3. 新增遠端Git Server及推送所有的Branch和tag
4. 移除遠端的Server
5. 顯示成功訊息
6. 完整程式碼如下
#!/bin/bash
BITBUCKET_URL='https://Spike1@bitbucket.org/Spike1/gogsgittest.git'
BITBUCKET_NAME='gogsgittest'
# 删除git服务器
git remote | grep $BITBUCKET_NAME | xargs -I @ git remote remove @
#git remote rm origin
git remote add $BITBUCKET_NAME $BITBUCKET_URL
git push -u $BITBUCKET_NAME --all
git push -u $BITBUCKET_NAME --tags
#git push -u $BITBUCKET_NAME $REPO_NAME
# 删除git服务器
git remote remove $BITBUCKET_NAME
echo "push to bitbucket success !!"
7. 填寫以上內容至post-receive這個Git Hook中並儲存更新
8. 測試
1. 在本機新增三個commit
2. Push至自己建立的gogs Git Server並確定有成功訊息
3. 檢查bitbucket,確認有正確同步剛剛建立的三個commit
9. 結語
雖然前面列了這麼多個步驟,但不管是架設gogs Git Server還是設定Git Hook,實際操作起來並不會困難或複雜,本篇文章只是簡單介紹了如何用Git Hook這個工具達成我想做的事,但是Git Hook可以做的事可是遠大於此,甚至可以搭配自動化工具實現:commit及push新版本後自動檢查內容是否符合規範,若不符合就退回,若符合則部署至測試環境並發送Email通知客戶此次上版內容,請客戶上線測試。
沒有好工具或壞工具,只有是不是適合自己的工具,找到適合自己的工具可以更好的解決工作上或是生活上遇到問題,不用再分心去處理這些瑣事
10. 參考來源
l https://gogs.io/
l https://yodalee.blogspot.com/2016/12/git-hook-unittest.html
l https://ithelp.ithome.com.tw/articles/10210660
l http://rettamkrad.blogspot.com/2014/03/git-hook-how-to-use-git-pre-commit-hook.html
l https://git-scm.com/book/zh/v2/%E8%87%AA%E5%AE%9A%E4%B9%89-Git-Git-%E9%92%A9%E5%AD%90
l https://kknews.cc/zh-tw/code/6qxj29q.html
l https://blog.yowko.com/git-hook-windows/