使用curl和crumb触发参数化构建

Jam*_*esE 26 curl jenkins

我在SO上看过类似的帖子,但并不完全是我想要做的(或者至少没有完整的命令来运行).

我试图使用curl远程触发Jenkins上的参数化构建.我启用了"防止跨站点请求伪造",因此我还需要传递有效的碎屑.

我的脚本如下:

#!/bin/bash

json="{\"parameter\": [{ \"P1\": \"param1\", \"P2\": \"param2\", \"P3\": \"param3\" }]}"
crumb=`curl "http://SERVER/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,%22:%22,//crumb)"`

curl -v -H $crumb -X POST http://SERVER/job/JOB_NAME/buildWithParameters -d token=runme --data-urlencode json="$json"
Run Code Online (Sandbox Code Playgroud)

我也尝试修改我传递给以下任何一个的URL:

USERNAME:APITOKEN@SERVER
Run Code Online (Sandbox Code Playgroud)

USERNAME:PASSWORD@SERVER
Run Code Online (Sandbox Code Playgroud)

卷曲的输出是:

* About to connect() to SERVER port 8080 (#0)
*   Trying SERVER... connected
* Connected to SERVER (SERVER) port 8080 (#0)
* Server auth using Basic with user 'USERNAME'
> POST /job/JOB_NAME/buildWithParameters HTTP/1.1
> Authorization: Basic bjAwNjY5MjI6YWxLaW5kaTg=
> User-Agent: curl/7.19.7 (x86_64-redhat-linux-gnu) libcurl/7.19.7 NSS/3.13.1.0 zlib/1.2.3 libidn/1.18 libssh2/1.2.2
> Host: SERVER:8080
> Accept: */*
> .crumb:776eb589e8b930d9f06cfc2df885314c
> Content-Length: 168
> Content-Type: application/x-www-form-urlencoded
>
< HTTP/1.1 403 No valid crumb was included in the request
< Content-Type: text/html;charset=ISO-8859-1
< Cache-Control: must-revalidate,no-cache,no-store
< Content-Length: 1469
< Server: Jetty(8.y.z-SNAPSHOT)
<
Run Code Online (Sandbox Code Playgroud)

所以看起来我没有正确地传递碎屑,但我不确定该命令的正确格式应该是什么.

dec*_*ijo 32

什么对我有用:

SERVER=http://localhost:8080
CRUMB=$(curl --user $USER:$APITOKEN \
    $SERVER/crumbIssuer/api/xml?xpath=concat\(//crumbRequestField,%22:%22,//crumb\))

curl --user $USER:$APITOKEN -H "$CRUMB" -d "script=$GROOVYSCRIPT" $SERVER/script
Run Code Online (Sandbox Code Playgroud)


Jam*_*esE 20

格式正确如下:

curl -H ".crumb:xxxxxxxxxxxxxxxxxxxxxx"
Run Code Online (Sandbox Code Playgroud)

  • 截至2017年2月,在Windows中使用Jenkins 2.32.1,请求标头密钥是**而不是**..""",而是"Jenkins-Crumb".请务必先检查一下.最安全的选择是从`/ crumbIssuer/api/xml`请求crumb并从`crumbRequestField`获取它 (7认同)
  • 好吧,想出了我的问题:如果你使用用户名生成crumb(根据Jenkins安全性的配置方式可能需要),任何进一步的请求也必须包含这些凭据,反之亦然.不知怎的,我错过了这个. (4认同)
  • 请注意,如果你从一个不同的"浏览器"(例如wget)或者像localhost这样的不同网址通过directip/dns/etc获取crumb,那么crumb会有所不同,所以不要指望通过wget从某些东西中获取碎屑然后在卷曲. (3认同)

See*_*ker 11

这对我有用:

获得屑 $ wget -q --auth-no-challenge --user yourUserName --password yourPassword--output-document - 'http://myJenkins:8080/crumbIssuer/api/xml?xpath=concat(//crumbRequestField,":",//crumb)"

现在运行Jenkins Job $curl -I -X POST http://yourUserName:yourPassword@myJenkins:8080/job/JOBName/build -H "Jenkins-Crumb:44e7038af70da95a47403c3bed5q10f8"

HTTP/1.1 201创建日期:2017年7月28日星期五09:15:45 GMT X-Content-Type-Options:nosniff位置:http:// myJenkins:8080/queue/item/17 / Content-Length:0