2012-01-09:更新shell腳本,修改Jenkins文件刪除後不能自動從版本控制刪除的bughtml
是否是有過這種經歷:某天手賤,把某一個配置更改了。而後只能在那兒苦逼的看着,而後的而後把之前的配置從新配一次。坑爹的是之前配置的什麼都忘記了。。。尼瑪,坑啊( ⊙ o ⊙ )!git
某天在羣裏和一羣人吹牛逼,忽然冒出一我的說手賤把某個job刪除了,有沒有辦法恢復。而後咱們果斷的告訴了ta實情。而後這聊天的主題就跑到把jenkins加入到版本控制中。我也曾經手賤過。運氣好,前幾天要測試一些東西,在另外一臺機器上面還有備份。因此折騰折騰,就寫了這篇文章。shell
系統:CentOS 5.8bash
版本控制軟件:Subversion 1.7+服務器
思路:寫一個腳本(shell)定時去跑一次add和commit。app
這個問題的解決方法:將用戶目錄下.subversion的auth目錄刪除就能夠了maven
useradd froad #創建普通用戶跑Jenkins,root用戶用了跑shell腳本
#啓動Jenkins略過
#由於我是用root用戶登陸,而後 su froad切換的,因此就沒有設置密碼。
[root@localhost ~]# /home/froad/svn/bin/svn co https://192.168.xxx.xxx/svn/Jenkins/trunk /home/froad/.jenkins/ --username jenkins #說明:/home/froad/.jenkins這個參數能夠直接把檢出的.svn目錄放到.jenkins目錄,我是懶人不想在mv一次。--username是svn的用戶 #svn語法:svn co url path --username xxx Error validating server certificate for 'https://192.168.xxx.xxx:443': - The certificate is not issued by a trusted authority. Use the fingerprint to validate the certificate manually! - The certificate hostname does not match. Certificate information: - Hostname: froad-jskfb - Valid: from Apr 16 03:04:08 2013 GMT until Apr 14 03:04:08 2023 GMT - Issuer: (null), (null), (null), (null), (null) ((null)) - Fingerprint: D6:EB:58:xxxxxxxxxxxxxxxFC:7D:04:64 (R)eject, accept (t)emporarily or accept (p)ermanently? p #說明:R 拒絕 t 暫時接受 p 永久接受 Authentication realm: <https://192.168.xxx.xxx:443> VisualSVN Server Password for 'jenkins': ************* #說明:輸入你的用戶密碼 ----------------------------------------------------------------------- ATTENTION! Your password for authentication realm: <https://192.168.xxx.xxx:443> VisualSVN Server can only be stored to disk unencrypted! You are advised to configure your system so that Subversion can store passwords encrypted, if possible. See the documentation for details. You can avoid future appearances of this warning by setting the value of the 'store-plaintext-passwords' option to either 'yes' or 'no' in '/root/.subversion/servers'. ----------------------------------------------------------------------- Store password unencrypted (yes/no)? yes #說明:存儲未加密的密碼 Checked out revision 1. #如今版本庫都檢出了,下面的就簡單了。add一下,而後commit一下。打完收工。 #若是你是這麼想的,那麼結果會鬱悶死你。接着往下看吧。
爲何要更改workspace目錄呢?由於裏面有個搗蛋的目錄.svn。這個目錄是個深坑,開始我花了大力氣去忽略這個目錄。坑爹的是若是我把工做目錄清空了,而後在構建就會一直報錯。由於SVNkit跑去找JENKINS_HOME下的.svn目錄(這個目錄就是咱們上面檢出的)。
svn
測試的時候是直接把.svn目錄檢出到test_007ka目錄。你們將就看。除了目錄不同,其餘沒有區別。測試
SVNkit會先去找.svn目錄,若是到頂層目錄仍是沒有找到.svn目錄,就會在workspace目錄檢出。這是svn和git的一個特性。哪兒看到的?那個《git權威指南》。
系統管理→系統設置→主目錄(的右邊問號下面)→高級(是否是忽略了啊\(^o^)/~)→工做空間根目錄this
咱們只須要把workspace目錄趕出JENKINS_HOME目錄就好了。上配置:
workspace:/home/froad/workspace/${ITEM_FULL_NAME} #前面的目錄隨便你改,只須要在最後帶上${ITEM_FULL_NAME} JENKINS_HOME:/home/froad/.jenkins #給大家對比着看 #好了,這下.svn目錄不打架了。我也不用頭疼了。
find . -type d -name "workspace"|xargs rm -rf #看見find後面的那個點了麼,改爲你的路徑就好了
貌似將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 -e
*/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 點擊打開連接