Winse Blog

走走停停, 熙熙攘攘, 忙忙碌碌, 不知何畏.

命令行调用Jenkins2.63打包

Jenkins给集成打包带来了很多的便捷,让不懂开发的同事也能轻松的打包。但是对于开发和运维来说,可能还需要在打包之外做一些事情,以及批量的处理N个打包。

对于研发来说,重复是最难忍受的。Jenkins可以直接通过api来调用查看和处理各种请求。

网络上资料其实挺多的。也有直接一个脚本直接搞定部署的。知其然知其所以然,还是需要自己下功夫理解人家的脚本这样才能更好的用(先不说自己写了)。主要的就是三个步骤:

  1. 怎么登陆: JenkinsScriptConsole-Remoteaccess .|. RemoteaccessAPI-CSRFProtection
  2. 执行build:Running jenkins jobs via command line .|. Triggering Jenkins builds by URL
  3. 检查结果:checkJenkins.sh

crumb

首先来看看crumb是啥

1
2
3
4
5
6
7
8
9
10
11
12
[root@iZ9416vn227Z opt]# curl -X POST $JENKINS_PROJ_AUTH_URL/build
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Error 403 No valid crumb was included in the request</title>
</head>
<body><h2>HTTP ERROR 403</h2>
<p>Problem accessing /job/helloworld/build. Reason:
<pre>    No valid crumb was included in the request</pre></p><hr><a href="http://eclipse.org/jetty">Powered by Jetty:// 9.4.z-SNAPSHOT</a><hr/>

</body>
</html>

这里CSRF 相当于jenkins做的一个权限控制,有两种方式处理:

方法一:取消控制

在菜单 系统管理 –> Configure Global Security 中调整设置: 取消 防止跨站点请求伪造(Prevent Cross Site Request Forgery exploits) 的勾选。 如果还坚持要启用“防止跨站点请求伪造”,就需要先动态获取crumb。

方法二:获取token

通过URL: crumbIssuer/api/json 获取token的键值,然后把它附加到build请求的HEADER。

命令行通过URL请求jenkins进行编译

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

JENKINS_ID="admin:PASSWORD"
JENKINS_PROJ_AUTH_URL=http://$JENKINS_ID@localhost:18080/job/helloworld
JENKINS_PROJ_URL=http://localhost:18080/job/helloworld

curl $JENKINS_PROJ_AUTH_URL/lastBuild/api/json

#Get the current configuration and save it locally
curl -X GET $JENKINS_PROJ_URL/config.xml

curl 'http://'$JENKINS_ID'@localhost:18080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)'
Jenkins-Crumb:a4296173a91d900c11af07d932559fcd

curl -X POST -H "Jenkins-Crumb:a4296173a91d900c11af07d932559fcd"  $JENKINS_PROJ_AUTH_URL/build

curl -s $JENKINS_PROJ_AUTH_URL/lastBuild/api/json | jq .

# --- TODO ---

progress(排队中)|pending(构建中),每三秒去重新获取结果进行判断  
while grep -qE "In progress|pending" build.tmp2;  

if grep -qE "Success" build.tmp2 ;then  
elif grep -qE "Unstable" build.tmp2 ;then  
elif grep -qE "Failed|Aborted" build.tmp2 ;then  
echo "#Open Link: ${jobPage}${newbuild}/console see details"  

BuildName

jenkins的使用案例

参考

API使用

登录/权限问题

–END

Comments