如何在尝试 post 构建触发器时缓解此问题 "Error 403 No valid crumb was included in the request"

How to mitigate this "Error 403 No valid crumb was included in the request" when trying to post a build trigger to perforce

根据 https://support.cloudbees.com/hc/en-us/articles/219152268-Use-POST-Commit-Hook-with-Perforce-Triggers 我必须使用以下内容来 post 构建一个触发器。

#!/bin/bash

# The first argument is the change number
CHANGE=

# POST the payload
curl --header 'Content-Type: application/json' \
     --request POST \ 
     --data "{\"change\":$CHANGE, \"p4port\":\"localhost:1666\"}" \
     http://localhost:8080/p4/change

我对它进行了一些修改以添加我的端口并更改号码,之后它开始给我提供找不到面包屑的问题。

读完这个 How to request for the crumb issuer for Jenkins and 我首先尝试禁用 CSRF,但这给了我一个 404,所以我尝试启用它,得到面包屑并像这样嵌入它,这又给了我一个 404。

curl -X POST http://username:password@jenkinsip:8080/p4/change -H "Jenkins-Crumb:the-crumb" --data "{\"change\":$CHANGE, \"p4port\":\"myport\"}"

但是如果我尝试这样做,我会再次遇到相同的 403 错误。

curl -X POST http://jenkinsip:8080/p4/change -H "Jenkins-Crumb:the-crumb" --data "{\"change\":$CHANGE, \"p4port\":\"myport\"}"

那么我做错了什么,它给我一个 404

在请求 Jenkins 触发基于您新的 perforce 更改的构建之前,您需要从 Jenkins 请求一个 crumb 并将响应包含在您的请求中。

以下触发脚本适用于我们:

#!/bin/bash
CHANGE=

P4PORT=<perforceserver>:<portnumber>
JUSER=<jenkinsuser>
JPASS=<hispassword>
JSERVER=https://<jenkinsserver>

# Get CRUMB
CRUMB=$(curl --insecure --silent --user $JUSER:$JPASS $JSERVER/crumbIssuer/api/xml?xpath=concat\(//crumbRequestField,%22":"%22,//crumb\))

curl --header "$CRUMB" \
     --request POST \
     --insecure \
     --silent \
     --user $JUSER:$JPASS \
     --data payload="{change:$CHANGE,p4port:\"$P4PORT\"}" \
     $JSERVER/p4/change

更新:
我刚刚发现我曾经从 Jenkins Perforce 插件的文档中窃取过上述脚本。参见 here