2012-04-04 109 views
2

我想在我的測試服務器本地設置自動部署腳本。
我在Ubuntu桌面11.04上使用gitolite。 我使用apt-get安裝gitolite來安裝gitolite,所以它是創建用戶gitolite和組gitolite。
現在我安裝我的測試網絡服務器使用Apache的用戶和組ivan:ivan,
並在該用戶名下做git克隆。
所以所有的文件和文件夾都有相同的文件擁有者ivan:ivan。使用Gitolite自動部署PHP腳本

我安裝後收到在/ var/lib中/ gitolite /庫/ testrepo /鉤/和有此腳本里面鉤:

#!/bin/bash 
#CONFIG 
LIVE="/home/ivan/public_html/testrepo" 

read oldrev newrev refname 
if [ $refname = "refs/heads/master" ]; then 
    echo "===== DEPLOYING TO TEST SITE =====" 
    unset GIT_DIR 
    cd $LIVE 
    git pull origin master: 
    echo "===== DONE =====" 
fi 

由於後收到鉤由gitolite用戶執行的,它有訪問正在使用用戶ivan的測試服務器的權限問題。

我已將gitolite添加到ivan組,並使其成組訪問寫入,但仍無法運行。
我知道這是一個權限問題,但我不知道解決方案。
如果你有相同的經驗或有任何提示,我會很感激。

感謝
伊萬

+0

什麼是你已經爲你的gitolite回購設置的umask?見http://stackoverflow.com/questions/7086325/setting-umask-in-git-gitolite/7103499#7103499,http://stackoverflow.com/questions/9915482/gitolite-and-file-permissions/9915919#9915919 ,和http://stackoverflow.com/questions/5455070/permission-problems-with-git-sharedrepository/5455127#5455127 – VonC 2012-04-04 14:50:22

+0

嗨VonC,我相信我仍然使用默認gitolite umask。但我認爲這並不重要。在我的腳本中,由用戶ivan自己的倉庫中的gitolite用戶執行。所以當它拉動時,由於許可問題,gitolite不能訪問git ref頭。有沒有解決方法?謝謝。 – Ivan 2012-04-05 05:00:21

+0

嘗試修改由Gitolite配置的umask無論如何,只是爲了檢查是否改變任何東西。 – VonC 2012-04-05 05:34:48

回答

3

我終於得到了解決我自己,感謝VonC的指針。
我的解決方案可能並不美觀,但仍然有效。

因此,這裏是我的解決方案的工作步驟:

  1. 我創建了一個光禿禿的倉庫,將與Web應用程序相同的用戶權限。 (在Ubuntu:/ var/lib/gitolite/repositories中),我創建了一個post-receive鉤子,它將鏡像我剛剛創建的裸回購庫。代碼是:

    #!/bin/bash
    echo '==== DO MIRROR ===='
    git push --mirror [email protected]:path/to/bare.git
    echo '==== DONE MIRROR ===='

  2. 而在我的web應用程序,我將創建一個連接到裸露的回購協議的遠程。

  3. 然後,我在鏡像的裸回購中創建一個後接收掛鉤,它會要求Web應用程序從中取出。代碼:

    #!/bin/bash
    WORK_DIR="/home/ivan/public_html/test/testing"
    read oldrev newrev refname
    if [ $refname = "refs/heads/master" ]; then
    echo "===== DEPLOYING TO LIVE SITE ====="
    unset GIT_DIR
    cd $WORK_DIR
    git pull mirror-repo master
    echo "===== DONE ====="
    fi

  4. 不要忘記使用chmod + x對於雙方 - 接收後。

正如我之前所說,它可能並不漂亮,但仍然有效,至少對於我目前的情況來說。我之所以不把它從gitolite存儲庫中提取,是因爲用戶文件的權限。在Ubuntu中(從apt-get安裝),gitolite持有用戶和組,gitolite:gitolite。和我的Web應用程序在我的家庭文件夾(我使用suPHP)下有用戶和組ivan:ivan。 因此,當我推送到gitolite存儲庫時,它將運行gitolite用戶下的bash腳本,該用戶無法訪問我的主文件夾下的.git文件夾。

所以是的,對於那些有更好的解決方案,我渴望聽到你的消息。
謝謝,希望我的解決方案可以幫助他人。
Ivan

+0

優秀的反饋,謝謝! +1 – VonC 2012-04-09 11:41:51

0

經過漫長的谷歌搜索,我沮喪地實現這種自動拉功能,當任何推動發生。但我自己的方式只需3個簡單的步驟。

  1. 添加一個狀態變量在/ var/lib中/ gitolite/STAT /項目

    vim /var/lib/gitolite/repositories/project.git/hooks/post-receive 
    #!/bin/bash 
    echo '==== DO MIRROR ====' 
    echo '1'>/var/lib/gitolite/stat/project 
    echo '==== DONE MIRROR ====' 
    
  2. 由根編寫一個腳本特權

    vim /var/lib/gitolite/stat/autopull.sh 
    #!/bin/bash 
    hstat=`cat /var/lib/gitolite/stat/project 
    enter code here 
    if [ "$hstat" == 1 ]; then 
    cd /home/suphpuser/public_html_staging/project 
    git pull 
    chown -R suphpuser.suphpuser /home/suphpuser/public_html_staging/project 
    echo '0'>/var/lib/gitolite/stat/project 
    fi 
    
  3. 運行腳本

    /var/lib/gitolite/stat/autopull.sh 
    

這就是全部:)