2014-02-11 63 views
3

我運行以下的bash腳本中的cronjob來更新我的網站混帳拉檢查文件是否改變慶典

#!/bin/bash 

cd /home/username/public_html 
git pull origin master 

此的cronjob運行每5分鐘,所以如果我承諾變爲混帳回購協議,它得到拉去住網站。

我想要做的是,每次運行這個腳本時,檢查一個特定的文件是否改變,如果文件改變了,運行一個curl/wget命令。

的文件,我需要跟蹤變化的style.css和的script.js

我在做什麼,如果這些文件被更改,在我的網站模板腳本的更新版本號,所以緩存被清除並且最新改變的css和js文件被加載。

<link href="/css/style.css?REVISION_NUMBER_HERE" rel="stylesheet" type="text/css"> 

我可以通過curl請求輕鬆增加JS/CSS修訂號,因爲它存儲在mysql數據庫中。

下面是一個簡單的git拉的結果,所以我們可以grep爲style.css中/在結果

* branch   master  -> FETCH_HEAD 
Updating cbd0d46..36aeed6 
Fast-forward 
admin/cf.php   | 16 ++++++++++++++++ 
css/style.css  | 47 +++++++++++++++++++++++++++-------------------- 
include/common.php | 1 + 
templates/header.tpl | 4 ++-- 
templates/index.tpl | 13 ++++++------- 
5 files changed, 52 insertions(+), 29 deletions(-) 

編輯

感謝@torek的答覆的script.js。

我需要BASH腳本的更多幫助,現在這裏是我的測試git命令。

[[email protected] public_html]# git diff --name-only 8613bd3ed718b27ca680bdf33e0a4b32b0f58b8c HEAD | egrep '.css|.js|.tpl' 
css/style.css 
templates/header.tpl 
templates/index.tpl 
templates/user/delete.tpl 
[[email protected] public_html]# 

我把硬編碼的git rev編號進行測試。我的bash腳本

[[email protected] public_html]# sh 1.sh 
File changed css/style.css 
File changed templates/header.tpl 
File changed templates/index.tpl 
File changed templates/user/delete.tpl 
[[email protected] public_html]# cat 1.sh 
#!/bin/bash 


CSS_JS_CHANGED=0 

git diff --name-only 8613bd3ed718b27ca680bdf33e0a4b32b0f58b8c HEAD | egrep '.css|.js|.tpl' | 
while read name; do 
    CSS_JS_CHANGED=1 
    echo "File changed $name" 
done 

if [ "$CSS_JS_CHANGED" = "1" ]; then 
    echo expression evaluated as true 
fi 

[[email protected] public_html]# 

如果我在裏面運行我的腳本,它會在多個文件改變時執行多次。每次更改只需運行一次腳本。

,所以我需要設置一個變量CSS_JS_CHANGED,其值設置爲0,然後如果檢測到文件更改,將其值設置爲1,然後運行我的腳本,如果CSS_JS_CHANGED的值爲1

但對於某些原因,我不能在while循環中將CSS_JS_CHANGED的值設置爲1。任何與變量範圍有關的事情?

**編輯2 **

我覺得爲什麼while循環here

作爲一個bash菜鳥我無法從內部設置變量,有人可以讓我的劇本工作,請:)

編輯3

得到它與CSS_JS_CHANGED變量工作。

[[email protected] public_html]# cat update 
#!/bin/bash 
# */5 * * * * /home/USERNAME/public_html/update >/dev/null 2>&1 


cd /home/USERNAME/public_html 
OLD_HEAD=$(git rev-parse HEAD) 
git pull origin master 
NEW_HEAD=$(git rev-parse HEAD) 

[ $OLD_HEAD = $NEW_HEAD ] && exit 0 

git diff --name-only $OLD_HEAD $NEW_HEAD | egrep '.css|.js' | 
while read name; do 
    touch /tmp/css_js_update 
done 

if [ -f "/tmp/css_js_update" ] 
then 
    /usr/bin/curl 'http://mywebsite.com/admin/cf.php?js_version_update=mywebsite' 
    rm -f /tmp/css_js_update 
fi 
[[email protected] public_html]# 

現在正在等待.css /。js文件提交:)

再次感謝@torek

回答

3

你做這樣的,你應該問的事情任何時候:「對於哪些改變呢?」

如果你正在部署的東西到Web服務器,可能你的意思是「從服務器讀取的版本更改」。在這種情況下,首先保存關於服務器讀取的版本的信息,例如「內容」,或者在git的情況下,這很容易 - 服務器讀取版本的唯一標識符。

看起來你直接在服務器上做一個git pull(它有一些缺點,但我們只是運行它)。捕獲一些SHA-1值似乎更簡單,而不是試圖解釋git merge輸出。舉例來說,你可以抓住這些兩個文件斑點你有興趣:

OLD_STYLE_ID=$(git rev-parse HEAD:css/style.css) 
OLD_SCRIPT_ID=$(git rev-parse HEAD:script.js) # fix path here if/as needed 

之後,你可以做的讀取和合並/拉操作,然後得到新的SHA-1:

git pull origin master 
NEW_STYLE_ID=$(git rev-parse HEAD:css/style.css) 
NEW_SCRIPT_ID=$(git rev-parse HEAD:script.js) # again, fix path if needed 

現在如果新ID與舊ID匹配,那些文件保持不變;任何不匹配的ID代表這些文件中的更改。

另外,保存的ID爲新老HEAD值,如果這些變化,做一些與有趣的路徑(一個或多個),例如:

OLD_HEAD=$(git rev-parse HEAD) 
git pull origin master 
NEW_HEAD=$(git rev-parse HEAD) 
[ $OLD_HEAD = $NEW_HEAD ] && exit 0 # no change to repo = no change to any files 

在這一點上有很多選擇,比如爲:

git diff --name-only ${OLD_HEAD} ${NEW_HEAD} -- css/style.css script.js | 
while read name; do 
    ... 
done 

或簡單地檢查是否git diff --name-only,僅限於這些路徑(如上所述),打印任何事情。

+0

謝謝你的回覆。我的git knowldge是有限的,用很少的命令來做。 Git拉活服務器工作正常,唯一的問題是我必須等到cronjob運行或我需要登錄到服務器,並做手動git拉一些重要的更新,我不能等待的情況下。我會通過你的解決方案。感謝SHA-1的想法,即使我無法使用我有限的bash知識工作,我可以用一些小小的php腳本和sha1_file()來完成一些事情。 – HostOnNet