gitHook
當進行開發的環境在本地,而運行的環境要在服務端時,每一次提交代碼都需要在服務端pull一次。而利用git的hooks功能,能夠讓我們省去這一步,下面我就以碼雲的webhooks爲例,實現服務端的代碼自動同步部署。
瞭解 git 的 hooks
關於 git 鉤子
Git 能在特定的重要動作發生時觸發自定義腳本。 有兩組這樣的鉤子:客戶端的和服務器端的。 客戶端鉤子由諸如提交和合並這樣的操作所調用,而服務器端鉤子作用於諸如接收被推送的提交這樣的聯網操作。 你可以隨心所欲地運用這些鉤子。
如何使用鉤子
鉤子都被存儲在 Git 目錄下的 ==hooks== 子目錄中。 也即絕大部分項目中的 ==.git/hooks== 。 當你用 ==git init== 初始化一個新版本庫時,Git 默認會在這個目錄中放置一些示例腳本。這些腳本除了本身可以被調用外,它們還透露了被觸發時所傳入的參數。 所有的示例都是 shell 腳本,其中一些還混雜了 Perl 代碼,不過,任何正確命名的可執行腳本都可以正常使用 —— 你可以用 Ruby 或 Python,或其它語言編寫它們。 這些示例的名字都是以 ==.sample== 結尾,如果你想啓用它們,得先移除這個後綴。
把一個正確命名且可執行的文件放入 Git 目錄下的 hooks 子目錄中,即可激活該鉤子腳本。 這樣一來,它就能被 Git 調用。 接下來,我們會講解常用的鉤子腳本類型。
具體使用可以參考官方文檔:Git Hookes
瞭解 webhooks
鉤子功能(callback),是幫助用戶 push 了代碼後,自動回調一個你設定的 http 地址。 這是一個通用的解決方案,用戶可以自己根據不同的需求,來編寫自己的腳本程序(比如發郵件,自動部署等);目前,webhooks 支持多種觸發方式,支持複選。
webhooks 的請求方式爲POST請求,有兩種數據格式可以選擇,JSON 和 web 的 form參數,可以自行選擇是否使用密碼來確定請求。(注意:該密碼是明文)
不同託管平臺的POST數據格式都不太一樣,不過也不會有太大影響,只是解析數據的時候注意就行了,下面是碼雲的 Push 操作回調的 json 數據:
{
"ref": "refs/heads/master",
"before": "b111263b14230e2276922a3d1f6e585c771db75e",
"after": "3611f77d00bc8f6294e5cb39731010db1478ca20",
"created": false,
"deleted": false,
"forced": false,
"base_ref": null,
"compare": "https://github.com/AndyYoungCN/githook/compare/b111263b1423...3611f77d00bc",
"commits": [
{
"id": "3611f77d00bc8f6294e5cb39731010db1478ca20",
"tree_id": "221e39b970eba9b71b0b20f1061fa0b9c78f43e0",
"distinct": true,
"message": "修改日誌級別",
"timestamp": "2019-04-26T16:17:48+08:00",
"url": "https://github.com/AndyYoungCN/githook/commit/3611f77d00bc8f6294e5cb39731010db1478ca20",
"author": {
"name": "andyoung",
"email": "[email protected]",
"username": "AndyYoungCN"
},
"committer": {
"name": "andyoung",
"email": "[email protected]",
"username": "AndyYoungCN"
},
"added": [
],
"removed": [
],
"modified": [
"README.md",
"pull.php"
]
}
],
"head_commit": {
"id": "3611f77d00bc8f6294e5cb39731010db1478ca20",
"tree_id": "221e39b970eba9b71b0b20f1061fa0b9c78f43e0",
"distinct": true,
"message": "修改日誌級別",
"timestamp": "2019-04-26T16:17:48+08:00",
"url": "https://github.com/AndyYoungCN/githook/commit/3611f77d00bc8f6294e5cb39731010db1478ca20",
"author": {
"name": "andyoung",
"email": "[email protected]",
"username": "AndyYoungCN"
},
"committer": {
"name": "andyoung",
"email": "[email protected]",
"username": "AndyYoungCN"
},
"added": [
],
"removed": [
],
"modified": [
"README.md",
"pull.php"
]
},
"repository": {
"id": 183569523,
"node_id": "MDEwOlJlcG9zaXRvcnkxODM1Njk1MjM=",
"name": "githook",
"full_name": "AndyYoungCN/githook",
"private": false,
"owner": {
"name": "AndyYoungCN",
"email": "[email protected]",
"login": "AndyYoungCN",
"id": 13751605,
"node_id": "MDQ6VXNlcjEzNzUxNjA1",
"avatar_url": "https://avatars0.githubusercontent.com/u/13751605?v=4",
"gravatar_id": "",
"url": "https://api.github.com/users/AndyYoungCN",
"html_url": "https://github.com/AndyYoungCN",
"followers_url": "https://api.github.com/users/AndyYoungCN/followers",
"following_url": "https://api.github.com/users/AndyYoungCN/following{/other_user}",
"gists_url": "https://api.github.com/users/AndyYoungCN/gists{/gist_id}",
"starred_url": "https://api.github.com/users/AndyYoungCN/starred{/owner}{/repo}",
"subscriptions_url": "https://api.github.com/users/AndyYoungCN/subscriptions",
"organizations_url": "https://api.github.com/users/AndyYoungCN/orgs",
"repos_url": "https://api.github.com/users/AndyYoungCN/repos",
"events_url": "https://api.github.com/users/AndyYoungCN/events{/privacy}",
"received_events_url": "https://api.github.com/users/AndyYoungCN/received_events",
"type": "User",
"site_admin": false
},
"html_url": "https://github.com/AndyYoungCN/githook",
"description": "利用webhook完成自動部署。兼容碼雲、Coding、GitHub、Gogs",
# more...
}
其他的具體數據可以到各個官網查看:碼雲、Coding、GitHub、Gogs
Use(使用步驟)
-
git clone [email protected]:AndyYoungCN/githook.git 放在目標倉庫同個服務器上,最好同個目錄;
-
配置目錄權限
## 如果需要日誌, 修改日誌權限 mkdir logs chmod 777 -R logs
-
修改目錄權限
chown -R www-data /var/www/githook # 這裏請改成你創建的hook目錄 chown -R www-data /var/www/Project # 這裏請改成你的項目目錄
-
設置目標倉庫webhook
設置URLURL:http://<domain>/githook/pull.php?[log_level=false][&path=xxx]
log_level
是否日誌等級;默認0:關閉日誌;15 打開所有日誌;打開日誌需要給logs
目錄寫的權限path
倉庫位置;默認 '../{repositoryname}',repositoryname
:倉庫名;
目標倉庫必須要設置用戶名密碼或者SSH(讓
git pull
命令可以直接執行 )
最終將會執行cd {$path} && git pull
命令
注意事項
如果配置都沒有問題,但是就是不會自動拉取,那應該是用戶的權限配置問題,可以先查看運行php代碼的具體用戶是什麼,然後爲該用戶開啓權限。
system("whoami"); // 查看是哪個用戶執行該命令
License
Copyright (c) 2019-present andyoung
歡迎Star https://github.com/AndyYoungCN/githook