设为首页 收藏本站
查看: 1031|回复: 0

[经验分享] Jenkins进阶系列之——07Jenkins纳入版本控制

[复制链接]

尚未签到

发表于 2018-9-4 10:23:22 | 显示全部楼层 |阅读模式
  2012-01-09:更新shell脚本,修改Jenkins文件删除后不能自动从版本控制删除的bug
  是不是有过这种经历:某天手贱,把某一个配置更改了。然后只能在那儿苦逼的看着,然后的然后把以前的配置重新配一次。坑爹的是以前配置的什么都忘记了。。。尼玛,坑啊( ⊙ o ⊙ )!
  某天在群里和一群人吹牛逼,突然冒出一个人说手贱把某个job删除了,有没有办法恢复。然后我们果断的告诉了ta实情。然后这聊天的主题就跑到把jenkins加入到版本控制中。我也曾经手贱过。运气好,前几天要测试一些东西,在另一台机器上面还有备份。所以折腾折腾,就写了这篇文章。
  系统:CentOS 5.8
  版本控制软件:Subversion 1.7+
  思路:写一个脚本(shell)定时去跑一次add和commit。

  •   建立普通用户
      用一个用户会出问题,jenkins构建的时候会直接报错。貌似是因为https证书的问题。如果你是用的http协议可以尝试一个用户搞定。
      这个问题的解决方法:将用户目录下.subversion的auth目录删除就可以了
    useradd froad
  •   安装Subversion1.7以上版本(当做客户端给root用户使用)
      。其实有用的就是bin/svn这个程序而已。如果你安装了Subversion edge 直接把bin和lib目录拷贝过来就行了。为什么要用1.7以上的?因为1.7后.svn目录只有一个了。我嫌以前的版本.svn目录太多了,烦!提供个解压即可用的svn(从subversion edge中拷贝出来的) 点我去下载
  •   远程Subversion的一些准备工作
      如果你喜欢可以创建一个新的库和用户,如果你不like,随便你!
  •   检出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:  : ************* -----------------------------------------------------------------------!  Your password  authentication realm:
      

      
       ! 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/logsLOG_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


  •   踩



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-562360-1-1.html 上篇帖子: Jenkins进阶系列之——06更改Jenkins的主目录 下篇帖子: Jenkins进阶系列之——08配置Linux系统ssh免密码登陆
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表