2011-12-31 63 views
2

我一直在閱讀一段時間,並得到了一些答案,但我只需要一些更多的幫助。SVN發佈提交掛鉤部署網站

我試圖自動部署一個網站,當某個變更集被提交給一個分支,所以我從不同的分支發佈我的不同版本。例如,每當更新時都會有一個活動分支,新的更改集將合併到當前的活動網站中。

我的存儲庫(在Subversion版本控制系統上)與實時服務器位於同一臺服務器上,所以我只需將這些文件傳輸到不同的目錄。

我知道我需要編輯repo/hooks/post-commit文件,並且我已經得到了這個工作,但是我不確定這個文件的內容做我需要做的事情。

回答

5

請勿使用掛鉤進行部署。使用構建工具(Ant,Maven,無論)和持續集成工具(CruiseControl,CruiseControl.rb,Hudson等)。由於以下幾個原因,使用掛鉤是錯誤的:

  1. 縮放。掛鉤不能縮放。鉤子腳本很難做到他們不應該做的事情,例如部署,這總是需要一些技巧才能成功執行。
  2. 靈活性。掛鉤不夠靈活。每當您的流程發生變化時,您都需要重新編寫它們。你的更正可能會破壞你以前用鉤子做的事情。
  3. 安全。你打算將ftp/ssh部署的登錄/密碼直接存儲在你的hook中嗎?那將是一個巨大的錯誤。您可能會發現解決方法,但只要鉤子不是安全管理的地方,就不會有好處。
  4. 複雜性。即使開始部署時,部署通常也需要執行很多特定的操作。如果你開始在你的鉤子腳本中進行部署,它們會變成腫脹和難以管理的。
  5. 來源控制。你不能在源代碼控制下放置鉤子。如果您嘗試將其置於源代碼管理之下,只要在一個地方很難將鉤子與您的項目源一起存儲,您一定會後悔的。

所有你需要是:

,你描述你的部署步驟
  • 安裝持續集成工具
    1. 寫構建腳本
    2. 進行持續集成工具使用您的構建腳本和存儲庫
    3. 配置連續集成工具執行構建提交
    4. 執行提交到存儲庫並查看如何根據您編寫的構建腳本部署自動更改&。

    就我個人而言,我使用Ant和CruiseControl.rb來達到您所描述的目的。 這裏是構建腳本的例子來部署我通過FTP協議的變化:

    <?xml version="1.0"?> 
    <project name="myproject" default="deploy-local"> 
        <property file="build.properties"/> 
        <target name="deploy-local"> 
         <echo message="Deploying version ${version}" /> 
         <delete dir="${deploy.path.local}" /> 
         <copy todir="${deploy.path.local}"> 
          <fileset dir="." includes="**/*" > 
           <exclude name=".svn/**" /> 
           <exclude name="build.*" /> 
          </fileset> 
         </copy> 
        </target> 
        <target name="deploy-remote"> 
         <echo message="Deploying project" /> 
         <ftp action="del" 
          server="${deploy.remote.server}" 
          userid="${deploy.remote.login}" 
          password="${deploy.remote.pass}"> 
          <fileset> 
           <include name="${deploy.path.remote}"/> 
          </fileset> 
         </ftp> 
         <ftp action="mkdir" 
          server="${deploy.remote.server}" 
          userid="${deploy.remote.login}" 
          password="${deploy.remote.pass}" 
          remotedir="${deploy.path.remote}"> 
         </ftp> 
         <ftp server="${deploy.remote.server}" 
          userid="${deploy.remote.login}" 
          password="${deploy.remote.pass}" 
          remotedir="${deploy.path.remote}" 
          passive="yes"> 
          <fileset dir="." includes="**/*" > 
           <exclude name=".svn/**" /> 
           <exclude name="build.*" /> 
          </fileset> 
         </ftp> 
        </target> 
    </project> 
    

    build.properties文件有以下內容:

    deploy.path.local = C:\\apache\\htdocs\\myproject 
    deploy.path.remote = /http/deploy 
    deploy.remote.server = ftp.myproject.com 
    deploy.remote.login = mylogin 
    deploy.remote.pass = mypass 
    

    我會建議花一些時間來學習構建管理的基礎知識(螞蟻)和持續集成(CruiseControl)以最合適的方式執行部署。儘管它看起來可能不是你所要求的,並且稍微複雜一些,但這是一件正確的事情。

  • +0

    輝煌,謝謝你的建議!我會閱讀你建議的流程。非常感謝。 – 2012-01-01 14:27:01