安裝測試環境:109 CentOS4.6php
安裝:html
SVN1.32http://subversion.tigris.org/downloads/subversion-1.3.2.tar.gz |
1、版本庫鉤子mysql
3.1 start-commit 開始提交的通知sql
輸入參數:傳遞給你鉤子程序的命令行參數,順序以下:shell
1. 版本庫路徑apache
2. 認證過的嘗試提交的用戶名安全
3. Depth,mergeinfo,log-revpropsbash
3.2 pre-commit 在提交結束以前提醒服務器
輸入參數:傳遞給你鉤子程序的命令行參數。順序是:
1. 版本庫路徑
2. 提交事務的名稱
3.3 post-commit 成功提交的通知
傳遞給你鉤子程序的命令行參數,順序爲:
1. 版本庫路徑
2. 提交建立的修訂版本號
3.4 pre-revprop-change –修訂版本屬性修改的通知
這個鉤子在修訂版本屬性修改以前,正常提交範圍以外被執行,不像其它鉤子,這個鉤子默認是拒絕全部的屬性修改,鉤子必需要實際存在而且返回一個零值。
SVN如何實現鉤子
在Unix平臺上,這意味着要提供一個與鉤子同名的腳本或程序(多是shell 腳本,Python 程序,編譯過的c語言二進制文件或其餘東西)。固然,腳本模板文件不只僅是展現了一些信息—在Unix下安裝鉤子最簡單的辦法就是拷貝這些模板,而且去 掉.tmpl擴展名,而後自定義鉤子的內容,肯定腳本是可運行的。
PS:必定要確保鉤子腳本是可執行的。並且名稱就是去掉.tmpl後的名字。另外要注意要使用SVN的鉤子必定要開設權限,並且是要用運行SVN的帳號進行執行這些鉤子
提示
因爲安全緣由,Subversion版本庫在一個空環境中執行鉤子腳本—就是沒有任何環境變量,甚至沒有$PATH或%PATH%。由 於這個緣由,許多管理員會感到很困惑,它們的鉤子腳本手工運行時正常,可在Subversion中卻不能運行。要注意,必須在你的鉤子中設置好環境變量或 爲你的程序指定好絕對路徑。
目前Subversion有已實現了五種鉤子:
start-commit
它在提交事務產生前已運行,一般用來斷定一個用戶是否有權提交。版本庫傳給該程序兩個參數:到版本庫的路徑,和要進行提交的用戶名。若是程序返回一個非零值,會在事務產生前中止該提交操做。若是鉤子程序要在stderr中寫入數據,它將排隊送至客戶端。
pre-commit
在事務完成提交以前運行,一般這個鉤子是用來保護由於內容或位置(例如,你要求全部到一個特定分支的提交必須包括一 個bug追蹤的ticket號,或者是要求日誌信息不爲空)而不容許的提交。版本庫傳遞兩個參數到程序:版本庫的路徑和正在提交的事務名稱,若是程序返回 非零值,提交會失敗,事務也會刪除。若是鉤子程序在stderr中寫入了數據,也會傳遞到客戶端。
Subversion的分發版本包括了一些訪問控制腳本(在Subversion源文件目錄樹的tools/hook-scripts目錄),能夠 用來被pre-commit調用來實現精密的寫訪問控制。另外一個選擇是使用Apache的httpd模塊mod_authz_svn,能夠對單個目錄進行 讀寫訪問控制(見「每目錄訪問控制」一節)。在將來的Subversion版本中,咱們計劃直接在文件系統中實現訪問控制列表(ACLs)。
post-commit
它在事務完成後運行,建立一個新的修訂版本。大多數人用這個鉤子來發送關於提交的描述性電子郵件,或者做爲版本庫的備份。版本庫傳給程序兩個參數:到版本庫的路徑和被建立的新的修訂版本號。退出程序會被忽略。
常常提到的svn hooks是一組「外掛」腳本程序,是svn提供的一組由svn事件觸發的特別有用的程序。這些程序在服務器端執行,能夠提供svn以外的一些附加功能。鉤子能夠調用批處理文件、可執行文件或者一些相似於perl、python等的腳本。
同步程序思路:用戶提交程序到SVN,SVN觸發hooks,按不一樣的hooks進行處理,這裏用到的是post-commit,利用post-commit到代碼檢出到SVN服務器的本地硬盤目錄,再經過rsync同步到遠程的WEB服務器上。[這個思想能夠考慮推廣一下的!之前聽同事說先提交到CVS再分發用這就好了]
(說明:由於通常的WEB站點都會有多臺WEB服務器如何實現代碼分發同步這個能夠依據rsync進行處理的。可是鉤子只須要checkout到一個地方便可。其它的WEB服務器過來同步一下便可。但對於咱們來說只須要checkout到本地硬盤即puppetmastet這臺服務器的本地硬盤便可。不須要再進行分發)
好像是說使用鉤子的話是要有權限之分的。那我先來進行權限分配。
----------------------SVN配置用戶權限 -------------------------------------------
整理文檔以下:
1. 創建SVN版本庫目錄(即你的SVN服務器裏面的文件存放在哪一個目錄)
#mkdir -p /opt/svndata/repos1
說明:svn mkdir 是實際上是至關於#mkdir && svn add 操做。只差一步commit操做
Svn有許多操做是能夠直接一步到位進行的!
2. 有了目錄如今就能夠建立SVN版本庫
#svnadmin create /opt/svndata/repos1/
3. 編輯SVN的配置文件主要是權限這塊的相關配置信息
#vi /opt/svndata/repos1/conf/svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = passwd #還能夠指定到其它目錄都是能夠的
authz-db = authz
realm = repos1
4. 配置容許訪問SVN的用戶
#vi /opt/svndata/repos1/conf/passwd
[users]
test = test
5. 配置用戶訪問權限相關
#vi /opt/svndata/repos1/conf/authz
[groups]
admin = test
# harry_and_sally = harry,sally
[/]
@admin = rw
[repos1:/abc/aaa]
@admin = r
版本庫目錄格式:
[<版本庫>:/項目/目錄] #是以項目名做爲第一個單位。試想確定是以項目爲單元的
@<用戶組名> = <權限>
<用戶名> = <權限>
其中,方框號內部分能夠有多種寫法:
/,表示根目錄及如下。根目錄是svnserve啓動時指定的,咱們指定爲/opt/svndata。這樣,/就是表示對所有版本庫設置權限。
repos1:/,表示對版本庫1設置權限
repos2:/abc, ,表示對版本庫2中的abc項目設置權限
repos2:/abc/aaa, ,表示對版本庫2中的abc項目的aaa目錄設置權限
權限主體能夠是用戶組、用戶或*,用戶組在前面加@,*表示所有用戶。權限能夠是w、r、wr和空,空表示沒有任何權限。
6. 啓動svnserve -d -r /opt/svndata/
其中:
-d表示以daemon方式(後臺運行)運行
-r /opt/svndata指定根目錄是/opt/svndata
7. 如今有了倉庫了就能夠往倉庫裏面提交東西了。咱們是以一個項目爲單位的進行提交
#mkdir -p /var/www/dotproject 項目文件目錄是在這。項目名稱爲dotproject
#svn import -m 'project' /var/www/dotproject svn://192.168.0.109/repos1
這個時候就會讓你輸入用戶名與密碼了
8. 從版本庫中checkout東西
#mkdir myproj && cd myproj 表示所有的項目都存在這個目錄下面
#svn checkout svn://192.168.1.109/repos1 dotproect 表示把repos1裏面的項目搞出來。
以上操做成功!如下是操做總結
1. #mkdir -p /opt/svndata/repos1
#svnadmin create /opt/svndata/repos1/
這樣的話咱們的SVN倉庫的名稱其實就是repos1 這個很是有用。在定義權限的時候有用
2. [repos1:/abc/aaa] 其中abc表示的是項目名稱。像上面就是dotproject這個名稱
@admin = r 表示這個組的用戶能夠進行讀的權限
1. svnserve -d -r /opt/svndata/
-r /opt/svndata指定根目錄是/opt/svndata #這個也很是有用!(哦明白了這個其實跟JSP裏面的根目錄一個效果若是指定了WEB項目的根目錄了其實後面的文件或目錄都是相對於這個根目錄進行訪問的。這裏面若是咱們指定了其實倉庫的根目錄的話後面的文件訪問其實也是依據這個根目錄進行的其中的 -d 參數表示 svnserve.exe 將會做爲一個服務程序運行在後臺,而 -r 參數表示將 D:\svn 目錄指定爲代碼庫的根目錄。這樣,當客戶端使用相似 svn://192.168.0.1/foo 這樣內容的 URL 來訪問服務器時候,其所訪問到的真實代碼庫,其實就是 D:\svn\foo)
3. svn import -m 'project' /var/www/dotproject svn://192.168.0.109/repos1
其中這裏面的dotproject就是項目名稱了!
2. svn checkout svn://192.168.1.109/repos1 dotproect #表示將這個倉庫中的這個項目提取出來
看我測試權限:
# vi /opt/svndata/repos1/conf/authz
[groups]
admin = test
[repos1:/dotproject/]
@admin = r #讓這個用戶只有讀的權限
如今到項目目錄下面就不能夠再commit動做了
--no-auth-cache –username rory --password 8809117
1. 我編輯/opt/svndata/repos1/hooks/ pre-commit 這個文件裏面的內容以下:
#!/bin/bash REPOS="$1" TXN="$2" # Make sure that the log message contains some text. SVNLOOK=/usr/local/bin/svnlook $SVNLOOK log -t "$TXN" "$REPOS" | \ grep "[a-zA-Z0-9]" > /tmp/aaa || exit 1 # Check that the author of this commit has the rights to perform # the commit on the files and directories being modified. # commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1 # All checks passed, so allow the commit. exit 0 #返回0表示容許提交? |
運行這段程序正常了!
而後我將其換成我本身的腳本看:(這臺正常了哦哦!)
#!/bin/bash /bin/echo "a" >> /tmp/aaa.out 成功記錄日誌 # exit 1 #REPOS="$1" #TXN="$2" # Make sure that the log message contains some text. #SVNLOOK=/usr/local/bin/svnlook #$SVNLOOK log -t "$TXN" "$REPOS" | \ # grep "[a-zA-Z0-9]" > /tmp/aaa || exit 1 # Check that the author of this commit has the rights to perform # the commit on the files and directories being modified. # commit-access-control.pl "$REPOS" "$TXN" commit-access-control.cfg || exit 1 # All checks passed, so allow the commit. exit 0 |
-rwxr-xr-x 1 root root 494 Nov 1 13:21 pre-commit
OK咱們如今來寫一個成功svn-commit以後要觸發的一個鉤子
#!/bin/bash REPOS="$1" TXN="$2" /bin/echo "eeeee" >> /tmp/dddddsvn.out 成功! |
OK!如今換一個python腳原本試試
我想讓SVN在提交以後執行一段python程序
#!/usr/bin/env python #這一段的意義就是當將這個python程序置成可執行時候。它會去哪尋找python。若是沒有這段的話將其設置成可執行的時候就不會跑起來 if __name__ == '__main__': import sys,string try: logfile = open('/tmp/python.out','a+') #簡單寫個日誌記錄一下 logfile.write("this is a python hook") logfile.close() except: exit(1) sys.exit(0) |
而後在post-commit裏面的代碼以下:
#!/bin/bash REPOS="$1" TXN="$2" /usr/bin/python /opt/svndata/repos1/hooks/so.py #直接調用這段python程序 |
OK!如今來編寫SVNUPDATE這塊的代碼。
實現原理:當用戶提交commit動做發生都讓另一處project立刻從倉庫中進行代碼checkout一份出來!
說明:post-commit會接受兩個參數
REPOS="$1" /opt/svndata/repos1 表示svn倉庫的絕對路徑值
TXN="$2" 表示最新的一個版本號。最後一個版本號
來看看update的相關參數項
對它的描述以下:
Svn update會把版本庫的修改帶到工做拷貝(工做拷貝的理解其實就是一個工做區)中。若是沒有給定修訂的版本它就會把當前的工做拷貝更新到HEAD最新版本。不然就是它會把工做拷貝更新到指定的修訂版本即—revision後面所帶的參數值。爲了保持同步svn update也會刪除全部在工做拷貝發現的無效鎖定。
正式的代碼以下:
#vi /opt/svndata/repos1/hooks/post-commit
#!/bin/bash
/usr/local/bin/svn update /home/myproject/dotproect/ --username test --password test
if [ $? == 0 ]
then
echo "ok" >> /tmp/z.out
fi
測試發現當我修改一個文件而後再commit提交的時候另一個項目位置是能夠。
如今正式搭建SVN的環境。包括用戶權限相關的內容!
--------------------------搭建puppet與svn環境--------------------------------
環境:108
項目名稱:puppet
項目代碼目錄:mkdir -p /var/www/puppet (將/etc/puppet下面的東西先cp過來)
代碼倉庫名稱:repos1
倉庫的目錄:mkdir -p /opt/svndata/repos1
到時會在/etc/ 下面進行一次一次checkout將項目直接checkout到etc目錄下面
#svn checkout svn://192.168.0.109/repos1 puppet #表示將這個項目直接checkout下來(能夠先在一個目錄進行測試下看看)
具體步驟以下:
整理文檔以下:
9. 創建SVN版本庫目錄(即你的SVN服務器裏面的文件存放在哪一個目錄)
#mkdir -p /opt/svndata/repos1
說明:svn mkdir 是實際上是至關於#mkdir && svn add 操做。只差一步commit操做
Svn有許多操做是能夠直接一步到位進行的!
10. 有了目錄如今就能夠建立SVN版本庫
#svnadmin create /opt/svndata/repos1/
11. 編輯SVN的配置文件主要是權限這塊的相關配置信息
#vi /opt/svndata/repos1/conf/svnserve.conf
[general]
anon-access = none
auth-access = write
password-db = passwd #還能夠指定到其它目錄都是能夠的
authz-db = authz
realm = repos1
12. 配置容許訪問SVN的用戶
#vi /opt/svndata/repos1/conf/passwd
[users]
test = test
13. 配置用戶訪問權限相關
#vi /opt/svndata/repos1/conf/authz
[groups]
admin = test
# harry_and_sally = harry,sally
[/]
@admin = rw
[repos1:/abc/aaa]
@admin = r
版本庫目錄格式:
[<版本庫>:/項目/目錄] #是以項目名做爲第一個單位。試想確定是以項目爲單元的
@<用戶組名> = <權限>
<用戶名> = <權限>
其中,方框號內部分能夠有多種寫法:
/,表示根目錄及如下。根目錄是svnserve啓動時指定的,咱們指定爲/opt/svndata。這樣,/就是表示對所有版本庫設置權限。
repos1:/,表示對版本庫1設置權限
repos2:/abc, ,表示對版本庫2中的abc項目設置權限
repos2:/abc/aaa, ,表示對版本庫2中的abc項目的aaa目錄設置權限
權限主體能夠是用戶組、用戶或*,用戶組在前面加@,*表示所有用戶。權限能夠是w、r、wr和空,空表示沒有任何權限。
14. 啓動svnserve -d -r /opt/svndata/
其中:
-d表示以daemon方式(後臺運行)運行
-r /opt/svndata指定根目錄是/opt/svndata
15. 如今有了倉庫了就能夠往倉庫裏面提交東西了。咱們是以一個項目爲單位的進行提交
#mkdir -p /var/www/puppet 項目文件目錄是在這。項目名稱爲dotproject
#svn import -m 'project' /var/www/puppet svn://192.168.0.109/repos1
這個時候就會讓你輸入用戶名與密碼了(注意passwz裏面不要有前綴空格)
16. 從版本庫中checkout東西
(先:#rm –rf /puppet/)將puppet目錄先刪除掉。再執行這一條命令。我以爲這太繞了!!!這樣的話就會有這個目錄並且這裏面的文件均進來了!
#svn checkout svn://192.168.0.109/repos1 puppet 表示把repos1裏面的項目搞出來。
17. 編寫這個SVN的鉤子
#!/bin/bash
/usr/local/bin/svn update /home/myproject/dotproect/ --username test --password test
if [ $? == 0 ]
then
echo "ok" >> /tmp/z.out
fi
----------------而後就能夠在WINDOWS平臺鏈接過來。進行操做而後直接SVN提交。
--------------------------高級應用篇-----------------------------------------
1. 如何精確地進行用戶權限劃分
示例:對於modules目錄裏面的劃分很是強烈。好比apache/ mysql/目錄其中mysql用戶只能管理mysql裏面的東西。Apache用戶只能管理apache裏面東西
WIN平臺要想讓TV不記密碼能夠將:
C:\Documents and Settings\Administrator\Application Data\Subversion\auth裏面的所有文件給刪除掉便可!
Authz文件配置以下:
[groups]
admin = test
db = mysql
www = apache
[repos1:/]
test = rw
[repos1:/modules/mysql]
mysql = rw
*=
[repos1:/modules/apache] 原來上面的寫法說第一節表示項目名稱是錯了。
apache = rw
*=
這樣一寫我就能夠控制某個目錄某個用戶的訪問權限了!未來puppet自己的配置文件管理是能夠這樣進行細分的!
2. 若是將一個目錄刪除掉了如何同步呢?
假設你使用Windows的客戶端TortoiseSVN,你能夠這樣操做:
1。在工做目錄下,選中要刪除的文件和目錄.
2。右鍵,點擊菜單TortoiseSVN -> Delete,這時會看到那些文件已經沒了
3。而後執行commit,會看到在提交對話框中出現了那些刪除文件
提交後,這些文件和目錄就被刪除了
其它開發者update一下,他們工做目錄的那些文件也相應地被刪除
優勢:在操做時看不到多餘的文件,版本號保留了
缺點:庫大小仍是沒有變
使用命令操做以下:
#svn delete test 將這個文件或目錄給刪除掉
#svn commit -m 'delete test' 將其提交一下
如今換到客戶端進行刪除文件
按照上面的說法進行操做成功將文件刪除掉!
------------------------到此!成功配置完成SVN+PUPPET---------------------------
(全文完.)
轉於:http://blog.chinaunix.net/uid-25525723-id-360264.html