2012-01-09:更新shell脚本,修改Jenkins文件删除后不能自动从版本控制删除的bug

是不是有过这种经历:某天手贱,把某一个配置更改了。然后只能在那儿苦逼的看着,然后的然后把以前的配置重新配一次。坑爹的是以前配置的什么都忘记了。。。尼玛,坑啊( ⊙ o ⊙ )!

某天在群里和一群人吹牛逼,突然冒出一个人说手贱把某个job删除了,有没有办法恢复。然后我们果断的告诉了ta实情。然后这聊天的主题就跑到把jenkins加入到版本控制中。我也曾经手贱过。运气好,前几天要测试一些东西,在另一台机器上面还有备份。所以折腾折腾,就写了这篇文章。

系统:CentOS 5.8

版本控制软件:Subversion 1.7+

思路:写一个脚本(shell)定时去跑一次add和commit。

  1. 建立普通用户
    用一个用户会出问题,jenkins构建的时候会直接报错。貌似是因为https证书的问题。如果你是用的http协议可以尝试一个用户搞定。

    这个问题的解决方法:将用户目录下.subversion的auth目录删除就可以了

    useradd froad
  2. 安装Subversion1.7以上版本(当做客户端给root用户使用)
    。其实有用的就是bin/svn这个程序而已。如果你安装了Subversion edge 直接把bin和lib目录拷贝过来就行了。为什么要用1.7以上的?因为1.7后.svn目录只有一个了。我嫌以前的版本.svn目录太多了,烦!提供个解压即可用的svn(从subversion edge中拷贝出来的) 点我去下载

  3. 远程Subversion的一些准备工作
    如果你喜欢可以创建一个新的库和用户,如果你不like,随便你!

  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

转载于:https://blog.51cto.com/5404542/1744218

Jenkins进阶系列之——07Jenkins纳入版本控制相关推荐

  1. Jenkins进阶系列之——08Jenkins纳入版本控制

    2014-07-25:更新shell脚本 2014-06-05:更新shell脚本 2014-01-09:更新shell脚本,修改Jenkins文件删除后不能自动从版本控制删除的bug 是不是有过这种 ...

  2. Jenkins进阶系列之——07更改Jenkins的主目录

    Jenkins进阶系列之--07更改Jenkins的主目录 参考链接: https://blog.csdn.net/pansaky/article/details/80749567 Jenkins默认 ...

  3. Jenkins进阶系列之——06FTP publisher plugin插件下载(支持绝对路径)

    Je Jenkins进阶系列之--06FTP publisher plugin插件下载(支持绝对路径) 注意:绝对路径用/开头 绝对路径:/root/.jenkins/jobs/test/worksp ...

  4. Jenkins进阶系列之——03parameterized-trigger插件

    2014-12-08:已不再担任SCM和CI的职位,Jenkins系列的文章如无必要不会再维护. 说明:这个插件可以根据已经完成构建的结果,触发新Job或者传递参数. 官方说明:Parameteriz ...

  5. Jenkins进阶系列之——01使用email-ext替换Jenkins的默认邮件通知

    1 简述 众所周知,Jenkins默认提供了一个邮件通知,能在构建失败.构建不稳定等状态后发送邮件.但是它本身有很多局限性,比如它的邮件通知无法提供详细的邮件内容.无法定义发送邮件的格式.无法定义灵活 ...

  6. Jenkins进阶系列之---下载安装

    1. Jenkins下载&安装 Jenkins下载地址: https://jenkins.io/download/ 建议下载LTS版本,Weekly版本每周都会更新 ,更新频率太快. 1.1 ...

  7. Jenkins进阶系列之——04Publish Over FTP Plugin插件

    说明:这个插件可以将构建的产物(例如:Jar)发布到FTP中去. 官方说明:Publish Over FTP Plugin 安装步骤: 系统管理→管理插件→可选插件→Artifact Uploader ...

  8. 【全栈接口测试进阶系列教程】入门到入职的jmeter接口测试工具实战,接口测试步骤,正则表达式jsonpath,断言,接口加密,beanshell,jdbc,jmeter+ant+jenkins

    目录 [本文简介看之前请详细的看完介绍] 本文是全网首发的[全栈接口测试进阶系列教程]jmeter接口测试工具从入门到入职, 接口系列包含 接口测试系列包含所有的接口测试工具入门到入职,如果你喜欢的话 ...

  9. malloc开辟的空间在哪一个区间_C++进阶系列之STL(2)SGI版本空间配置器

    1.STL中的空间配置器在STL中,空间配置器分了2组,分别为一级空间配置器和二级空间配置器,但是它们都有自己各自运用的场合:一般说来,一级空间配置器一般分配的空间大于128B,二级空间配置器的分配空 ...

最新文章

  1. Windows中的一个类似路由器命令的命令
  2. python中plot的plt.text_用Python进行数据可视化的第一步,全面详解matplotlib中样式属性...
  3. 实施文档_Word 2010文档处理案例教程
  4. if test 多条件_if函数进阶篇 嵌套+多条件判断
  5. Android实现圆角照片和圆形照片
  6. 1001.双系统互联的坑
  7. 解决“Automation 服务器不能创建对象”的问题!
  8. 果粉们要的才不是事后歉意
  9. RabbitMQ入门-Topic模式
  10. oracle用中文linux,linux+oracle中文乱码
  11. 一种实现 Java调用C++的DLL的方法
  12. Python]网络爬虫
  13. 用户启动计算机并登录win7,win7电脑设置开机登录界面的方法?
  14. matlab 非线性动力系统 极限环,非线性动力系统混沌运动的Matlab数值模拟.doc
  15. 董明珠还能任性么?美的和小米如今都彻底击败了格力
  16. GDOI2016模拟8.19数学
  17. leetcode(Array)---11,盛最多水的容器
  18. Excel—PAPAYA电脑教室
  19. 生成特定分贝的音频波形
  20. 从程序员到项目经理(十二):如何管理自己的时间(上)

热门文章

  1. 【转】在 2016 年做 PHP 开发是一种什么样的体验?(一)
  2. 运用Loadrunner测试Mysql数据库性能
  3. MySQL密码忘记,怎么办?
  4. 《不要做浮躁的嵌入式工程师》观后感
  5. 《qos》一书受到读者好评
  6. iPhone开发内存管理
  7. eclipse 集成svn客户端_TortoiseSVN及Eclipse的svn插件安装使用
  8. 【毕业设计】《数据库原理及应用技术》课程指导平台的开发
  9. python 复制文件并重命名_潘石屹都开始学Python了,你还有什么理由放弃?
  10. 浏览器向服务器发送的消息称为,网络是怎样连接之浏览器的探索之旅读书笔记(一)...