本文轉載自個人我的網站的博客文章,原文: 使用inotify和git-pull-實現網站自動部署附wordpress插件php
---------------------
linux
個人我的網站項目託管在osc的git倉庫裏,之前的更新方法是從把代碼從本地push到git倉庫後,遠程登錄服務器,執行一次git pull,把代碼更新到服務器。長此以往,漸漸以爲這樣的方式太過麻煩。git
咱們知道,git倉庫通常都提供web hooks, 就是每次push代碼後,都會給遠程HTTP URL發送一個POST請求,好比這是oschina的web hook:http://git.oschina.net/oschina/git-osc/wikis/WebHook-%E4%BD%BF%E7%94%A8%E7%AE%80%E4%BB%8B 。
github
因此一個可行的辦法是服務器收到這個web hook 的post請求以後在網站目錄自動執行一次git pull, 這樣就把代碼更新到服務器了。 可是有一個問題,服務器使用的是php,它獲取這個請求以後,因爲運行php-fpm的用戶爲daemon,由於安全因素,網站目錄對這個用戶並不所有可寫,因此執行git pull須要root權限,並且,使用system(),exec(),passthru()這類調用外部程序的函數有必定的危險,我也不喜歡。 而後找到了一個神器:inotify toolsweb
關於它的介紹能夠參考這兩篇文章:centos
How to use inotify-tools to trigger scripts on filesystem events安全
Inotify: 高效、實時的Linux文件系統事件監控框架
bash
個人想法是:用Inotify監控指定目錄,是php接收到web hook post請求後,向這個目錄或文件寫入內容,Inotify監測到文件變化後執行git pull完成更新。 安裝能夠參考wiki , 在centos上執行服務器
yum install inotify-tools
便可,注意Linux kernel 至少要達到 2.6.13 。 安裝以後,把下面的內容保存爲inotify.sh,而且chmod +x inotify.sh,這是咱們的監控腳本, 內容中的 /websites/cellmean/src/wp-content/uploads/git 是咱們要監控的目錄,後面會說明,bash腳本主要參考自這篇文章:http://www.tiyee.net/post/193框架
#!/bin/bash WAIT_DIR=${1-/websites/cellmean/src/wp-content/uploads/git} inotifywait -qme modify,move,create $WAIT_DIR --format '"%w" "%f" "%e" "%T"' --timefmt='%F_%T' \ | while read DIR FILE EVENT TIME ;do echo $DIR $FILE $EVENT $TIME #eval "str=${FILE}" dir="/websites/cellmean/src/" cd $dir git pull done
接下來咱們只要接到post請求後向監控的目錄,也就是前文的/websites/cellmean/src/wp-content/uploads/git 寫入文件便可,網站是wordpress的,因而我又寫了一個插件來幹這件事,這是插件的下載連接: falcon-git
激活插件後,在osc git網頁中添加web hook設置,URL填寫:http://你的wordpress主頁/?from=git ,密碼請本身設置一個,後面要用到,好比這樣:
而後回到插件設置頁面,把剛纔設置的密碼填入,分支請填寫服務器部署用的分支,這個選項的做用是當該分支上push更新了纔會自動部署, 默認使用master,上圖:
保存後,在服務器執行剛纔的監控腳本。
nohup /path/to/inotify.sh >> /path/to/log/git.log 2>&1 &
這樣就大功告成了,之後只要本地執行git push以後,服務器就能自動部署了,是否是很方便。哈哈, 這是我這兩天的更新歷史