2018年第一篇文章,沒啥技術含量,權當筆記php
咱們通常都會用git或者svn來管理咱們的代碼git
每次代碼更新後還要手動的去把服務器上的代碼也更新一遍web
項目小了還好 項目大了着實浪費時間shell
要是服務器上的代碼也能像git那樣增量更新就行了json
今天就說說如何經過webhook的形式來讓服務器自動拉取咱們push的代碼服務器
如今的Git服務器通常都會有個webhook服務ssh
什麼意思呢?svn
就是咱們在執行了push、merge等一系列的操做的時候網站
Git服務器會發送一個請求到咱們指定的URLurl
而且會把這次動做的相關數據也發送過去
這裏咱們使用開源中國的碼雲演示
在幫助文檔中能夠看到
當咱們發生push之類的操做的時候
Git服務器會像咱們指定的url發送如下數據
{ "before": "fb32ef5812dc132ece716a05c50c7531c6dc1b4d", "after": "ac63b9ba95191a1bf79d60bc262851a66c12cda1", "ref": "refs/heads/master", "user_id": 13, "user_name": "123", "user": { "name": "123", "username": "test123", "url": "https://gitee.com/oschina" }, "repository": { "name": "webhook", "url": "http://git.oschina.net/oschina/webhook", "description": "", "homepage": "https://gitee.com/oschina/webhook" }, "commits": [ { "id": "ac63b9ba95191a1bf79d60bc262851a66c12cda1", "message": "1234 bug fix", "timestamp": "2016-12-09T17:28:02 08:00", "url": "https://gitee.com/oschina/webhook/commit/ac63b9ba95191a1bf79d60bc262851a66c12cda1", "author": { "name": "123", "email": "123@123.com", "time": "2016-12-09T17:28:02 08:00" } } ], "total_commits_count": 1, "commits_more_than_ten": false, "project": { "name": "webhook", "path": "webhook", "url": "https://gitee.com/oschina/webhook", "git_ssh_url": "git@gitee.com:oschina/webhook.git", "git_http_url": "https://gitee.com/oschina/webhook.git", "git_svn_url": "svn://gitee.com/oschina/webhook", "namespace": "oschina", "name_with_namespace": "oschina/webhook", "path_with_namespace": "oschina/webhook", "default_branch": "master" }, "hook_name": "push_hooks", "password": "pwd" }
因而乎,咱們就能夠拿這些數據來作作文章了
1.首先咱們須要爲www用戶建立一個ssh密鑰
切換到www用戶下並生成一個rsa密鑰
su - www ssh-keygen -t rsa
密鑰通常生成在 ==/var/www/.ssh/== 這個路徑下
文件名爲 id_rsa
網站的創建這裏再也不敷述
文件內容以下
<?php //git webhook 自動部署腳本 //項目存放物理路徑 $path = "你的項目部署路徑"; $requestBody = file_get_contents("php://input"); if (empty($requestBody)) { die('send fail'); } $content = json_decode($requestBody, true); //如果主分支且提交數大於0 if ($content['ref']=='refs/heads/master' && $content['total_commits_count']>0) { $res = shell_exec("cd {$path} && git pull 2>&1");//以www用戶運行 $res_log = '-------------------------'.PHP_EOL; $res_log .= $content['user_name'] . ' 在' . date('Y-m-d H:i:s') . '向' . $content['repository']['name'] . '項目的' . $content['ref'] . '分支push了' . $content['total_commits_count'] . '個commit:' . PHP_EOL; $res_log .= $res.PHP_EOL; file_put_contents("git-webhook.txt", $res_log, FILE_APPEND);//追加寫入 } echo '很棒:'.date('y-m-d H:i:s');
以上代碼相信均可以看懂
Git發送過來的數據至關豐富
咱們能夠用這些數據來作些過濾來決定是否須要更新服務器上的本地代碼
建立方法這裏不在敷述
在項目管理中把上面步驟第一步中獲得的ssh密鑰添加到倉庫的部署密鑰中
這樣咱們的web服務器就有了拉取代碼的權限
3.添加hook路徑
一樣在項目管理中添加webhook連接
這裏能夠添加一個密碼,我偷懶這裏沒加
須要加的話能夠在hook文件中添加一個驗證
能夠防止被惡意訪問
最後咱們須要在咱們的部署目錄先把git初始化一次
su - www git clone git倉庫地址 項目部署地址
而後咱們往git倉庫中提交一次代碼更新
稍等一下
若是一切正常的話咱們的項目目錄就會自動拉取你剛纔提交的代碼了
在hook路徑中也有log記錄
不須要的話能夠把代碼註釋掉