Jenkins進階系列之——07Jenkins歸入版本控制


2012-01-09:更新shell腳本,修改Jenkins文件刪除後不能自動從版本控制刪除的bughtml

是否是有過這種經歷:某天手賤,把某一個配置更改了。而後只能在那兒苦逼的看着,而後的而後把之前的配置從新配一次。坑爹的是之前配置的什麼都忘記了。。。尼瑪,坑啊( ⊙ o ⊙ )!git

某天在羣裏和一羣人吹牛逼,忽然冒出一我的說手賤把某個job刪除了,有沒有辦法恢復。而後咱們果斷的告訴了ta實情。而後這聊天的主題就跑到把jenkins加入到版本控制中。我也曾經手賤過。運氣好,前幾天要測試一些東西,在另外一臺機器上面還有備份。因此折騰折騰,就寫了這篇文章。shell

系統:CentOS 5.8api

版本控制軟件:Subversion 1.7+bash

思路:寫一個腳本(shell)定時去跑一次add和commit。服務器

  1. 創建普通用戶
    用一個用戶會出問題,jenkins構建的時候會直接報錯。貌似是由於https證書的問題。若是你是用的http協議能夠嘗試一個用戶搞定。
    微信

     這個問題的解決方法:將用戶目錄下.subversion的auth目錄刪除就能夠了maven

     

    useradd froad
  2. 安裝Subversion1.7以上版本(當作客戶端給root用戶使用)
    。其實有用的就是bin/svn這個程序而已。若是你安裝了Subversion edge 直接把bin和lib目錄拷貝過來就好了。爲何要用1.7以上的?由於1.7後.svn目錄只有一個了。我嫌之前的版本.svn目錄太多了,煩!提供個解壓便可用的svn(從subversion edge中拷貝出來的) 點我去下載ide

     

  3. 遠程Subversion的一些準備工做
    若是你喜歡能夠建立一個新的庫和用戶,若是你不like,隨便你!svn

     

  4. 檢出svn目錄

    複製代碼

    [root ~]Error validating server certificate  :
     - The certificate is not issued by a trusted authority. !
     - The certificate hostname does not match.:
     - Hostname: froad-- Valid: from Apr  ::  GMT  Apr  :: - Issuer: (null), (null), (null), (null),- Fingerprint: D6:EB::xxxxxxxxxxxxxxxFC:7D::,  (t)emporarily or  (p)ermanently? p Authentication realm: <https://.xxx.xxx:> : ************* -----------------------------------------------------------------------!  Your password  authentication realm:
    
       <https://.xxx.xxx:>! so that Subversion can store passwords encrypted, .  See the documentation  details. option to either  or .
    -----------------------------------------------------------------------/)? yes Checked out revision .

    複製代碼

  5.  更改Jenkins的workspace目錄

     爲何要更改workspace目錄呢?由於裏面有個搗蛋的目錄.svn。這個目錄是個深坑,開始我花了大力氣去忽略這個目錄。坑爹的是若是我把工做目錄清空了,而後在構建就會一直報錯。由於SVNkit跑去找JENKINS_HOME下的.svn目錄(這個目錄就是咱們上面檢出的)。

    測試的時候是直接把.svn目錄檢出到test_007ka目錄。你們將就看。除了目錄不同,其餘沒有區別。

     SVNkit會先去找.svn目錄,若是到頂層目錄仍是沒有找到.svn目錄,就會在workspace目錄檢出。這是svn和git的一個特性。哪兒看到的?那個《git權威指南》。
    系統管理→系統設置→主目錄(的右邊問號下面)→高級(是否是忽略了啊\(^o^)/~)→工做空間根目錄

     咱們只須要把workspace目錄趕出JENKINS_HOME目錄就好了。上配置:

    workspace:/home/froad/workspace/${ITEM_FULL_NAME} #前面的目錄隨便你改,只須要在最後帶上${ITEM_FULL_NAME}JENKINS_HOME:/home/froad/.jenkins #給大家對比着看
    #好了,這下.svn目錄不打架了。我也不用頭疼了。
  • ${JENKINS_HOME} — Jenkins home directory.#JENKINS_HOME這個參數不用說了

  • ${ITEM_ROOTDIR} — Root directory of a job for which the default workspace is allocated.#ITEM_ROOTDIR:默認的工做空間目錄。完整的路徑就是JENKINS_HOME/jobs/xxxx/workspace 

  • ${ITEM_FULL_NAME} — '/'-separated job name, like "foo/bar".#ITEM_FULL_NAME:job的名稱,這個就是咱們須要的。

  1. 點開後面的問號能夠看見3個參數(配置路徑須要的):

刪除已經存在的workspace目錄 爲何要刪除已經存在的workspace?想知道結果?跳過這一步,執行下面一步就知道結果了。find . -type d -name "workspace"|xargs rm -rf  #看見find後面的那個點了麼,改爲你的路徑就好了配置Subversion忽略目錄 貌似將JENKINS_HOME目錄直接提交到Subversion,數據量不是通常的高啊!我這個Jenkins才跑3個月都10Gb了。 若是要提交上去,花費的時間,不是通常的長啊。 注意:你用的什麼用戶,就在用戶目錄下面改。我用的root用戶。 進入用戶目錄的.subversion打開config文件,找到global-ignores。大概在105行。 把global-ignores前的#去掉,注意#後面的空格要刪掉。而後在=後面添加 modules modules目錄是maven項目產生的,個人Jenkins就是這個目錄大。把這個目錄刪除了也就幾百Mb。若是你有其餘目錄想忽略的自行添加,記得用空格分隔就好了。寫個shell腳本svn_commit.sh 這個腳本隨便你放在哪兒,我想偷懶。直接放在Jenkins的主目錄,順便也版本控制下。。O(∩_∩)O~ 聲明:腳本寫的很醜,勿噴!須要版本控制的文件或目錄,命名不能是 ${xxxx} 格式。

#!/bin/bash #Jenkins的Subversion備份腳本 

#請將本腳本放到JENKINS_HOME目錄 

#做者:zjl 

#version:2.0 

#time:2014-01-07 18:36 

#獲取當前系統時間

DATE=`date "+%Y%m%d"` 

SVN_HOME=/home/froad/svn 

JENKINS_HOME=/home/froad/jenkins

#日誌文件

LOG_HOME=/root/.subversion/logs LOG_FILE=${LOG_HOME}/svn_commit_${DATE}.log

TMP_STATUS_LOG=${LOG_HOME}/status.log


echo "[begin] 當前時間:`date "+%Y%m%d_%H%M%S"`" >>${LOG_FILE}

if [ ! -d "${LOG_HOME}" ];then    

mkdir -p ${LOG_HOME}      

fi

#進入到svn工做目錄,防止出現稀奇古怪的錯誤

cd ${JENKINS_HOME} 


function svn_add() {    

     #使用svn add命令將文件添加到版本控制     ${SVN_HOME}/bin/svn add  ${JENKINS_HOME}/*  --username=jenkins  --force &>>${LOG_FILE}         

     #退出碼     

     EXIT_NUM=$?      

     echo "svn add退出碼:${EXIT_NUM} !" >>${LOG_FILE} } 

function svn_status() {    

     #使用svn status命令判斷文件是否刪除、修改或者其餘操做     ${SVN_HOME}/bin/svn status  "/${JENKINS_HOME}" > ${TMP_STATUS_LOG}    

     #循環從文件中讀取一行     

     cat ${TMP_STATUS_LOG} | while read line;do         

     #獲取第一個字符,根據第一個字符判斷狀況         

     l=`echo ${line}|cut -c1`        

           #狀態爲A(增長)時,不須要任何操做,直接返回。         if [ "${l}" == "A"  ];then            

             continue         

          fi        

           #狀態爲D(刪除)時,不須要任何操做,直接返回。         if [ "${l}" == "D"  ];then             

             continue         

          fi        

           #狀態爲M(修改)時,不須要任何操做,直接返回。         if [ "${l}" == "M"  ];then            

             continue         

          fi        

           #狀態爲?(未受控制)時,調用add命令而後返回。ps:不知道怎麼的有時候從文件中讀取回來的?變成了0         if [ "${l}" == "0" ] || [ "${l}" == "?"  ];then                     

              ${SVN_HOME}/bin/svn add  "${JENKINS_HOME}/`echo ${line} | cut -d ' ' -f 2- `" >>${LOG_FILE}                         

              continue                      

          fi        

           #狀態爲!(丟失或者不完整)時,調用delete命令而後返回。         if [ "${l}" == "!"  ];then                                          ${SVN_HOME}/bin/svn delete "${JENKINS_HOME}/`echo ${line} | cut -d ' ' -f 2- `" >>${LOG_FILE}                         

              continue                      

          fi         

          echo "[info]其餘狀況:"${line} >>${LOG_FILE}     

          done         

           #刪除臨時文件     

          rm -rf ${TMP_STATUS_LOG} 

 }    


function svn_commit() {    

     #使用svn commit命令提交到服務器     ${SVN_HOME}/bin/svn commit ${JENKINS_HOME}/*  --message="crontab commit" --username=jenkins &>>${LOG_FILE}     EXIT_NUM=$?    

     if [ ! ${EXIT_NUM} == "0" ];then         

         echo "[error]退出碼:${EXIT_NUM} svn commit失敗,請查看日誌!">>${LOG_FILE}        

         return     

     fi          echo "svn commit退出碼:${EXIT_NUM} !">>${LOG_FILE}     }


#調用方法

svn_add 

svn_status 

svn_commit 


echo "[end] 當前時間:`date "+%Y%m%d_%H%M%S"`" >>${LOG_FILE}

#輸出空行隔離

echo  >>${LOG_FILE} 

腳本寫好了,建議先運行一次。測試下有沒有錯誤。 


添加定時提交crontab -u root -*/30 * * * * sh /home/froad/.jenkins/svn_commit.sh  #每30分鐘提交一次 


結尾

普通用戶開機自動啓動Jenkins:su 用戶名 -c "sh path" 

#例如:su froad -c "sh /usr/local/jenkins/bin/startup.sh"

將上面的命令加入到/etc/rc.d/rc.local文件中非root用戶不能使用1024如下的端口,比較麻煩。有不懂的,下面留言。有好的建議,下面留言。歡迎交流!


轉:http://www.cnblogs.com/zz0412/p/jenkins_jj_08.html 點擊打開連接

  • 0

相關文章
相關標籤/搜索