其實和回調是一個概念,當某個事情發生時就會調用你提供的方法,利用好SVN鉤子能夠大大的方便你的開發。
web開發人員,每次提交了代碼都須要手動到服務器更新下代碼才能看到效果。
今天我就教你們如何利用鉤子自動化更新。php
下面我將以SVNBucket爲例,若是你尚未SVNBucket賬號,點擊註冊html
如上圖,點擊添加鉤子,咱們須要填入 連接、token、觸發條件python
連接:就比如咱們的回調方法,在你提交代碼後就會自動調用這個連接,你收到調用後就能夠執行代碼更新了。token:是一個可選的參數,在調用連接時會帶上這個參數,能夠用來檢查調用是否來自SVNBucket。這裏能夠隨意填寫一個本身想要的參數就好了web
觸發條件:觸發條件咱們選擇提交後,這樣代碼提交以後就會調用連接。shell
那麼咱們的連接填寫什麼呢?你須要本身寫一個http服務,用來接收調用。segmentfault
下面我以Python代碼爲例(PHP版本看文章最後),寫一個簡單的http服務來接收調用:服務器
# -*- coding:utf8 -*- # 注意:運行這個腳本的機器要安裝SVN的客戶端 import os from bottle import run, request, post @post('/onCommit') def onCommit(): # 參數有: # event: 事件名字,有 start-commit(提交前), post-commit(提交後) # token: 校驗字符串 # rev: 版本號( post-commit 事件纔有值) # log:提交描述內容( post-commit 事件纔有值), # user:提交者用戶名 # 高級技巧:利用好log、user參數能夠作選擇性的更新,好比判斷log中包含「update」才進行服務器更新; param = request.params # 校驗token,檢查是否是本身在SVNBucket上配置的,防止惡意請求 if param.get('token', '') == 'YourToken': # 調用shell腳本進行svn update output = os.popen('./up_and_restart.sh') print output.read() else: print 'token校驗不對,忽略' return 'failed' return 'ok' if __name__ == '__main__': run(host='0.0.0.0', port=8080, server='cherrypy')
這裏咱們用python的bottle框架搭建了一個簡單的http服務來處理代碼更新。根據這個能夠本身實現一個其餘語言的版本框架
在收到請求後咱們就執行了一個shell腳本,這個shell腳本就是調用svn update去更新咱們的代碼了。svn
假設你的服務器IP是119.29.35.39,http服務的端口是8080,那麼咱們就應該配置上面的連接地址爲:http://119.29.35.39:8080/onCommitpost
配置好了後,咱們能夠點擊測試按鈕進行測試,這樣就會手動的觸發一次連接請求,而且在下面區域顯示調用記錄、是否成功
最後再提供一個PHP版本的供參考:
<?php header("Content-Type: text/html; charset=utf-8"); header("Cache-Control:no-cache,must-revalidate"); // 參數有: // event: 事件名字,有 start-commit(提交前), post-commit(提交後) // token: 校驗字符串 // rev: 版本號( post-commit 事件纔有值) // log:提交描述內容( post-commit 事件纔有值) // user:提交者用戶名 // 高級技巧:利用好log、user參數能夠作選擇性的更新,好比判斷log中包含「update」才進行服務器更新; // 注意:運行這個腳本的機器要安裝SVN的客戶端 if($_POST['token'] === '你填寫的Token值') { $username = '你的SVN用戶名'; $password = '你的SVN密碼'; $target_dir = '/data/www'; exec("svn up --username $username --password $password --no-auth-cache $target_dir 2>&1", $output, $outresult); print_r("\noutput:$output, result:$outresult"); if ($outresult ===0 ) { echo '更新成功!'; //echo print_r($output); return 'ok'; } else { echo '更新失敗!'; echo print_r($output); return 'failed'; } } else { echo '數據校驗失敗,無效更新!'; return 'failed'; }
SVN快速上手
SVN經常使用命令
輕鬆解決SVN衝突
SVN 和 Git 的一些誤解和真相
Mac用戶SVN圖形界面推薦
Eclipse安裝SVN插件和檢出代碼