最近项目组想基于hudson(现在改名jenkins了,但是我还是喜欢hudson这个名字)开发一套Auto UT的工具,可以通过命令行指令来对hudson上的UT jobs进行操作。本想借鉴一下UK那边项目组开发的hudson的perl包,但是其内部实现太过复杂,很多功能我们都用不上,于是只能自己琢磨了。后来在https://wiki.jenkins-ci.org/display/JENKINS/Bash+Job+Clone+script里发现这个基于curl开发的bash能很方便的实现了我的想法。

        curl这里我就不做介绍了,大家可以百度百科里搜一下,那里讲的很好。我就以Bash Job Clone script的内容结合自己的实践来讲下。


CURL="curl --user $USERNAME:$PASSWORD -s "
-u/--user 

设置用户名和密码

-s/--silent 

安静模式。不显示进度表或错误信息。


# check for existing job
`$CURL -f -o /dev/null $TO_CONFIG_URL`
if [ $? -eq 0 ]; then
        echo "WARN: $TO_PROJECT already exists on the hudson server. No action taken."
        continue
fi

-f/--fail

( HTTP )服务器出错时屏蔽错误信息(无任何输出)。这样做以便更好的支持脚本等能更好的处理失败的尝试。在正常情况下当一个HTTP服务器无法提供文档时,它将返回一个解释其原因的HTML文件 。此标志将防止curl输出此文档,并返回错误22 。

# download the config.xml for the job, continue if it doesn't exist
`$CURL -o $FROM_CONFIG_XML $FROM_CONFIG_URL`
grep "Error 404" "$FROM_CONFIG_XML" > /dev/null
if [ $? -eq 0 ]; then
        echo "FAIL: $FROM_CONFIG_URL is not a valid project url"
        continue
fi

-o/--output<文件>

将获取的远程文件输出到文件中,而不是输出到屏幕上(stdout)。如果您使用{}或[]定义了批量获取文件,则您可以在<文件>选项中用#后跟随数字的格式来定义文件名。这样实际文件名中的#将被多个URL中的当前字符串代替。如:

curl  http://{one,two}.site.com -o "file_#1.txt"        则输出file_one和file_two文件

或使用多个变量如:

curl  http://{site,host}.host[1-5].com -o "#1_#2"             #1将被"site"或"host"代替,#2将被1-5之间的数字代替

您处理多少条URL就可以使用多少次该选项。

# create a new job based on the existing job
`$CURL -o /dev/null --data " " "$HUDSON_URL/createItem?name=${TO_PROJECT}&mode=copy&from=${FROM_PROJECT}"`
 
# upload new job data
`$CURL -o /dev/null --data "@$TO_CONFIG_XML" "$HUDSON_URL/job/$TO_PROJECT/config.xml"`
 
# enable the job, there seems to be a bug where we need to first disable and then enable
`$CURL -o /dev/null --data disable "$HUDSON_URL/job/$TO_PROJECT/disable"`
`$CURL -o /dev/null --data enable "$HUDSON_URL/job/$TO_PROJECT/enable"`

-d/--data <数据>

( HTTP )将特定数据POST到服务器,与在浏览器中用户填写表单并按提交按钮的效果一样。

如果您的数据以字符@开头,其余的部分应当是一个用来读取数据的文件名,或者您想要cURL从标准输入(stdin)读取数据。该文件的内容必须是经过URL编码的。也可指定多个文件。比如要post文件foobar,那么格式是--data@foobar 。


           好了,curl的用法,以上这么多对我的需求来说够用了。这时候应该有人要问了,像$HUDSON_URL/job/$TO_PROJECT/disable这串网址是如何获取?这里我们需要借助firebug来获取。

        我以create new job这个操作来讲下,怎么获取表单项。

        首先,我们在hudson上手动创建一个job, New Job  --> 输入Job name --> 选择Copy existing job,点击OK后,观察firebug

       

       

        根据以上信息,我们可以看到浏览器是如何提交表单的,那么curl就该这么写

curl -u username:passwd -s  -o /dev/null -d createItem -d name=ACEFEI -d mode=copy -d from=CloneJob "http://135.251.123.221:8080/view/All/createItem"

       其中

       -d createItem 是根据firebug中URL里POST createItem所得。

       -d name=ACEFEI -d mode=copy -d from=CloneJob根据Post选项里json{“name”: “ACEFEI”, "mode": "copy", "from": "CloneJob"}所得。

       最后的网址是根据响应选项里Reload the page to get source for:http://135.251.123.221:8080/view/All/createItem所得(或者把鼠标移到POST createItem也可以显示网址)。


       以此类推,我们也可以写出delete job等操作。

curl -u user:passwd -s  -o /dev/null -d doDelete "http://135.86.206.146:8080/job/acefei/doDelete"

      


       




Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐