Jenkins实现持续集成中的那些坑

小伙伴在《这些年我们一起搞过的持续集成~Jenkins+Perland Shell script》中详细介绍了优化后的job流,接下来总结一下在构建这一套job中遇到的Shell Script和Jenkins的问题。

1.比较两个文件后有特殊字符< 会导致Jenkins job failure;

解决方法:过滤特殊字符<同时利用diff–b去除最后的错位行,更多diff使用请参考diff–help;

————-1)

[annzan@vm10226address]$ diff current.txt base.txt

1,2d0

<annzan

<wadexu

52c50

<davima

>davima

———–2)

[annzan@vm10226address]$ diff -b current.txt base.txt

1,2d0

<annzan

<wadexu

————-3)

[annzan@vm10226address]$ diff -b current.txt base.txt | grep "<"|sed ‘s/^<//g’

annzan

wadexu

2.awk按分隔符分段输出,例如 echo $PROJECT_LIST|awk –F “,”‘{print $1}’ 。 将PROJECT_LIST遍历输出,需要参数化输出段数,$$id肯定是不行的;

解决方法: echo $PROJECT_LIST|awk -v id=$id -F”,” ‘{print$id}’

这边之前也试过cut这个命令去分隔字符串, echo $PROJECT_LIST|cut -f $id -d “,” 但是这里有个问题,当PROJECT_LIST中没有,这个分隔符的时候,不论id是几结果都是本身。所以cut命令无法实现我们想要遍历所有project的初衷,除非强制PROJECT_LIST一定要有一个分隔符。

3.用curl命令调用下一个job大大提高了我们job流程的灵活机动性,同时用data json将参数值也一起传递到下一个job,实现我们整个流程的参数化。

curl -X POST –user "jadmin:71103407"-s :8080/view/Template/job/Template_Service_Commit_Auto_Build/build –data json='{"parameter":[{"name":"PROJECT_NAME","value":"’$projectName’"},{"name":"PIPELINE_NUM","value":"’$BUILD_NUMBER’"}]}’

注意: value后面双引号里面直接加值,如果是参数的话,需要在参数名外面加单引号。

4.这里着重讲一下我们遇到的天坑,单引号,双引号再顺便提一下反引号和反斜杠。[转自互联网]

# grep Susan phonebookSusan Goldberg 403-212-4921Susan Topple 212-234-2343# grep ‘Susan Gold’ phonebookSusan Goldberg 403-212-4921# x=*# echo $xhello.sh menus.sh misc.sh phonebook tshift.sh# echo ‘$x’$x# echo "$x"*,因为双引号中不做文件名替换,所以就把 shell;# echo The date and time is `date` 15 06:10:35CST 2005# echo Your current working directory is $(pwd)Your current working directory is/ home/annzan/testecho -e "\n"

5.由单双引号引发的血案还有很多,比如下面遇到的中括号,if后面加中括号,注意加空格,可是结果却总是不对:

整了半天发现还是双引号的问题,字符串比较需要把$test放在双引号里,或者在外面再加一个中括号:

6.grep和egrep的使用区别

1)grep [option] pattern filename注意:pattern如果是表达式或者超过两个单词的,需要用引号引用.可以是单引号也可双引号,区别是单引号无法引用变量而双引号可以.

2)egrep=grep-E可以使用基本的正则表达外,还可以用扩展表达式.注意区别.扩展表达式:+匹配一个或者多个先前的字符,至少一个先前字符.?匹配0个或者多个先前字符.a|b|c匹配a或b或c()字符组,如:love(able|ers)匹配loveable或lovers.(..)(..)\1\2模板匹配.\1代表前面第一个模板,\2代第二个括弧里面的模板.x{m,n}=x\{m,n\}x的字符数量在m到n个之间.

具体使用请参考grep –help; egrep — help

7.当参数名是参数时,取值用eval。 例如configfile中每个定义两个project的GIT_PROJECT_NAME,用projectname作为前缀:

PROA_GIT_PROJECT_NAME=git_proa

PROB_GIT_PROJECT_NAME=git_prob

当用project name作为参数时,$($PROJECT_NAME_GIT_PROJECT_NAME)是没有这种写法的,正确取值如下: GIT_PROJECT_NAME=${PROJECT_NAME}"_GIT_PROJECT_NAME"

GIT_PROJECT_NAME=$(eval echo\${$GIT_PROJECT_NAME})

8.大侠用perl语言写了打包安装等核心功能,需要执行这些脚本前,需要把脚本路径加到path里,要不然有核心代码也执行不了:

1)把路径添到PATH路径里面

cd ${SCRIPTS_HOME}

chmod 755 *

export PATH=$PATH:`pwd`

2)直接修改.bashrc文件

[annzan@vm10876~]$ vim .bashrc

生活中最基本的技巧是交流,最可依赖的品质是耐心,

Jenkins实现持续集成中的那些坑

相关文章:

你感兴趣的文章:

标签云: