<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      項(xiàng)目管理實(shí)踐(VisualSVN,TortoiseSVN,AnkhSVN,CruiseControl.NET,redmine,bugfree)

        公司最近準(zhǔn)備分出一套人馬去客戶那里做駐場(chǎng)研發(fā),這就涉及到代碼庫(kù)的統(tǒng)一管理。鑒于VSS在互聯(lián)網(wǎng)上表現(xiàn)不好,而TFS配置又過于復(fù)雜,我們選擇了SVN。考慮到代碼的安全性及性能,我們決定在本地布署自己的SVN服務(wù)器,然后每個(gè)人安裝TortoiseSVN作為客戶端,并安裝AnkhSVN插件配合Visual Studio使用,安裝CruiseControl.NET進(jìn)行自動(dòng)化的每日構(gòu)建,安裝Redmine進(jìn)行項(xiàng)目管理,安裝BugFree進(jìn)行bug管理。

        1.VisualSVN,TortoiseSVN,AnkhSVN

        我安裝的版本是:VisualSVN2.1.9,TortoiseSVN-1.6.16.21511,AnkhSvn-2.1.10129。他們的安裝過程都是傻瓜式的,無需多表,主要是安裝好后需要進(jìn)行幾個(gè)位置的配置。

        a).采用Http還是Https

        這個(gè)選擇的優(yōu)缺點(diǎn)就不多表,其實(shí)是看具體的需要。

       

        b).安全證書問題

        安裝完成后,如果采用Https方式,默認(rèn)訪問時(shí)會(huì)出現(xiàn)安全證書問題。這其實(shí)是因?yàn)槟J(rèn)使用的是“自簽名證書”。安全證書的原理,簡(jiǎn)單來講就是采用兩個(gè)大素?cái)?shù)A和B,用A加密的只能用B解密,用B加密的只能用A解密,此時(shí)稱A為密鑰,B為公鑰或者B為密鑰,A為公鑰。這是一種典型的不對(duì)稱加密。如果這對(duì)鑰匙的提供者是公認(rèn)的認(rèn)證機(jī)構(gòu)(如Verisign),那么各種主流瀏覽器就會(huì)認(rèn)為它是安全的證書,反之就是非安全證書。顯然,所謂“自簽名證書”,就是指這個(gè)鑰匙的提供者就是自己,在瀏覽器看來這當(dāng)然就是典型的非安全證書了,會(huì)在最開始的頁(yè)面顯示一個(gè)警告。要想去除這個(gè)警告,有兩種方法,第一種當(dāng)然就是把你的相關(guān)信息發(fā)給那些認(rèn)證機(jī)構(gòu),讓他們幫你生成安全證書。不過這個(gè)方案是需要花點(diǎn)銀子滴。第二種方法就是手工把當(dāng)前的“自簽名證書”加入到受信任列表里去。這種方法簡(jiǎn)單易行,具體的方法與說明請(qǐng)自行g(shù)oogle或者參見本文結(jié)尾的參考文章。

       

        c).使用“鎖定-編輯-解鎖”模型

        這個(gè)其實(shí)也是仁者見仁,智者見智的問題。只是對(duì)于我們而言,這個(gè)模型更加適合我們。但是SVN默認(rèn)是“拷貝-修改-合并”模型,那如何進(jìn)行變更呢?這就用到了SVN的自定義屬性了。在SVN里是通過內(nèi)置的屬性“svn:needs-lock”實(shí)現(xiàn)“鎖定-編輯-解鎖”模型的。在這里只提一下具體操作,找到config文件,我的路徑是:C:\Users\ljzforever\AppData\Roaming\Subversion\config。然后把enable-auto-props = yes前面的#號(hào)與空格刪掉,然后在[auto-props]下面加一行* = svn:needs-lock=x。更加具體的操作與說明請(qǐng)自行g(shù)oogle或者參見本文結(jié)尾的參考文章。這樣,所有的文件在上傳到SVN上后就自動(dòng)進(jìn)入“鎖定-編輯-解鎖”模型了。

       

        d).關(guān)于"steal lock"

        這個(gè)選項(xiàng)的初衷是為了增強(qiáng)靈活性,當(dāng)一個(gè)文件被其它人鎖定后,仍然可以用“偷”的方式將鎖強(qiáng)行拿過來。不過這也是引起代碼沖突的潛在原因之一,我們決定將其屏避掉。這里用到的技術(shù)就是hook script。hook script其實(shí)是一些腳本文件,在windows環(huán)境下就是一些bat腳本。每當(dāng)svn做一些特定操作時(shí),比如“鎖定”,“提交”時(shí),就會(huì)到指定目錄下查找相關(guān)的hook script并執(zhí)行它,達(dá)到對(duì)相應(yīng)命令的預(yù)處理。我們這里是需要在鎖定前檢查用戶在申請(qǐng)鎖定文件時(shí)是否勾選了"steal lock",如果勾選了,則中斷操作,提示用戶這個(gè)選項(xiàng)已被系統(tǒng)禁止。放置這個(gè)hook script的目錄是跟代碼庫(kù)路徑是相關(guān)的,我的目錄是:E:\Repositories\HWCH\hooks。安裝后默認(rèn)里面已經(jīng)有若干個(gè)模板,以tmpl為擴(kuò)展名,比如pre-lock.tmpl就是鎖定前做的預(yù)操作,post-commit.tmpl就是提交后做的預(yù)操作。我們?cè)诶锩嫘陆ㄒ粋€(gè)文件:pre-lock.bat,然后在里面輸入以下內(nèi)容:

       

      View Code
      @echo off

      REM [1] REPOS-PATH   (the path to this repository)
      REM
       [2] PATH         (the path in the repository about to be locked)
      REM
       [3] USER         (the user creating the lock)
      REM
       [4] COMMENT      (the comment of the lock)
      REM
       [5] STEAL-LOCK   (1 if the user is trying to steal the lock, else 0)

      setlocal
      ::svn對(duì)代碼資源庫(kù)路徑與文件路徑里的右小括號(hào)敏感,需要對(duì)其轉(zhuǎn)義
      ::
      代碼資源庫(kù)路徑
      set repos=%1 
      set "repos=%repos:)=^)%"
      ::當(dāng)前文件路徑
      set repPath=%2
      set "repPath=%repPath:)=^)%"
      set userName=%3
      set isSteal=%5

      rem NO_STEALING
      ::
      如果沒有被鎖定,則直接跳走結(jié)束處理
      if /I '1'=='%isSteal%' goto NO_STEALING
      REM echo aaa >>d:\log.txt
      REM
       echo repos = %repos% >>d:\log.txt
      REM
       echo repPath = %repPath% >>d:\log.txt
      REM
       echo userName = %userName% >>d:\log.txt
      rem
       if the path has been locked, find the Owner.
      ::
      這里是處理重點(diǎn)
      ::
      通過svnlook lock %repos% %repPath%,命令獲取鎖信息,例如:
      ::
        UUID Token: opaquelocktoken:1707b1a0-8dd1-a94e-87d2-6569a115cd5c
      ::
        Owner: ljz
      ::
        Created: 2011-08-08 21:05:31 +0800 (周一, 08 八月 2011)
      ::
        Expires:
      ::
        Comment (1 line):
      ::
      通過findstr /r /n ".",將所有行的前面加上行號(hào),前返回所有行,例如:
      ::
        1:UUID Token: opaquelocktoken:1707b1a0-8dd1-a94e-87d2-6569a115cd5c
      ::
        2:Owner: ljz
      ::
        3:Created: 2011-08-08 21:05:31 +0800 (周一, 08 八月 2011)
      ::
        4:Expires:
      ::
        5:Comment (1 line):
      ::
      通過tokens=1,2,3 delims=: ,以:號(hào)與空格作為分隔符,將上述每一行分隔,并將前三段分別裝入變量%%i,%%j,%%k
      ::
      通過if %%i == 2 set LockedName=%%k,把第二行分隔后的第三段裝入變量LockedName,在這里,就是ljz
      for /"tokens=1,2,3 delims=: " %%i in ('svnlook lock %repos% %repPath% ^|findstr //"."') do (
              
      if %%i == 2 set LockedName=%%k
              
      )

      rem If we get no result from svnlook, there's no lock, allow the lock to happen.
      ::
      如果沒有獲取到鎖定信息,則直接跳走結(jié)束處理
      if not defined LockedName goto OK_EXIT

      rem If the person locking matches the lock's owner, allow the lock to happen.
      rem
       But this one won't effect, the SVN don't care if the person matchs, they just don't allow relock.
      REM
       echo userName = %userName% >>d:\log.txt
      REM
       echo LockedName = %LockedName% >>d:\log.txt
      ::
      如果鎖定人與當(dāng)前用戶同名,則直接跳走結(jié)束處理
      if /I '%LockedName%'=='%userName%' goto OK_EXIT

      rem Otherwise, we've got an owner mismatch, so return failure:
      :WRONG_PERSON
      echo the path has been locked by %LockedName%, Pls contact %LockedName% to unlock it.>&2 
      goto ERROR_EXIT 
      :NO_STEALING
      echo Stealing lock is not allowed at this server.>&2
      :ERROR_EXIT
      endlocal
      exit 1
      :OK_EXIT
      endlocal
      exit 0

       

        這樣,我們就能阻止用戶使用"steal lock"選項(xiàng)了。

        

        2.CruiseControl.NET

        我下載的版本是CruiseControl.NET-1.6.7981.1,安裝完成后,主要通過配置安裝目錄下的ccnet.config文件來達(dá)到自動(dòng)化構(gòu)建。

        a).配置文件

        我的配置文件如下:

       

      View Code
      <cruisecontrol xmlns:cb="urn:ccnet.config.builder">
          
      <!-- This is your CruiseControl.NET Server Configuration file. Add your projects below! -->
          
      <!--
              <project name="MyFirstProject" />
          
      -->
          
      <project name="SVNTest" >
              
      <!--公有參數(shù)-->
              
      <!--CC.net存放工作結(jié)果的目錄-->
              
      <artifactDirectory>E:\project\SVNTest\artifactDir</artifactDirectory>
              
      <!--需要進(jìn)行持續(xù)集成的項(xiàng)目的目錄-->
              
      <workingDirectory >E:\project\SVNTest\workingDir</workingDirectory>
              
      <!--編譯報(bào)告的網(wǎng)址-->
              
      <webURL>http://localhost/ccnet/server/local/ViewServerReport.aspx</webURL>
              
      <!--編譯的版本號(hào)與日志文件名格式 -->
              
      <labeller type="dateLabeller"></labeller>

              
      <!--該觸發(fā)器控制周一到周五的8點(diǎn)到24點(diǎn)的時(shí)間段內(nèi)進(jìn)行編譯-->
              
      <!--在時(shí)間段內(nèi)每900秒檢查一次svn有無更新 ,如果有就取出并編譯-->
              
      <!--在時(shí)間段內(nèi)每晚上11點(diǎn)50分進(jìn)行一次強(qiáng)制編譯-->
              
      <!--但是目前有個(gè)問題,在周六與周日的23:59:59仍會(huì)編譯一次,原因是我的時(shí)間段的結(jié)束時(shí)間寫的是23:59:59。系統(tǒng)問題,無法解決-->
              
      <triggers>
                  
      <multiTrigger operator="And">
                      
      <triggers>
                          
      <filterTrigger startTime="00:00:00" endTime="08:00:00">
                              
      <trigger type="filterTrigger" startTime="00:00:00" endTime="23:59:59">
                                  
      <trigger type="intervalTrigger" seconds="900" />
                                  
      <weekDays>
                                      
      <weekDay>Saturday</weekDay>
                                      
      <weekDay>Sunday</weekDay>
                                  
      </weekDays>
                              
      </trigger>
                          
      </filterTrigger>
                          
      <filterTrigger startTime="00:00:00" endTime="08:00:00">
                              
      <trigger type="filterTrigger" startTime="00:00:00" endTime="23:59:59">
                                  
      <trigger type="scheduleTrigger" time="23:50:00" buildCondition="ForceBuild" />
                                  
      <weekDays>
                                      
      <weekDay>Saturday</weekDay>
                                      
      <weekDay>Sunday</weekDay>
                                  
      </weekDays>
                              
      </trigger>
                          
      </filterTrigger>
                      
      </triggers>
                  
      </multiTrigger>  
              
      </triggers>
              
              
      <!-- 版本控制系統(tǒng)的類型 -->
              
      <sourcecontrol type="svn">
                  
      <!-- SVN的地址 -->
                  
      <trunkUrl>http://localhost:88/svn/HWCH/SVNTest/</trunkUrl>
                  
      <!-- 把源代碼檢出到該目錄 -->
                  
      <workingDirectory>E:\project\SVNTest</workingDirectory>
                  
      <!-- svn.exe所在路徑 -->
                  
      <executable>C:\Program Files\VisualSVN Server\bin\svn.exe</executable>
                  
      <!-- 登錄svn的用戶名和密碼 -->
                  
      <username>ljz</username>
                  
      <password>ljz</password>
              
      </sourcecontrol>
              
              
      <tasks>
                  
      <!--采用VS進(jìn)行編譯-->
                  
      <devenv>
                      
      <solutionfile>E:\project\SVNTest\SVNTest.sln</solutionfile>
                      
      <configuration>Debug</configuration>
                  
      </devenv>
              
      </tasks>
              
              
      <publishers>
                  
      <!--編譯日志存放路徑-->
                  
      <!--<xmllogger logDir="E:\DailyBuild\Log\3\buildlogs" />-->
                  
      <!-- 下面設(shè)置編譯報(bào)告通過email通知相關(guān)人員 詳細(xì)信息參考cc.net的幫助-->
                  
      <!--<email from="admin@163.com" mailhost="smtp.163.com" mailhostUsername="admin" mailhostPassword="123" includeDetails="true">
                      <users>
                          <user name="dachuan" group="buildmaster" address="dachuan@163.com"/>
                      </users>
                      <groups>
                          <group name="buildmaster" notification="always"/>
                      </groups>
                  </email>
      -->
              
      </publishers>
          
      </project>
      </cruisecontrol>

       

        基本上照葫蘆畫瓢,就能把配置搞定。

       

        b).服務(wù)器時(shí)間

        我在測(cè)試cc.net從svn獲取代碼的時(shí)候,出現(xiàn)了一個(gè)這樣子的錯(cuò):failed:svn Check for modification。找了很久都沒有找到原因,后來無意中改系統(tǒng)時(shí)間的時(shí)候才發(fā)現(xiàn),原來我在測(cè)試triggers節(jié)點(diǎn)時(shí),把系統(tǒng)時(shí)間改到昨天了,所以一定要記得,下一次獲取代碼的時(shí)間一定要晚于上一次獲取代碼的時(shí)間,不然cc.net就再也無法從svn獲取最新的代碼了。

       

        c).組件  

        其實(shí),在敏捷思想的自動(dòng)化管理中,cc.net是一個(gè)持續(xù)構(gòu)建的平臺(tái),它不僅有上述的功能,還可以整合其它的技術(shù)框架.這里有兩張從其它地方轉(zhuǎn)過來的圖,可以略窺一二

       

       

       

       

          1).NANT,MSBuild

          雖說在上面的示例中,我們通過調(diào)用Visual Studio來完成項(xiàng)目的編譯,但是實(shí)際上有其缺陷:一是如果當(dāng)前環(huán)境沒有安裝Visual Studio,則無法完成編譯,二是可供選擇的編譯參數(shù)較少.而NANT與MSBuild則是專門解決其編譯問題的.MSBuild是微軟提供的生成工具,被包含在.Net FrameWork環(huán)境之中,可以拖離Visual Studio對(duì)項(xiàng)目進(jìn)行編譯,可以進(jìn)行參數(shù)化編譯.NANT則是一個(gè)獨(dú)立的第三方自動(dòng)化編譯框架,由JAVA領(lǐng)域的ANT轉(zhuǎn)化而來,通過直接調(diào)用csc命令對(duì)項(xiàng)目進(jìn)行編譯,它不僅可以進(jìn)行參數(shù)化編譯,還可以做很多其它額外的事,比如將目標(biāo)文件夾清空,copy額外的第三方dll,將編譯好的項(xiàng)目打包壓縮成zip文件等.如果說cc.net注意Build的管理,則NANT重注重于Build的運(yùn)行.個(gè)人感覺可以通過Visual Studio或者M(jìn)SBuild對(duì)項(xiàng)目進(jìn)行編譯,然后通過NANT做一些項(xiàng)目發(fā)布的其它工作.

       

          2).FxCop

          這是微軟出的一個(gè)代碼規(guī)范檢查工具,也可以通過CC.Net對(duì)其進(jìn)行自動(dòng)化調(diào)用

       

          3).NUnit,NCover

          兩個(gè)自動(dòng)化測(cè)試框架,也可以通過CC.Net對(duì)其進(jìn)行自動(dòng)化調(diào)用

       

        3.redmine

        這是個(gè)著名的開源項(xiàng)目管理軟件,這個(gè)就不多講了,具體的請(qǐng)參看我之前的博文:項(xiàng)目管理軟件之易度1.5,禪道2.0,redmine1.2(附redmine1.2的安裝)

        

        4.bugfree

        這也是個(gè)著名的開源bug管理軟件,下載最新的Wamp環(huán)境,我的是WampServer2.1e,解壓安裝,然后下載最新的bugfree,我的是bugfree2.1.3,解壓后放在Wamp安裝目錄的www目錄下,然后在瀏覽器地址欄里輸入指定網(wǎng)址,按提示生成數(shù)據(jù)庫(kù),稍等幾秒鐘后就可以開始使用了。更詳細(xì)的操作與說明請(qǐng)自行g(shù)oogle或者參見本文結(jié)尾的參考文章。

       

        最后,下載個(gè)花生殼, 將域名動(dòng)態(tài)綁定下,全世界就都可以使用公司本部的代碼了~~~

       

        參考的文章:

      1. 網(wǎng)站的安全證書有問題
      2. 將自簽名證書用于Web服務(wù)安全性
      3. 命令行 Subversion 入門
      4. 1
      posted @ 2011-08-09 20:54  永遠(yuǎn)的阿哲  閱讀(2447)  評(píng)論(1)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产成人理论在线视频观看| 亚洲精品综合网中文字幕| 日韩欧美不卡一卡二卡3卡四卡2021免费 | 久久视频在线视频| 高级艳妇交换俱乐部小说| 蜜臀91精品国产高清在线| 成人午夜免费无码视频在线观看 | 欧美大bbbb流白水| 最新国产AV最新国产在钱| 国产成人a在线观看视频免费 | 人妻少妇无码精品专区| 日韩一欧美内射在线观看| 国产午夜福利视频一区二区| 免费人成在线观看品爱网| 另类 专区 欧美 制服| 一区二区丝袜美腿视频| 白白发布视频一区二区视频| 久久婷婷国产精品香蕉| 色爱综合激情五月激情| 免费人成年激情视频在线观看| 少妇粗大进出白浆嘿嘿视频| 午夜福利伦伦电影理论片在线观看| 一级女性全黄久久片免费| 国产久免费热视频在线观看| 国产亚洲精品自在久久| 亚洲国产女性内射第一区| 麻豆亚洲精品一区二区| 国产午夜影视大全免费观看| аⅴ天堂中文在线网| 国产成人精品无码免费看| 亚洲成在人线AV品善网好看| 国产高清精品一区二区三区| 97精品人妻系列无码人妻| 无码中文av波多野结衣一区| 无码人妻精品一区二区三区下载| 全黄h全肉边做边吃奶视频| 一区二区三区四区激情视频 | 日本中文字幕亚洲乱码| 強壮公弄得我次次高潮A片| 欧美人禽zozo动人物杂交| 精品久久人人做爽综合|