使用inotify和git pull 實現網站自動部署(附wordpress插件)

本文轉載自個人我的網站的博客文章,原文: 使用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 ,密碼請本身設置一個,後面要用到,好比這樣:


bbb

而後回到插件設置頁面,把剛纔設置的密碼填入,分支請填寫服務器部署用的分支,這個選項的做用是當該分支上push更新了纔會自動部署, 默認使用master,上圖:


falcon-git

保存後,在服務器執行剛纔的監控腳本。

nohup /path/to/inotify.sh >> /path/to/log/git.log 2>&1 &

這樣就大功告成了,之後只要本地執行git push以後,服務器就能自動部署了,是否是很方便。哈哈, 這是我這兩天的更新歷史

相關文章
相關標籤/搜索