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

相关文章
相关标签/搜索