代碼自動更新:SVN鉤子解放你的雙手

鉤子是什麼?

其實和回調是一個概念,當某個事情發生時就會調用你提供的方法,利用好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插件和檢出代碼
相關文章
相關標籤/搜索