前言
2018年第一篇文章,沒啥技術含量,權當筆記
我們一般都會用git或者svn來管理我們的代碼
每次代碼更新后還要手動的去把服務器上的代碼也更新一遍
項目小了還好 項目大了着實浪費時間
要是服務器上的代碼也能像git那樣增量更新就好了
今天就說說如何通過webhook的形式來讓服務器自動拉取我們push的代碼
原理
現在的Git服務器一般都會有個webhook服務
什么意思呢?
就是我們在執行了push、merge等一系列的操作的時候
Git服務器會發送一個請求到我們指定的URL
並且會把此次動作的相關數據也發送過去
例
這里我們使用開源中國的碼雲演示
在幫助文檔中可以看到
當我們發生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"
}
於是乎,我們就可以拿這些數據來做做文章了
准備
- 一個git倉庫
- 安裝了web服務器與git支持的服務器
步驟
服務器篇
1.首先我們需要為www用戶創建一個ssh密鑰
切換到www用戶下並生成一個rsa密鑰
su - www
ssh-keygen -t rsa
密鑰一般生成在 /var/www/.ssh/ 這個路徑下
文件名為 id_rsa
- 創建一個可供Git服務器通知的頁面
網站的建立這里不再敷述
文件內容如下
<?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發送過來的數據相當豐富
我們可以用這些數據來做些過濾來決定是否需要更新服務器上的本地代碼
代碼庫篇
- 創建代碼倉庫
創建方法這里不在敷述
2. 添加ssh密鑰
在項目管理中把上面步驟第一步中得到的ssh密鑰添加到倉庫的部署密鑰中
這樣我們的web服務器就有了拉取代碼的權限
3.添加hook路徑
同樣在項目管理中添加webhook鏈接
這里可以添加一個密碼,我偷懶這里沒加
需要加的話可以在hook文件中添加一個驗證
可以防止被惡意訪問
聯合
最后我們需要在我們的部署目錄先把git初始化一次
su - www
git clone git倉庫地址 項目部署地址
然后我們往git倉庫中提交一次代碼更新
稍等一下
如果一切正常的話我們的項目目錄就會自動拉取你剛才提交的代碼了
在hook路徑中也有log記錄
不需要的話可以把代碼注釋掉