2012-01-09:更新shell腳本,修改Jenkins文件刪除後不能自動從版本控制刪除的bughtml
是否是有過這種經歷:某天手賤,把某一個配置更改了。而後只能在那兒苦逼的看着,而後的而後把之前的配置從新配一次。坑爹的是之前配置的什麼都忘記了。。。尼瑪,坑啊( ⊙ o ⊙ )!git
某天在羣裏和一羣人吹牛逼,忽然冒出一我的說手賤把某個job刪除了,有沒有辦法恢復。而後咱們果斷的告訴了ta實情。而後這聊天的主題就跑到把jenkins加入到版本控制中。我也曾經手賤過。運氣好,前幾天要測試一些東西,在另外一臺機器上面還有備份。因此折騰折騰,就寫了這篇文章。shell
系統:CentOS 5.8api
版本控制軟件:Subversion 1.7+bash
思路:寫一個腳本(shell)定時去跑一次add和commit。服務器
創建普通用戶
用一個用戶會出問題,jenkins構建的時候會直接報錯。貌似是由於https證書的問題。若是你是用的http協議能夠嘗試一個用戶搞定。
微信
這個問題的解決方法:將用戶目錄下.subversion的auth目錄刪除就能夠了maven
useradd froad
安裝Subversion1.7以上版本(當作客戶端給root用戶使用)
。其實有用的就是bin/svn這個程序而已。若是你安裝了Subversion edge 直接把bin和lib目錄拷貝過來就好了。爲何要用1.7以上的?由於1.7後.svn目錄只有一個了。我嫌之前的版本.svn目錄太多了,煩!提供個解壓便可用的svn(從subversion edge中拷貝出來的) 點我去下載ide
遠程Subversion的一些準備工做
若是你喜歡能夠建立一個新的庫和用戶,若是你不like,隨便你!svn
檢出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 .
更改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的名稱,這個就是咱們須要的。
點開後面的問號能夠看見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
踩