小伙伴在《这些年我们一起搞过的持续集成~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 http://vm10686.global.test.net: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. 这里着重讲一下我们遇到的天坑,单引号,双引号再顺便提一下反引号和反斜杠。[转自互联网]
1. 单引号( '' )
# grep Susan phonebook
Susan Goldberg 403-212-4921
Susan Topple 212-234-2343
如果我们想查找的是SusanGoldberg,不能直接使用grep Susan Goldberg phonebook命令,grep会把Goldberg和phonebook当作需要搜索的文件
# grep 'Susan Gold' phonebook
Susan Goldberg 403-212-4921
当shell碰到第一个单引号时,它忽略掉其后直到右引号的所有特殊字符