當進行開發的環境在本地,而運行的環境要在服務端時,每一次提交代碼都須要在服務端pull一次。而利用git的hooks功能,可以讓咱們省去這一步,下面我就以碼雲的webhooks爲例,實現服務端的代碼自動同步部署。php
更新歷史html
Git 能在特定的重要動做發生時觸發自定義腳本。 有兩組這樣的鉤子:客戶端的和服務器端的。 客戶端鉤子由諸如提交和合並這樣的操做所調用,而服務器端鉤子做用於諸如接收被推送的提交這樣的聯網操做。 你能夠爲所欲爲地運用這些鉤子。git
鉤子都被存儲在 Git 目錄下的 ==hooks== 子目錄中。 也即絕大部分項目中的 ==.git/hooks== 。 當你用 ==git init== 初始化一個新版本庫時,Git 默認會在這個目錄中放置一些示例腳本。這些腳本除了自己能夠被調用外,它們還透露了被觸發時所傳入的參數。 全部的示例都是 shell 腳本,其中一些還混雜了 Perl 代碼,不過,任何正確命名的可執行腳本均可以正常使用 —— 你能夠用 Ruby 或 Python,或其它語言編寫它們。 這些示例的名字都是以 ==.sample== 結尾,若是你想啓用它們,得先移除這個後綴。github
把一個正確命名且可執行的文件放入 Git 目錄下的 hooks 子目錄中,便可激活該鉤子腳本。 這樣一來,它就能被 Git 調用。 接下來,咱們會講解經常使用的鉤子腳本類型。web
具體使用能夠參考官方文檔:Git Hookesshell
鉤子功能(callback),是幫助用戶 push 了代碼後,自動回調一個你設定的 http 地址。 這是一個通用的解決方案,用戶能夠本身根據不一樣的需求,來編寫本身的腳本程序(好比發郵件,自動部署等);目前,webhooks 支持多種觸發方式,支持複選。apache
webhooks 的請求方式爲POST請求,有兩種數據格式能夠選擇,JSON 和 web 的 form參數,能夠自行選擇是否使用密碼來肯定請求。(注意:該密碼是明文)json
不一樣託管平臺的POST數據格式都不太同樣,不過也不會有太大影響,只是解析數據的時候注意就好了,下面是碼雲的 Push 操做回調的 json 數據:bash
{ "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" }
其餘的具體數據能夠到各個官網查看:碼雲、Coding、GitHub服務器
一、首先你要搭建好LAMP的的開發環境 能夠看騰訊開發者實驗室的課程
二、固然要有git的環境了
三、要將代碼方在一個提供webhooks支持的代碼託管平臺上,若是本身搭建 git 服務器則要本身實現 webhooks 回調
sudo mkdir /var/www/.ssh sudo chown -R apacheuser /var/www/.ssh/ // 這裏的用戶要是 Apache 的運行用戶,下同
公鑰有兩個:1. git用戶公鑰,2. 部署公鑰:
ssh-keygen -t rsa -C "sample@gmail.com" # 填本身的郵箱 # 而後一直回車就行 # 生成的文件一般是 /root/.ssh/id_rsa,若是非root用戶請查看提示上的路徑
sudo -Hu apacheuser ssh-keygen -t rsa # 請選擇 "no passphrase",一直回車下去
sudo cat /root/.ssh/id_rsa.pub # 查看生成的密鑰內容,複製所有
將公鑰的內容粘貼到用戶->設置 中的SSH公鑰中
sudo cat /var/www/.ssh/id_rsa.pub # 查看生成的密鑰內容,複製所有
將公鑰內容添加到具體項目 -> 管理 中的部署公鑰
sudo -Hu apacheuser git config --global credential.helper store # 永久保存 sudo -Hu apacheuser git config --global user.name "name" sudo -Hu apacheuser git config --global user.email "shample@gmail.com" # 郵箱請與碼雲上一致
配置完成以後能夠 clone 或 pull 項目來驗證是否配置成功(注意:要切換成Apache運行用戶來進行操做),若屢次操做只需輸入一次用戶名、密碼,即配置成功,若每一次操做都有輸入用戶名密碼,則配置不成功,須要從新檢查配置。
在你的www目錄創建一個目錄hook, 裏面放上一個php文件index.php,內容以下:
<?php // 這裏只是最簡單的拉取代碼,若是要作更加多的操做,如驗證、日誌,請本身解析push內容並操做 // 獲取push數據內容的方法 $requestBody = file_get_contents("php://input"); // 只需這一行代碼即可拉取 shell_exec("cd /var/www/Project && git pull"); // 目錄換成項目的目錄 ?>
修改目錄權限:
chown -R apacheuser /var/www/hook # 這裏請改爲你建立的hook目錄 chown -R apacheuser /var/www/Project # 這裏請改爲你的項目目錄
確保你的hook文件能夠訪問:http://example.com/hook/index... ,鉤子準備完成。
若是連接可用,則大功告成,只需把倉庫 clone 以後,再向碼雲提交,變回自動被 服務器 pull
若是配置都沒有問題,可是就是不會自動拉取,那應該是用戶的權限配置問題,能夠先查看運行php代碼的具體用戶是什麼,而後爲該用戶開啓權限。
system("whoami"); // 查看是哪一個用戶執行該命令